redis提供6种数据淘汰策略
淘汰策略的原因
在 redis 中,允许⽤户设置最⼤使⽤内存⼤⼩ server.maxmemory,在内存限定的情况下是很有⽤的。譬如,在⼀台 8G 机⼦上部署了 4 个redis 服务点,每⼀个服务点分配 1.5G 的内存⼤⼩,减少内存紧张的情况,由此获取更为稳健的服务。
6中淘汰策略
redis 内存数据集⼤⼩上升到⼀定⼤⼩的时候,就会施⾏数据淘汰策略。redis 提供 6种数据淘汰策略:
volatile-lru:从设置了过期时间的数据集中,选择最近最久未使⽤的数据释放;
allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使⽤的数据释放;volatile-random:从设置了过期时间的数据集中,随机选择⼀个数据进⾏释放;
allkeys-random:从数据集中(包括了设置过期时间以及未设置过期时间)随机选择⼀个数据进⾏⼊释放;volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进⾏释放操作;
noeviction:不删除任意数据(但redis还会根据引⽤计数器进⾏释放),这时如果内存不够时,会直接返回错误。
记忆⽅式:
单词组成:3个volatile开头的,2个all_keys开头。都是lru,random,只有volatile有ttl⽅式。最后加⼀个noevictionvolatile:指的都是快过期的数据集。all_keys:是所有的数据集。
lrc:是选择最近长时间不使⽤的,⼀般⽤作缓存机制。random:就是随机选⼀个。ttl:就是过期时间的设置noeviction:不做任何设置
默认的内存策略是noeviction,在Redis中LRU算法是⼀个近似算法,默认情况下,Redis随机挑选5个键,并且从中选取⼀个最近最久未使⽤的key进⾏淘汰,在配置⽂件中可以通过maxmemory-samples的值来设置redis需要检查key的个数,但是检查的越多,耗费的时间也就越久,但是结构越精确(也就是Redis从内存中淘汰的对象未使⽤的时间也就越久~),设置多少,综合权衡。
⼀般来说,推荐使⽤的策略是volatile-lru,并辨识Redis中保存的数据的重要性。对于那些重要的,绝对不能丢弃的数据(如配置类数据等),应不设置有效期,这样Redis就永远不会淘汰这些数据。对于那些相对不是那么重要的,并且能够热加载的数据(⽐如缓存最近登录的⽤户信息,当在Redis中找不到时,程序会去DB中读取),可以设置上有效期,这样在内存不够时Redis就会淘汰这部分数据。
配置⽂件
# maxmemory # 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# The default is:
# maxmemory-policy noeviction
我们可以设置maxmemory ,当数据达到限定⼤⼩后,会选择配置的策略淘汰数据