Redis key的生命周期故障案例
1.设置key的生命周期
查看key生命周期语法格式:ttl key
设置key的生命周期:expire key 时间,单位为秒
key的生命周期常用于优惠券这种活动,仅限于一天内使用,超过一天后优惠券自动消失
当key处于生命周期进行时的时候,如果再创建一模一样的key,会覆盖处于生命周期的key,这时,这个key的生命周期将会变成永不过期
redis key的生命周期到期后会自动把key删除
ttl命令查出来的key生命周期,如果返回值为-1则表示永不过期,返回值为-2则表示键过期,不存在
1.查看k2的生命周期 [root@redis-1 ~]# redis-cli 127.0.0.1:6379> ttl k2 (integer) -1 2.设置k2的声明周期为100秒 127.0.0.1:6379> EXPIRE k2 100 (integer) 1 3.观察k2的声明周期值 127.0.0.1:6379> ttl k2 (integer) 86 127.0.0.1:6379> ttl k2 (integer) 85 127.0.0.1:6379> ttl k2 (integer) 84 127.0.0.1:6379> ttl k2 (integer) 83 127.0.0.1:6379> ttl k2 (integer) 82 127.0.0.1:6379> ttl k2 (integer) 72 127.0.0.1:6379> ttl k2 (integer) 71 127.0.0.1:6379> ttl k2 (integer) 66 127.0.0.1:6379> ttl k2 (integer) -2
2.key生命周期故障案例
描述:双十一优惠,某电商平台的开发人员操作了创建了一个已经存在生命周期为一天的优惠券key,这时就会把正在进行生命周期消耗的key直接覆盖,从而成为默认的永不过期,当生命周期时长一过,发现优惠券还能使用,造成的损失不计其数,这就是由于新的key把就 的key覆盖了,生命周期也随着变成了永不过期,只要key的生命周期为不过期,那么这个key就不会删除
只有key生命周期到期了,key删除了,第二天优惠券就会变成无法使用
模拟破坏key的生命周期
1.创建优惠券key 127.0.0.1:6379> ttl k2 (integer) -2 2.查看key的生命周期 127.0.0.1:6379> ttl youhuiquan (integer) -1 #永不过期,默认创建的key是永不过期 3.设置key的生命周期为150s 127.0.0.1:6379> EXPIRE youhuiquan 150 (integer) 1 4.观察生命周期的缩减 正在一点点缩减 127.0.0.1:6379> ttl youhuiquan (integer) 148 127.0.0.1:6379> ttl youhuiquan (integer) 147 127.0.0.1:6379> ttl youhuiquan (integer) 147 127.0.0.1:6379> ttl youhuiquan (integer) 144 127.0.0.1:6379> ttl youhuiquan (integer) 140 5.这时开发人员突然创建了一模一样的key,导致了存在生命周期的key被覆盖,从而变成了永不过期的key 127.0.0.1:6379> set youhuiquan 100 OK 127.0.0.1:6379> ttl youhuiquan (integer) -1
避免key生命周期故障的方法
1.跟开发人员提前明确哪些key存在生命周期,将key的生命周期进行监控,通过zabbix的自定义监控项,监控redis-cli ttl key输出的结果,只要是包含-1就告警,这个key已经是永不过期
2.规范操作,避免背锅
3.将key的生命周期设置为永不过期
persist命令可以将一个快要过期的key设置为永不过期
语法格式:persist key
1.设置k3位100秒生命周期 127.0.0.1:6379> EXPIRE k3 100 (integer) 1 2.查看k3的生命周期缩减 127.0.0.1:6379> ttl k3 (integer) 96 127.0.0.1:6379> ttl k3 (integer) 91 127.0.0.1:6379> ttl k3 (integer) 82 127.0.0.1:6379> ttl k3 (integer) 77 4.设置k3永不过期 127.0.0.1:6379> PERSIST k3 (integer) 1 5.查看k3的生命周期 127.0.0.1:6379> ttl k3 (integer) -1