道友!啥是Redis的过期策略呢?

举报
左羊 发表于 2022/06/09 13:31:54 2022/06/09
【摘要】 仙元2020年,鸿蒙初开,天地间一片IT的盛况,在神秘东方古国的盛京城内发生了如下的一番对话..... 迷糊道人:道友,为什么我写入Redis的数据,过一段时间就消失了?左羊:道友,你问这个问题就说明,Redis你还没有没有参悟透啊!你说的这个问题有两情况会造成,一种是设置过期时间“set ket value 过期时间”。当然我相信道友不会犯这种错误的。那么就是下面这种情况了,首先你因该知道...
仙元2020年,鸿蒙初开,天地间一片IT的盛况,在神秘东方古国的盛京城内发生了如下的一番对话.....
 
迷糊道人:道友,为什么我写入Redis的数据,过一段时间就消失了?
左羊:道友,你问这个问题就说明,Redis你还没有没有参悟透啊!你说的这个问题有两情况会造成,一种是设置过期时间“set ket value 过期时间”。当然我相信道友不会犯这种错误的。那么就是下面这种情况了,首先你因该知道Redis是缓存型数据库,所以数据是不会永久存储的,比如你的Redis只能使用1GB的内存资源,这时你向Redis插入1.5GB的数据,Redis会怎么办呢?道友!
迷糊道人:当然会删除一些数据了
左羊:那么会删除那些数据呢?留下那些数据呢
迷糊道人:这个~~~那个~~~,今天天气真不错啊!
左羊:呃!还是我来告诉你哈,当然是删除不经常访问的数据,保留经常访问的数据了。比如说A每秒钟被请求15次,B两个小时才被访问一次,你说Redis会Kill谁呢?
迷糊道人:受教了(拱手)
左羊:客气(作揖)
 
时过境迁,沧海桑田,百年转瞬即逝,左羊再次迎来同门论道~
嘚嗖仙子:左羊师兄,为啥我对存入Redis的数据设置了过期时间,时间到了我观察服务器装状态时发现内存并没有被释放呢?
左羊:这就要说下Redis的删除策略了,Redis针对过期删除有两种策略,一种是定期删除,一种是惰性删除。
定期删除:Redis默认每隔100瞬息(ms)会定期检测和删除一些key
嘚嗖仙子:打断一下哈!为啥是检测一部分key而不是所有呢?
左羊:呃!举个例吧,假如你的Redis中几十万的数据,而且都设置了过期时间,这时Redis每个100瞬息就会检测和删除所有设置了过期时间的数据,那你的CPU还不得走火入魔啊(CPU负载飙升),执法长老还不得炖了你啊!所以定期删除是每个100瞬息随机检测和删除数据哈!
嘚嗖仙子:哦哦!你继续说下啥是惰性删除吧
左羊:惰性删除就是Redis在定期删除过后还有一些设置了过期时间的数据没有被检测到的,这时你请求了这条数据,Redis检测了一下你请求的数据发现。嘿!这哥们还没被Kill哈,删了吧。此时设置了过期时间的数据就会被删除,就不会返回数据给你了。这就是惰性删除。
嘚嗖仙子:左羊师兄啊,那如果定期删除有大量过期的数据没有检测到,而且这个时间段我也没有请求这些数据,怎样?
左羊:当然内存占用飙升啊,你想哈,大量过期的数据积压在内存,而你还在源源不断的插入,当然内存占用会飙升了
嘚嗖仙子:那咋整啊?
左羊:设置maxmemory参数,内存淘汰策略,师妹啊你还是看下Redis的源码吧,这个我就简单的说下吧。

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# Note: with any of the above policies, Redis will return an error on write
#       operations, when there are no suitable keys for eviction.
#       At the date of writing these commands are: set setnx setex append
#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
#       getset mset msetnx exec sort
默认配置是:noeviction
# The default is:
# maxmemory-policy noeviction
volatile-lru
翻译:使用LRU算法删除具有过期集的密钥
个人理解:内存满了写不下新数据的时候,在所有设置过期时间的key中,
删除使用最少的key。
allkeys-lru
翻译:根据LRU算法删除任何密钥
个人理解:内存满了写不下新数据的时候,在所有key中,删除使用最少的key。
volatile-random
翻译:删除带有过期设置的随机密钥
个人理解:内存满了写不下新数据的时候,在所有设置过期时间的key中,
随机删除某个key。
allkeys-random
翻译:删除一个随机密钥,任何密钥
个人理解:内存满了写不下新数据的时候,在所有key中,随机删除某个key。
volatile-ttl
翻译:删除具有最近过期时间的密钥
个人理解:内存满了写不下新数据的时候,在所有设置过期时间的key中,
删除过期时间靠前的key。
noeviction
翻译:完全不过期,只是在写操作时返回一个错误
个人理解:内存满了写不下新数据的时候,完全不删除任何key,
只是在添加新数据时返回一个错误(蛋疼操作,墙裂不推荐哈!)
嘚嗖仙子:学到了,多谢左羊师兄了(作揖)
左羊:客气了(作揖)
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。