Redis设置key过期以及删除过期key的策略

Redis有以下几个命令用于设置key的过期时间:

expire <key> <seconds>:给key设置以秒为单位的过期时间
pexpire <key> <milliseconds>:给key设置以毫秒为单位的过期时间
expireat <key> <timestamp_in_seconds>:指定一个以秒为单位的时间戳,当到达此时间时,key过期
pexpireat <key> <timestamp_in_milliseconds>:指定一个以毫秒为单位的时间戳,当到达此时间时,key过期
setex <key> <seconds> <value> : 设置key的同时,给key添加过期时间,单位为秒

查看过期时间的命令

ttl <key> : 查看Key的过期时间(秒数),用不过期返回(integer) -1,Key不存在返回(integer) -2
pttl <key>:同ttl,返回毫秒数

示例:

127.0.0.1:6379> set a test
OK
127.0.0.1:6379> EXPIRE a 5
(integer) 1
127.0.0.1:6379 > get a // distance setup lifetime command executed in 5 seconds
"test"
127.0.0.1:6379 > get a // distance setup lifetime command executed after 5 seconds
(nil)
127.0.0.1:6379> set b 12
OK
127.0.0.1:6379> EXPIREAT b 1545569500
(integer) 1
127.0.0.1:6379> time
1) "1545569486"
2) "108616"
127.0.0.1:6379> get b//distance setting 1545569500 specified seconds timestamp execution
"12"
127.0.0.1:6379> time
1) "1545569506"
2) "208567"
127.0.0.1:6379 > get B // distance setting 1545569500 specified seconds timestamp to execute
(nil)

取消key的过期时间的设置

persist < key >:用于取消对key设置的过期时间
127.0.0.1:6379> EXPIRE c 1000
(integer) 1
127.0.0.1:6379 > TTL C // expiration time
(integer) 9996
127.0.0.1:6379> PERSIST c
(integer) 1
127.0.0.1:6379 > TTL C // no expiration time
(integer) -1
PS: TTL is the unit of seconds, the remaining survival time of the return key; similarly, the pttl command is the unit of milliseconds, the remaining survival time of the return key

删除过期key的策略

1、定时删除

在设置key的到期时间时,创建一个定时器,当key到期时立即删除key。

优点:

定时删除的这种方式是对内存最友好的,当key到期就马上释放key占用的内存。

缺点

对CPU不友好,特别是存在很多过期的key时,删除一个过期的key需要占用相当大的cpu时间。所以在内存不紧张,而CPU紧张的场景下,不宜使用此策略。

2、懒删除

懒删除的方式是不会在key过期时马上删除key,它会在每次向键空间读写时,检查键是否过期,如果过期了才真正删除它,否则返回key的值。

优点:

对CPU友好,只有操作时检查键是否过期,而不是定时的浪费CPU时间去检查。

缺点:

对内存不友好,这是很明显的,如果有大量过期的key,在一定时间内没有操作,那么它就会常驻在内存里,如果一直不操作,就相当于内存泄漏了。

3、按规则删除

考虑到上面两种删除策略的优缺点,redis结合了这两种策略来对key进行删除:懒删除和定时删除,已达到CPU和内存使用的平衡。

在redis server,懒删除是内置的策略,可以对定时删除设置执行时间和频率。有两种方式对定时删除设置:

1、配置redis.conf的hz选项,默认是10,也就是说每秒执行10次,数值越大,执行定时删除的频率越大,redis的cpu损耗也越大。

hz 10

2、配置redis.conf的最大内存,当内存的使用超出了最大内存,就会触发一个清除策略

maxmemory <bytes>

设置内存主动清除策略:

maxmemory-policy noeviction

内存清除策略:

  1. volatile-lru 只删除设置了过期时间的Key,使用频率越少的Key优先删除,不会对没有设置过期时间的Key删除
  2. volatile-ttl 和上面一样,只删除设置过期时间的Key,TTL过期时间越少优先删除
  3. volatile-random 随机删除快要过期的Key
  4. allkeys-lru 和lru一样,删除所有的Key,没有设置过期时间的Key也会被删除
  5. allkeys-random 和上面一样,删除掉随机的Key

版权声明:著作权归作者所有。

相关推荐

PHP7设置和删除cookie

PHP设置和删除cookie都是使用setcookie函数:bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bo

MySQL 5.7设置用户密码过期

数据库mysql的user表里有三个字段用于控制用户密码过期的设置:`password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', `password_last_changed` timestamp NULL&nbs

Jenkins集成Git ssh key密钥认证

Jenkins有两种方法集成Git的ssh key认证:这种方法很简单,只要把私钥拷贝到jenkins用户的~/.ssh目录,当git使用ssh访问仓库时会尝试使用此私钥。1、切换为jenkins用户$sudo su jenkins 2、创建.ssh目录,已存在目录忽略此步$cd ~ $mkdir .ssh 3、创建访问git的ssh k

Swift 4的KVO(Key Value Observation)用法

KVO 是 Objective-C 对观察者模式的实现。当被观察对象的某个属性发生更改时,观察者对象会获得通知。KVO实现依赖于Objective-C的Runtime,所以Swift需要使用@objc暴露api给Objective C。Swift目前没有内置原生实现的值观察系统,Swift 4的KVO使用dynamic属性来实现。被观察的类clas

Java HTTP代理设置以及认证

代理设置java http/https设置代理有两种方式:使用系统属性设置以及使用Proxy设置。使用系统属性设置代理String PROXY_HOST = "127.0.0.1";//代理服务器地址 String PROXY_PORT = "80";//代理服务器端口   //HTTP代理 System.setProperty("http.proxyHost", PROXY_HOST); Sy