Redis优化秒杀系统

Redis优化秒杀系统

使用背景:
普通的基于mss框架的系统在并发量不是很高的情况下,对redis的需求不是很高。redis在系统中的角色相当于一个对象缓存器,在高并发的系统中(比如秒杀系统),在某一刻对数据库中的一条数据可能是成千上万的用户同时去访问,系统的用户体验度直接受到数据库的性能的影响。为了保证数据的完整性,用户只能串行访问数据库中的某一条记录。redis则是把记录对应的对象序列化存储在自身的容器中,减少数据库的压力。

下面就和大家来一起探讨下如何进行优化。
废话不多说首先奉献上小Demo。
在这里插入图片描述

下面来分析demo 如何进行一个优化操作。
在这里插入图片描述

首先sql方面一个要控制超卖问题。
数据会执行一个行锁,不会让sql去并行执行,都会是串行去执行。
下面可以利用redis 进行简易的优化。
在这里插入图片描述

在这里插入图片描述
Redis,是单线程的,就会很多并发,也是串行执行,但是这个会有什么问题呢?(**如果代码抛异常,如下单的时候抛异常会导致缓存不一致的问题解决思路 出现异常去还原问题。)
在这里插入图片描述

上面代码还有什么问题呢(库存加一还是负值,比如很多请求进来以后,但是很多下单不成功的请求,会导致只有一个还原成功,其他还原不成功。)

但是还会有什么问题呢。(如果库存只有100,并发1万的话,会造成很多的无效数据进入redis,造成redis压力过大。)
在这里插入图片描述

加一个jvm层数的ConcurrentMap,list

来存储卖完的标志,如果redis 中库存值为0,则直接返回,防止无效数据来进入redis。
又会提升一个层次。但是又会有什么问题呢。
在这里插入图片描述

抛出问题只会应该也回退map问题。
在这里插入图片描述

这个可以加上map.直接发送商品ID,异常再去数据库下订单。
在这里插入图片描述

这个的优化如果在nginx分发多个tomcat服务下。Jvm级别缓存不同步。但是最终的根据逻辑往下走都会变为map都会为true.(但是还会有什么问题呢)
在这里插入图片描述

如果发送mq以及数据库会有问题的话,会回退这个map,而nginx会进入其他的tomcat服务,导致一直下单不成功的问题。(用zookeeper解决)
在这里插入图片描述

观察者模式。

在这里插入图片描述

在这里插入图片描述

ZOOkeerper监听机制讲解
在这里插入图片描述

监听通知机制
在这里插入图片描述

注:需要自己去根据对应逻辑实现对应方法。
在这里插入图片描述

如何做jvm缓存同步。
配置bean.实现wtacher 方法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

当商品售完需要修改。

报错时修改为false。然后zookeeper监听机制如果发生变回,会直接remove掉内存中map的值。

以上学习后的一个简要思想。欢迎大家参与沟通。一起学习进步。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值