Redis5.0.5版本在配置文件中配置maxmemory <bytes>设置内存可使用大小。若达到设定值,则使用以下8种淘汰策略(默认使用的策略为maxmemory-policy noeviction
):
1. volatile-lru
Evict using approximated LRU among the keys with an expire set.
从设置过期时间t t l的key集合中按近似最近最少使用算法驱逐。
2. allkeys-lru
Evict any key using approximated LRU.
在所有key中按近似最近最少使用算法驱逐。
3. volatile-lfu
Evict using approximated LFU among the keys with an expire set.
从设置过期时间t t l的key集合中按近似最少访问频率算法驱逐。
4. allkeys-lfu
Evict any key using approximated LFU.
在所有key中按近似最少访问频率算法驱逐。
5. volatile-random
Remove a random key among the ones with an expire set.
从设置过期时间t t l的key集合中随机移除。(不建议生产环境下使用)
6. allkeys-random
Remove a random key, any key.
在所有key中随机移除。(不建议生产环境下使用)
7. volatile-ttl
Remove the key with the nearest expire time (minor TTL)
移除距离过期时间(minor TTL)最近的key。
8. noeviction
Don't evict anything, just return an error on write operations.
不做任何调整,对于写操作返回错误(只能进行读操作)。
*PS1:
-
LRU:Least Recently Used
最近最少使用 -
LFU:Least Frequently Used
最少使用频率 -
Both LRU, LFU and volatile-ttl are implemented using approximated randomized algorithms.
LRU,LFU和volatile-ttl都是通过使用近似随机算法实现的。 -
with any of the above policies, Redis will return an error on write operations, when there are no suitable keys for eviction.
使用以上任何策略在可使用内存已满时进行写操作,当没有合适的keys被清除时,Redis将返回一个错误。 - 这些写操作包括以下命令:
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
*PS2:
Redis5.0.5配置文件redis.conf中第541-628行有详细介绍:
############################## MEMORY MANAGEMENT ################################
# Set a memory usage limit to the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).
#
# If Redis can't remove keys according to the policy, or if the policy is
# set to 'noeviction', Redis will start to reply with errors to commands
# that would use more memory, like SET, LPUSH, and so on, and will continue
# to reply to read-only commands like GET.
#
# This option is usually useful when using Redis as an LRU or LFU cache, or to
# set a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have replicas attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the replicas are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of replicas is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have replicas attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for replica
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes>
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones 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 evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
# Both LRU, LFU and volatile-ttl are implemented using approximated
# randomized algorithms.
#
# 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
#
# The default is:
#
# maxmemory-policy noeviction
# LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated
# algorithms (in order to save memory), so you can tune it for speed or
# accuracy. For default Redis will check five keys and pick the one that was
# used less recently, you can change the sample size using the following
# configuration directive.
#
# The default of 5 produces good enough results. 10 Approximates very closely
# true LRU but costs more CPU. 3 is faster but not very accurate.
#
# maxmemory-samples 5
# Starting from Redis 5, by default a replica will ignore its maxmemory setting
# (unless it is promoted to master after a failover or manually). It means
# that the eviction of keys will be just handled by the master, sending the
# DEL commands to the replica as keys evict in the master side.
#
# This behavior ensures that masters and replicas stay consistent, and is usually
# what you want, however if your replica is writable, or you want the replica to have
# a different memory setting, and you are sure all the writes performed to the
# replica are idempotent, then you may change this default (but be sure to understand
# what you are doing).
#
# Note that since the replica by default does not evict, it may end using more
# memory than the one set via maxmemory (there are certain buffers that may
# be larger on the replica, or data structures may sometimes take more memory and so
# forth). So make sure you monitor your replicas and make sure they have enough
# memory to never hit a real out-of-memory condition before the master hits
# the configured maxmemory setting.
#
# replica-ignore-maxmemory yes