服务器的内存是有限的,Redis的高性能、高并发主要是基于内存实现的。
一、缓存过期处理
对于设置过expire过期时间的key而言,有定时删除和惰性删除两种方式。expire过期时间一旦过了之后,虽然无法再查询(get)但是还是会占用内存。
1、(主动)定时删除
Redis会定时的抽查一些随机的key,默认1秒钟抽查10次(可配置),一旦抽查到某一个key是过期的,Redis就会删除这个key。
# 默认每秒钟10次,把这个设置的越大意味着占用的CPU也就越多。范围在1到500之间,但是超过100的值通常
# 不是好主意。大多数用户应该使用默认值10并将其提高到仅在需要非常低延迟的环境中。
hz 10
2、(被动)惰性删除
客户端在请求的时候,有可能会请求到一个已经过期的key,这种时候就是删除这个key的时候。用户在请求查询某一个key的时候,那么 redis 会检查这个 key 是否过期,如果过期则删除,返回一个 nil,这种策略对 CPU 比较友好,不会有太多的损耗,但缺点是过期的key无法及时删除。
二、内存淘汰机制
内存如果占满了,可以使用硬盘,但是没有意义,因为硬盘没有内存块,会严重影响 redis 的性能,所以,当内存占用满了之后,redis 提供了一套缓存淘汰机制,即 memory management
# 当内存已使用值达到 maxmemory,开始清理缓存
# 单位:bytes(字节),123000000Byte ≈ 117.3M
maxmemory 123000000
maxmemory-policy 缓存淘汰策略值枚举:
# volatile开头的策略针对设置了过期时间的key
# allkeys开头的策略针对内存中所有的key
# volatile-lru:在使用 expire 设置了过期时间的 key 中,删除最近最少使用的缓存,然后保存新的缓存
# allkeys-lru:删除最近最少使用的缓存,然后保存新的缓存(推荐使用)
# volatile-lfu:在使用 expire 设置了过期时间的 key 中,删除最不经常使用的缓存,然后保存新的缓存
# allkeys-lfu:删除最不经常使用的缓存,然后保存新的缓存(推荐使用)
# volatile-random:在使用 expire 设置了过期时间的 key 中,随机删除一个 key
# allkeys-random:在所有 key 中,随机删除一个 key
# volatile-ttl:在使用 expire 设置了过期时间的 key 中,删除最快要过期的 key,即删除 TTL 最小的 key
# noeviction:不删除任何数据,报出写操作异常(默认值)
如果没有设置maxmemory,将导致Redis在达到堆限制时以内存不足异常终止。
在设置了maxmemory之后,当内存使用达到maxmemory时,Redis将使用maxmemory-policy指定的策略对缓存进行删除。