关注我,升职加薪就是你!
Redis的持久化我们用的挺多,但是对于它的优化,你了解过多少?趁着公司项目空档期,今天就和大家探讨一下Redis其中的一个优化项----数据淘汰策略。
1、什么是数据淘汰策略?
当达到maxmemory值(即Redis的最大可使用内存)时,Redis会根据某个策略去删除key。这个策略就是数据淘汰策略,它也叫过期策略。
2、为什么要做数据淘汰?
根据官网所述,不要使用超过指定字节数的内存。当达到最大可使用内存限制,Redis会根据设定的过期策略尝试删除key。如果Redis不能根据所设定的过期策略删除这些key,或者如果策略被设为‘noeviction’,Redis会开始对使用更多内存的命令(如set、lpush等等)返回错误,并继续回复只读命令(如get)。当使用Redis作为LRU缓存,或者为实例设置硬内存限制(使用noeviction策略),这个选项是有用的。有的小伙伴要开始问了,既然使用超过指定字节数的内存(即超过maxmemory的值)会报错,那我不给maxmemory设置值不就行了?答案肯定是不可以的。根据官方文档所述,不设置最大可使用内存值,如果达到堆限制,会导致Redis终止,并且会发生内存溢出。至于给maxmemory设置多大的值,就要看你们公司具体的业务需求了。但是要注意,默认情况下,redis会占用可用的所有内存,所以如果只是使用Redis做缓存,就不应设置过大。并且当设置了maxmemory的值,一定要设置过期策略,否则报发生报错。
值得了解的是,Redis是使用系统分页文件分配堆内存的。
3、数据淘汰策略有哪些?
数据淘汰策略一个有6种:
我们且看官网的介绍:
# 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
(1)volatile-lru:使用LRU算法删除带有过期集的key。
(2)allkeys-lru:根据LRU算法删除所有的key。
(3)volatile-random:删除一个带有过期集的随机key。
(4)allkeys-random:删除一个随机key、任意key。
(5)volatile-ttl:删除有最近的过期时间的key(次要TTL)
(6)noeviction:根本不过期,在写操作时只返回错误。
过期策略默认是noeviction。
值得注意的是:对上述的所有策略,当没有合适的key被淘汰时,Redis会在进行写操作时报错。
有的小伙伴又要问了。什么是LRU算法?LRU是Least Recently Used的缩写,即最近最少被使用算法。
TTL算法是Time To Life的缩写,即生存时间算法。
4、应该选择哪种数据淘汰策略?
至于选择哪种数据淘汰策略,这就要看公司项目的具体业务了。
一般情况下:
(1)如果分为冷数据和热数据,推荐使用allkeys-lru策略。也就是, 其中一部分key经常被读写. 如果不确定具体的业务特征, 那么 allkeys-lru 是一个很好的选择。
(2)如果需要循环读写所有的key, 或者各个key的访问频率差不多, 可以使用 allkeys-random 策略, 即读写所有元素的概率差不多。
(3)假如要让 Redis 根据 TTL 来筛选需要删除的key, 请使用 volatile-ttl 策略。
(4)volatile-lru 和 volatile-random 策略主要应用场景是: 既有缓存,又有持久key的实例中。一般来说, 像这类场景, 应该使用两个单独的 Redis 实例。
(5)值得一提的是, 设置 expire 会消耗额外的内存, 所以使用 allkeys-lru 策略, 可以更高效地利用内存, 因为这样就可以不再设置过期时间了
好了,今天就写这么多吧。
关注我,升职加薪就是你!