Java进阶架构实战——Redis在京东到家的订单中的使用

本文介绍了Redis在京东到家订单系统中的应用,包括订单列表的存储结构(使用有序集合)、Redis与数据库的数据一致性保证策略(循环更新和消息队列补偿)、分布式锁的实现以及防止缓存穿透和雪崩的方法。重点讨论了如何通过分布式锁优化并发访问,并提出了控制锁粒度以保护数据库的策略。
摘要由CSDN通过智能技术生成

image.png

背景

Redis作为一款性能优异的内存数据库,在互联网公司有着多种应用场景,下面介绍下Redis在京东到家的订单列表中的使用场景。主要从以下几个方面来介绍:

  1. 订单列表在Redis中的存储结构
  2. Redis和DB数据一致性保证
  3. Redis中的分布式锁
  4. 缓存防穿透和雪崩

订单列表在Redis中的存储结构

  • 订单列表数据在缓存中,是以用户的唯一标识作为键,以一个按下单时间倒序的有序集合为值进行存储的。大家都知道Redis的sorted set中每个元素都有一个分数,Redis就是根据这个分数排序的。订单有序集合中的每个元素是将时间毫秒数+订单号最后3位作为分数进行排序的。为什么不只用毫秒数作为分数呢?因为我们的下单时间只精确到秒,如果不加订单号最后3位,若同一秒有两个或两个以上订单时,排序分数就会一样,从而导致根据分数从缓存查询订单时不能保证唯一性。而我们的订单号的生成规则可以保证同一秒内的订单号的最后3位肯定不一样,从而可以解决上述问题。
  • 有必要将一个用户的所有订单都放入缓存吗?针对用户订单是没有必要的,因为很少有用户去看很久以前的历史订单。真正的热点数据其实也就是最近下过的一些订单,所以,为了节省内存空间,只需要存放一个用户最近下过的N条订单就行了,这个N,相当于一个阀值,超过了这个阀值,再从数据库中查询订单数据,当然,这部分查库操作已经是很小概率的操作了。

Redis和DB数据一致性保证

只要有多份数据,就会涉及到数据一致性的问题。Redis和数据库的数据一致性,也是必然要面对的问题。我们这边的订单数据是先更新数据库,数据库更新成功后,再更新缓存,若数据库操作成功,缓存操作失败了,就出现了数据不一致的情况。保证数据一致性我们前后使用过两种方式:

  • 方式一:
  1. 循环5次更新缓存操作,直到更新成功退出循环,这一步主要能减小由于网络瞬
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值