前言
我们经常用redis来当缓存使用,既然是缓存,就有过期时间,否则就有可能数据更新不及时,造成脏数据的现象,本文我们来学习下redis的过期淘汰策略。
Redis的性能
Redis有两种使用场景,一种是作为DB(数据库)使用,一种是当做缓存使用。
关于Redis的性能,我们来看一下官方数据:
读:110000次/s
写:81000次/s
长期使用,key会不断增加,Redis作为缓存使用,物理内存也会满。
如果物理内存满了之后,内存就需要与硬盘交换(swap) ,就是需要我们常说的虚拟内存 ,频繁IO 会造成性能急剧下降。
为了防止Redis内存占用过多,导致服务器系统崩溃,通常我们需要设置一个内存参数maxmemory,这个参数在redis.conf文件中可以进行设置。
maxmemory可以设置,也可以不进行设置,这要看具体的场景。
不设置maxmemory的场景
有两种情况我们不需要设置maxmemory参数,一种是Redis中的key是固定的,另一种是Redis当做DB使用。
此种情况下我们设置的缓存淘汰策略是禁止驱逐(默认)
1. Redis中的key是固定的
如果我们实际的场景中Redis中的key是固定的,不会增加,那么就不需要设置maxmemory参数,因为不用担心内存不够的问题。
2. 当做DB使用
因为作为数据库,我们需要保证数据的完整性,不能淘汰。
为了存储更多数据,我们可以做Redis集群,横向扩展。
设置maxmemory的场景
当Redis作为缓存使用,并且key不断增加时,我们需要设置maxmemory。这种场景是比较常见的。
maxmemory 的默认值是0,也就是不限制。使用默认值会出现的问题是,当Redis达到物理内存之后性能会急剧下降,频繁IO,导致性能下降。
那么maxmemory设置多少合适呢?
看具体的业务,正常情况下在能够保证系统正常运行的情况下,剩下的内存的都可以设置Redis。
在redis.conf中进行如下配置(注意左边不能留有空格):
maxmemory 1024Mb
通过命令获取maxmemory的值:
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "1073741824"
当我们设置maxmemory了之后,当趋近maxmemory时,Redis会通过缓存淘汰策略,从内存中删除对象。
expire命令详解
expire命令的作用是可以设置一个键的存活时间(ttl: time to live),过了这段时间,该键就会自动被删除
命令参数:expire key ttl(单位秒)
使用举例如下:
127.0.0.1:6379> expire name 2 #2秒失效
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name zhangfei
OK
127.0.0.1:6379> ttl name #永久有效
(integer) -1
127.0.0.1:6379> expire name 30 #30秒失效
(integer) 1
127.0.0.1:6379> ttl name #还有24秒失效
(integer) 24
127.0.0.1:6379> ttl name #失效
(integer) -2
expire原理
先来看下Redis中关于数据库结构体的定义: