Redis 设置过期时间注意事项

原文链接 :https://www.cnblogs.com/zhuminghui/p/13139534.html

一、在为key设置过期时间需要注意的事项

1、 DEL/SET/GETSET等命令会清除过期时间

在使用DEL、SET、GETSET等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。

	//设置mykey的过期时间为300s
	127.0.0.1:6379> set mykey hello ex 300
	OK
	//查看过期时间
	127.0.0.1:6379> ttl mykey
	(integer) 294
	//使用set命令覆盖mykey的内容
	127.0.0.1:6379> set mykey olleh
	OK
	//过期时间被清除
	127.0.0.1:6379> ttl mykey
	(integer) -1

2、INCR/LPUSH/HSET等命令则不会清除过期时间

而在使用INCR/LPUSH/HSET这种只是修改一个key的value,而不是覆盖整个value的命令,则不会清除key的过期时间。
 · INCR:

 	//设置incr_key的过期时间为300s
	127.0.0.1:6379> set incr_key 1 ex 300
	OK
	127.0.0.1:6379> ttl incr_key
	(integer) 291
	//进行自增操作
	127.0.0.1:6379> incr incr_key
	(integer) 2
	127.0.0.1:6379> get incr_key
	"2"
	//查询过期时间,发现过期时间没有被清除
	127.0.0.1:6379> ttl incr_key
	(integer) 277

· LPUSH:

	//新增一个list类型的key,并添加一个为1的值
	127.0.0.1:6379> LPUSH list 1
	(integer) 1
	//为list设置300s的过期时间
	127.0.0.1:6379> expire list 300
	(integer) 1
	//查看过期时间
	127.0.0.1:6379> ttl list
	(integer) 292
	//往list里面添加值2
	127.0.0.1:6379> lpush list 2
	(integer) 2
	//查看list的所有值
	127.0.0.1:6379> lrange list 0 1
	1) "2"
	2) "1"
	//能看到往list里面添加值并没有使过期时间清除
	127.0.0.1:6379> ttl list
	(integer) 252

3、PERSIST命令会清除过期时间

当使用PERSIST命令将一个设置了过期时间的key转变成一个持久化的key的时候,也会清除过期时间。

	127.0.0.1:6379> set persist_key haha ex 300
	OK
	127.0.0.1:6379> ttl persist_key
	(integer) 296
	//将key变为持久化的
	127.0.0.1:6379> persist persist_key
	(integer) 1
	//过期时间被清除
	127.0.0.1:6379> ttl persist_key
	(integer) -1

4、使用RENAME命令,老key的过期时间将会转到新key上

在使用例如:RENAME KEY_A KEY_B命令将KEY_A重命名为KEY_B,不管KEY_B有没有设置过期时间,新的key KEY_B将会继承KEY_A的所有特性。

	//设置key_a的过期时间为300s
	127.0.0.1:6379> set key_a value_a ex 300
	OK
	//设置key_b的过期时间为600s
	127.0.0.1:6379> set key_b value_b ex 600
	OK
	127.0.0.1:6379> ttl key_a
	(integer) 279
	127.0.0.1:6379> ttl key_b
	(integer) 591
	//将key_a重命名为key_b
	127.0.0.1:6379> rename key_a key_b
	OK
	//新的key_b继承了key_a的过期时间
	127.0.0.1:6379> ttl key_b
	(integer) 248

5、使用EXPIRE/PEXPIRE设置的过期时间为负数或者使用EXPIREAT/PEXPIREAT设置过期时间戳为过去的时间会导致key被删除

·EXPIRE:

	127.0.0.1:6379> set key_1 value_1
	OK
	127.0.0.1:6379> get key_1
	"value_1"
	//设置过期时间为-1
	127.0.0.1:6379> expire key_1 -1
	(integer) 1
	//发现key被删除
	127.0.0.1:6379> get key_1
	(nil)

·EXPIREAT:

	127.0.0.1:6379> set key_2 value_2
	OK
	127.0.0.1:6379> get key_2
	"value_2"
	//设置的时间戳为过去的时间
	127.0.0.1:6379> expireat key_2 10000
	(integer) 1
	//key被删除
	127.0.0.1:6379> get key_2
	(nil)

6、EXPIRE命令可以更新过期时间

对一个已经设置了过期时间的key使用expire命令,可以更新其过期时间。

在Redis2.1.3以下的版本中,使用expire命令更新一个已经设置了过期时间的key的过期时间会失败。并且对一个设置了过期时间的key使用LPUSH/HSET等命令修改其value的时候,会导致Redis删除该key。

	//设置key_1的过期时间为100s
	127.0.0.1:6379> set key_1 value_1 ex 100
	OK
	127.0.0.1:6379> ttl key_1
	(integer) 95
	//更新key_1的过期时间为300s
	127.0.0.1:6379> expire key_1 300
	(integer) 1
	127.0.0.1:6379> ttl key_1
	(integer) 295

二、Redis的过期策略

	Redis里面如果有大量的key,怎样才能高效的找出过期的key并将其删除呢,难道是遍历每一个key吗?假如同一时期过期的key非常多,Redis会不会因为一直处理过期事件,而导致读写指令的卡顿。

这里说明一下,Redis是单线程的,所以一些耗时的操作会导致Redis卡顿,比如当Redis数据量特别大的时候,使用keys * 命令列出所有的key。

实际上Redis使用懒惰删除+定期删除相结合的方式处理过期的key。

1、懒惰删除

在客户端访问该key的时候,redis会对key的过期时间进行检查,如果过期了就立即删除。

这种方式看似很完美,在访问的时候检查key的过期时间,不会占用太多的额外CPU资源。但是如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源。

2、定期删除

Redis会将所有设置了过期时间的key放入一个字典中,然后每隔一段时间从字典中随机一些key检查过期时间并删除已过期的key。

Redis默认每秒进行10次过期扫描:

从过期字典中随机20个key

删除这20个key中已过期的

如果超过25%的key过期,则重复第一步

同时,为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。

3、查看redis 客户端状态

查看redis客户端连接:

192.168.1.127:0>info clients
	#Clients
	connected_clients:6000
	client_longest_output_list:0
	client_biggest_input_buf:5792
	blocked_clients:0

查看redis 客户端状态:

192.168.1.127:0>CLIENT LIST
	"id=304 addr=172.27.0.1:47800 fd=18 name= age=4 idle=4 flags=N db=14 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping user=default
	id=289 addr=172.27.0.1:47740 fd=25 name= age=77 idle=17 flags=N db=14 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping user=default
	id=299 addr=172.27.0.1:47780 fd=10 name= age=17 idle=17 flags=N db=14 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping user=default

age:表示连接存在的时间,单位秒

idle:表示连接空闲时间,单位秒

查看redis客户端超时设置:

192.168.1.127:0>config get timeout
	 1)  "timeout"
	 2)  "0" 

0表示不开启空闲清除

设置空闲清理时间:

192.168.1.127:0>config set timeout 60
	"OK"
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于springboot、mybatis-plus、redis、rabbitmq实现下单流程和注意事项: 下单流程的实现步骤如下: 1. 用户在前端页面填写好订单相关信息,并点击下单按钮。 2. 前端发送下单请求到后端的Spring Boot应用程序。 3. 后端应用程序接受到下单请求后,首先校验订单信息的合法性。 4. 合法性校验通过后,后端应用程序将订单信息写入数据库。可以使用mybatis-plus来简化数据库操作。 5. 订单信息成功写入数据库后,后端应用程序生成订单ID,并将订单ID和用户ID存入Redis缓存中,以备后续查询使用。 6. 接下来,后端应用程序可以向前端返回下单成功的消息。 7. 同时,后端应用程序将订单ID发送至消息队列RabbitMQ中,以便后续的订单处理过程,如库存扣减等。 实现下单流程需要注意以下事项: 1. 前端传递的订单信息需要进行合法性校验,包括价格、数量等字段的合法性。 2. 在写入数据库之前,可以根据实际需求对订单信息进行一些检查和处理,例如检查库存是否充足。 3. Redis缓存中存储订单ID和用户ID等信息,可以设置过期时间,以防止缓存过多占用内存。 4. RabbitMQ消息队列中的订单信息需要对消息进行持久化,以防止消息丢失。 5. 在后续的订单处理过程中,可以使用消息监听的方式来消费订单消息,并进行相应的处理,如扣减库存等。 6. 在订单处理过程中,需要保证数据的一致性和可靠性,可以使用分布式事务框架来实现,如Atomikos等。 综上所述,基于springboot、mybatis-plus、redis、rabbitmq实现下单流程需要注意合法性校验、信息持久化、缓存设置、消息队列持久化等问题,以保证下单流程的顺利进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值