bigkey优化

什么是bigkey
bigkey是指某个key的value太大,分成两种状况。

字符串类型:它的big体现在单个value值很大,个别认为超过10KB就是bigkey。比如说把文章正文甚至小说全文都缓存进redis了。

非字符串类型:哈希、列表、汇合、有序汇合,它们的big体现在元素个数太多。比方通过hash的形式来存储每一天用户订单次数。其中key = 日期,field = 用户id,value = 用户订单数。那么如果一天有上千万个用户下订单,那么field就会十分多,存储空间也很大,造成所谓的大key。

redis自身曾经提供了查找bigkey的命令。

bigkey的危害

读写bigkey可能会导致超时,而redis是单线程操作数据,重大的会导致阻塞整个redis服务。而且一个key只会被分片到一个节点,无奈摊派读写压力。

bigkey优化办法
对于string类型,应该防止存入过大的字符串,比方不要把文章正文放入redis之类的。
对于其余类型,应该尽量减少成员数,能够对元素汇合进行宰割。比方在hash的field过多的状况下,能够对field进行rehash,并且对1000取模,而后作为原key的后缀,生成1000个新的key,这些key还能够被分片到其余节点,摊派读写压力。

hotkey优化

hotkey的危害

hotkey就是访问量大的key,因为一个key只能被分片到一个节点,因而短时间集中拜访hotkey会压垮该redis节点,而接下来的申请会打到数据库上,压垮整个服务。

发现hotkey的办法

业务教训,比方明星、大V相干的key根本都是hotkey。
在redis的proxy层做统计,毛病是有的redis集群可能没有proxy。
redis自带命令,比方redis-cli –hotkeys命令,会扫描所有key来找出hotkey,毛病是当key比拟多时执行比较慢。
hotkey优化办法

优化的关键点在于加重hotkey所在节点的压力。

服务器本地缓存:服务器把hotkey缓存在内存中,当用户申请hotkey时不须要拜访redis,间接从内存查找、返回即可。
备份hotkey:在所有节点上都备份这个hotkey,各自加上一个序号后缀作为key,用户申请hotkey时随机生一个后缀数字,而后拜访对应的节点。而且某个节点的hotkey过期后能够不读数据库,而是读其余节点以重建缓存。
过期工夫:设置hotkey永不过期,或者设置每个hotkey的备份的过期工夫不同,这样能够避免集中过期导致大量申请打到数据库上。