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的备份的过期时间不同,这样可以防止集中过期导致大量请求打到数据库上。


杨帆
28 声望3 粉丝