bigkey优化
什么是bigkey
bigkey是指某个key的value太大,分成两种情况。
字符串类型:它的big体现在单个value值很大,一般认为超过10KB就是bigkey。比如说把文章正文甚至小说全文都缓存进redis了。
非字符串类型:哈希、列表、集合、有序集合,它们的big体现在元素个数太多。比如通过hash的方式来存储每一天用户订单次数。其中key = 日期,field = 用户id,value = https://www.it610.com/article/用户订单数。那么如果一天有上千万个用户下订单,那么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节点,而接下来的请求会打到数据库上,压垮整个服务。
【redis优化(bigkey、hotkey)】发现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的备份的过期时间不同,这样可以防止集中过期导致大量请求打到数据库上。
推荐阅读
- Redis|redis原理之布隆过滤器(Bloom Filter)
- redis安装与基本使用
- java|图解四种 IO 模型
- Redis|Redis性能解析--Redis为什么那么快()
- java|你跳一次涨多少(今天见识到跳槽天花板!!)
- java|送你一份大厂都这么解决Redis缓存问题,面试官必问!
- (免费领取红包封面)【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
- redis高可用(主从、哨兵、集群)
- 【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知