Redis key的生命周期详解及故障案例描述

142 阅读3分钟

我正在参加「掘金·启航计划」

Redis key的生命周期故障案例

1.设置key的生命周期

查看key生命周期语法格式:ttl key 设置key的生命周期:expire key 时间,单位为秒

key的生命周期常用于优惠券这种活动,仅限于一天内使用,超过一天后优惠券自动消失

当key处于生命周期进行时的时候,如果再创建一模一样的key,会覆盖处于生命周期的key,这时,这个key的生命周期将会永不过期

redis key的生命周期到期后会自动把key删除

ttl命令查出来的key生命周期,如果返回值为-1则表示永不过期,返回值为-2则表示键过期,不存在;单位是秒

1.查看k3的生命周期
[root@192.168.146.145 ~]# redis-cli
127.0.0.1:6379> ttl k3
(integer) -1

2.设置k3的声明周期为100127.0.0.1:6379> EXPIRE k3 100
(integer) 1
127.0.0.1:6379

3.观察k2的声明周期值
127.0.0.1:6379> ttl k3
(integer) 94
127.0.0.1:6379> ttl k3
(integer) 93
127.0.0.1:6379> ttl k3
(integer) 91
127.0.0.1:6379> ttl k3
(integer) 89
127.0.0.1:6379> ttl k3
(integer) 87
127.0.0.1:6379> ttl k3
(integer) 86
127.0.0.1:6379> ttl k3
(integer) -2

2.key生命周期故障案例

描述:双十一优惠,某电商平台的开发人员操作了创建了一个已经存在生命周期为一天的优惠券key,这时就会把正在进行生命周期消耗的 key直接覆盖,从而成为默认的永不过期,当生命周期时长一过,发现优惠券还能使用,造成的损失不计其数,这就是由于新的key把就 的 key覆盖了,生命周期也随着变成了永不过期,只要key的生命周期为不过期,那么这个key就不会删除

只有key生命周期到期了,key删除了,第二天优惠券就会变成无法使用

模拟破坏key的生命周期

1.创建优惠券key
127.0.0.1:6379> set coupon 200
OK

2.查看key的生命周期
127.0.0.1:6379> ttl coupon
(integer) -1                  #永不过期,默认创建的key是永不过期

3.设置key的生命周期为150S
127.0.0.1:6379> EXPIRE coupon 150
(integer) 1
127.0.0.1:6379> ttl coupon
(integer) 142
127.0.0.1:6379> ttl coupon
(integer) 134
127.0.0.1:6379> ttl coupon
(integer) 131
127.0.0.1:6379> ttl coupon
(integer) 129
127.0.0.1:6379> ttl coupon
(integer) 128
127.0.0.1:6379> ttl coupon
(integer) 127

5.这时开发人员突然创建了一模一样的key,导致了存在生命周期的key被覆盖,从而变成了永不过期的key
127.0.0.1:6379> set coupon 100
OK
127.0.0.1:6379> ttl coupon
(integer) -1

避免key生命周期故障的方法

  1. 跟开发人员提前明确哪些key存在生命周期,将key的生命周期进行监控,通过zabbix的自定义监控项,监控redis-cli ttl key输出的结果,只要是包含-1就告警,这个key已经是永不过期
  2. 规范操作,避免背锅

3.将key的生命周期设置为永不过期

persist命令可以将一个快要过期的key设置为永不过期 语法格式:persist key

1.设置k6为100秒生命周期
127.0.0.1:6379> EXPIRE k6 100
(integer) 1

2.查看k6的生命周期缩减
127.0.0.1:6379> ttl k6
(integer) 66
127.0.0.1:6379> ttl k6
(integer) 63
127.0.0.1:6379> ttl k6
(integer) 62
127.0.0.1:6379> ttl k6
(integer) 58

3.设置k6永不过期
127.0.0.1:6379> PERSIST k6
(integer) 1

4.查看k6的生命周期
127.0.0.1:6379> ttl k6
(integer) -1