进学阁

业精于勤荒于嬉,行成于思毁于随

0%

Redis内存优化

内存配置和查看

Redis最大内存配置建议

  • Redis默认占用的内存:在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB。
  • 在生产环境下,一般推荐设置为最大物理内存的四分之三。
  • 配置单位是字节Bytes,如果设置为maxmemory 0即代表内存无限制。 如何修改Redis的最大内存?
1
2
3
4
5
6
7
8
//方式一:修改redis.conf配置文件。需重启Redis
#maxmemory <bytes>
maxmemory 1
#MAXMEMORY POLICY: how Redis will select what to remove when maxmemory

//方式二:通过命令修改。无需重启Redis
config set maxmemory 1
config get maxmemory

查看内存占用情况

使用info memory命令

过期键的删除策略

Redis处理过期Key有两种删除策略:被动方式、主动方式。参考:Redis的过期删除策略

被动方式:惰性删除

描述:数据到达过期时间后不做处理,等下次访问该数据时,如果未过期则返回数据,如果发现已过期则删除,返回不存在。

优点:对于CPU来讲是友好的,不需要随时去遍历哪些Key已经过期了。

缺点:它对内存是最不友好的。如果一个键已经过期,而这个键又仍然保留在redis中,那么只要这个过期键不被删除,它所占用的内存就不会释放。在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看作是一种内存泄漏,即无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不是一个好消息。

主动方式:立即删除

描述:立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。

缺点:立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力。

主动方式:定期删除

描述:定期删除策略是每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。redis默认每隔100ms检查,是否有过期的key,有过期key则删除。注意:redis不是每隔100ms将所有的key检查一次而是随机抽取进行检查。

策略细化:周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度:

特点1:CPU性能占用设置有峰值,检测频度可自定义设置

特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理

总结:周期性抽查存储空间 (随机抽查,重点抽查)

难点:如何确定删除操作执行的时长和频率?

如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成立即删除策略,以至于将CPU时间过多地消耗在删除过期键上面。如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除束略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。

缓存淘汰策略

缓存的淘汰策略:https://www.redis.io/topics/lru-cache

问题背景

Redis的键在过期后会有综合策略将其淘汰出内存,但是问题出现了:如果用户所有的key都没有配置过期时间,或者有配置过期时间,Redis在使用删除策略时,部分键总是没有能淘汰出内存,这时候就会出现大量Key堆积到内存甚至OOM的情况。而缓存的淘汰就是解决的该个问题。

缓存淘汰策略有哪些(6.0.8版本下)

  • noeviction(默认但严禁使用):不会del掉任务key。默认情况下的配置,生产环境下严禁使用。
  • allkeys-lru(推荐):通过首先尝试删除最近较少使用的(LRU)键来驱逐键,以便为添加的新数据腾出空间。
  • volatile-lru:通过首先尝试删除最近较少使用的(LRU)密钥来驱逐密钥,但仅在具有过期集的密钥中,以便为添加的新数据腾出空间。
  • allkeys-random:随机驱逐键,以便为添加的新数据腾出空间。
  • volatile-random:随机逐出键,以便为添加的新数据腾出空间,但仅逐出带有expire set的键。
  • volatile-ttl:驱逐设置了 expire的键,并尝试首先驱逐具有较短生存时间(TTL)的密钥,以便为添加的新数据腾出空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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.
# The default is: maxmemory-policy noeviction

# 将缓存策略更改为所有键使用LRU淘汰。LRU算法为:最近最少使用的淘汰。
maxmemory-policy allkeys-lru