川石教育
全国咨询热线:136-9172-9932
  1. 首页 > 资讯与干货 > IT资讯

如何处理Redis集群中的Big key和Hot keys

作者:川石学院 日期:2021-06-11 11:25:27 点击数:

  本章主要给大家讲解关于“如何处理Redis集群中的Big key和Hot keys”的内容,相信这是软件测试工程师都会遇到的问题。小编给大家整理了出来,如有疑问可咨询在线老师,一对一解答。

  一、Redis客户端相关配置  

如何处理Redis集群中的Big key和Hot keys(图1)

  Redis安全相关配置  

如何处理Redis集群中的Big key和Hot keys(图2)

  Redis复制相关配置  

如何处理Redis集群中的Big key和Hot keys(图3)

       如何处理Redis集群中的Big key和Hot keys(图4)  

如何处理Redis集群中的Big key和Hot keys(图5)

  二、Big key和Hot keys

  查看Big key

  1.   [root@localhost bin]# redis-cli --bigkeys

  2.   # Scanning the entire keyspace to find biggest keys as well as

  3.   # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec

  4.   # per 100 SCAN commands (not usually needed).

  5.   [00.00%] Biggest string found so far 'counter:__rand_int__' with 5 bytes

  6.   [00.00%] Biggest string found so far 'test1' with 8 bytes

  7.   [00.00%] Biggest string found so far 'name' with 111 bytes

  8.   [00.00%] Biggest hash found so far 'bash_insert' with 1000 fields

  9.   [00.00%] Biggest list found so far 'mylist' with 20000 items

  10.   -------- summary -------

  11.   Sampled 10 keys in the keyspace!

  12.   Total key length in bytes is 87 (avg len 8.70)

  13.   Biggest string found 'name' has 111 bytes

  14.   Biggest list found 'mylist' has 20000 items

  15.   Biggest hash found 'bash_insert' has 1000 fields

  16.   6 strings with 135 bytes (60.00% of keys, avg size 22.50)

  17.   1 lists with 20000 items (10.00% of keys, avg size 20000.00)

  18.   0 sets with 0 members (00.00% of keys, avg size 0.00)

  19.   3 hashs with 1003 fields (30.00% of keys, avg size 334.33)

  20.   0 zsets with 0 members (00.00% of keys, avg size 0.00)

  21.   0 streams with 0 entries (00.00% of keys, avg size 0.00)

       bigkey带来的问题:

  1.内存空间不均匀

  在集群模式中,由于bigkey的存在,会造成主机节点的内存不均匀,这样会不利于集群对内存的统一管理,存在丢失数据的隐患。

  2.超时阻塞

  由于redis单线程的特性,操作bigkey通常比较耗时,也就意味着阻塞redis可能性越大,这样会造成客

  户端阻塞或者引起故障切换。慢查询通常就会有它们的身影。

  3.网络拥塞

  bigkey也就意味着每次获取要产生的网络流量较大。假设一个bigkey为1MB,客户端每秒访问量为

  1000,那么每秒产生1000MB的流量,对于普通的千兆网卡(按照字节算是128MB/s)的服务器来说简直是灭顶之灾。

  4.阻塞删除

  有个bigkey,对它设置了过期时间,当它过期后会被删除,如果使用Redis 4.0之前的版本,过期key是异步删除,就会存在阻塞redis的可能性,而且这个过期删除不会从慢查询发现(因为这个删除不是客户端产生的,是内部循环事件)。

  bigkey的产生主要是由于程序的设计不当所造成的,如以下几种常见的业务场景:

  社交类:粉丝列表,如果某些明星或者大v不精心设计下,必是bigkey。

  统计类:例如按天存储某项功能或者网站的用户集合,除非没几个人用,否则必是bigkey。

  缓存类:将数据从数据库load出来序列化放到redis里,这个方式经常常用,但有两个地方需要注意:第一,是不是有必要把所有字段都缓存;第二,有没有相关关联的数据。

  优化 bigkey

  优化big key的原则就是string减少字符串长度,list、hash、set、zset等减少成员数;string长度大于10K,list长度大于10240认为是big bigkeys。

       1.拆分

  如果对象是整存争取,将对象拆分后才能多个小key-value,get不同的key或者批量获取stringRedisTemplate.opsForValue() .multiGet(keyList)

  如果对象是部分更新获取数据,可以分拆成几个key-value,也可以存储在hash中,部分更新部分存取!

  2.本地缓存

  减少访问redis次数,降低危害减少访问redis次数,降低危害! 当然本地开销也会变大!

  Redis 4.0.3中新增查看热点数据命令行,使用热点数据必须将内存策略修改为LFU算法。

  查看内存策略

  config get maxmemory-policy

  > config get maxmemory-policy

  maxmemory-policy

  allkeys-lfu

  查看 key 使用频率

  object freq name

  > object freq name

  1

  如果在查看key使用频率或查看hot key时出现以下错误,那就必须先修改LFU算法

  (error) ERR An LFU maxmemory policy is not selected, access frequency not

  tracked. Please note that when switching between policies at runtime LRU and

  LFU data will take some time to adjust.

  Least Frequently Used:最不经常使用。

  Redis有两种LFU算法:

  volatile-lfu:设置了过期时间的key中,进行LFU淘汰。

  allkeys-lfu:所有key参与LFU淘汰。

  更改内存策略

  config set maxmemory-1 policy allkeys-lfu

  查看热点数据

  统计时间隔0.1秒,防止阻塞其他线程。

  1.        redis-cli --hotkeys -i 0.1

  2.   [root@localhost bin]# redis-cli --hotkeys -i 0.1

  3.   # Scanning the entire keyspace to find hot keys as well as

  4.   # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec

  5.   # per 100 SCAN commands (not usually needed).

  6.   [00.00%] Hot key 'counter:__rand_int__' found so far with counter 1

  7.   [00.00%] Hot key 'test1' found so far with counter 1

  8.   [00.00%] Hot key 'key:__rand_int__' found so far with counter 1

  9.   [00.00%] Hot key 'test' found so far with counter 1

  10.   [00.00%] Hot key 'name' found so far with counter 1

  11.   [00.00%] Hot key 'bash_insert' found so far with counter 1

  12.   [00.00%] Hot key 'mylist' found so far with counter 1

  13.   [00.00%] Hot key 'v' found so far with counter 1

  14.   [00.00%] Hot key 'ht' found so far with counter 1

  15.   [00.00%] Hot key 'myset:__rand_int__' found so far with counter 1

  16.   -------- summary -------

  17.   Sampled 10 keys in the keyspace!

  18.   hot key found with counter: 1 keyname: counter:__rand_int__

  19.   hot key found with counter: 1 keyname: test1

  20.   hot key found with counter: 1 keyname: key:__rand_int__

  21.   hot key found with counter: 1 keyname: test

  22.   hot key found with counter: 1 keyname: name

  23.   hot key found with counter: 1 keyname: bash_insert

  24.   hot key found with counter: 1 keyname: mylist

  25.   hot key found with counter: 1 keyname: v

  26.   hot key found with counter: 1 keyname: ht

  27.   hot key found with counter: 1 keyname: myset:__rand_int__

  今天关于“如何处理Redis集群中的Big key和Hot keys”的内容就分享完了,大家喜欢的话记得每天来这里学习涨薪技能哦。(笔芯)

  附:川石信息全国校区最新开班时间,课程资料获取13691729932(微信同号)。  

如何处理Redis集群中的Big key和Hot keys(图6)


相关文章
  • 亚马逊运营成功转行软件测试,薪资13K表示很满意!2021-06-11 11:25:27
  • 西安川石的兰朋友喊你来当他的学弟学妹啦!2021-06-11 11:25:27
  • 国外的月亮也不一定比国内测试猿的年薪美~2021-06-11 11:25:27
  • 建筑工程专业朱同学成功转行为软件测试人!2021-06-11 11:25:27
  • 财务管理专业转行软件测试月薪甩会计几条街!2021-06-11 11:25:27
  • 只有技术沉淀才能成功上岸,深圳就业薪资13K!2021-06-11 11:25:27
  • 薪资11K!实现自我价值,从掌握一门IT技术开始...2021-06-11 11:25:27
  • 文科生转行软件测试照样拿下高薪15K!2021-06-11 11:25:27
  • 恭喜罗同学喜提19.5K,成功入行软件测试!2021-06-11 11:25:27
  • 毕业1年,迷茫的他最终选择转行软件测试2021-06-11 11:25:27