热点数据的实现

在系统中有一些数据是大多数线程都会访问的,这个时候就会产生竞争。例如库存。商品库存主要的库存的要求:首先是无论怎么减都不能小于0,第二点是尽可能的高效。

实现方式一:对于不能小于0,可以通过sql命令来实现。

   update account
        set
        count = count -1
        where name = "cloth" AND  count>0

这样一条命令能够实现保证count数不会小于一。但是在数据库里update时会加锁,当大量的线程过来的时候,就会变成是单线程的。影响系统的横向扩展。
第二种方式:无锁的方式是每一次扣库存的时候并不减库存,而是王数据库里写一条扣的交易记录。然后找一个时间点刷新库存。

系统启动的时候,读取到商品的库存主要是通过库存+库存消耗信息计算出库存。将库存使用Atomic变量stock表示库存。使用一个Atomic值cost表示消耗数量。
当扣减的时候,首先往数据库中插入写入一条消耗的信息。然后将cost+1.然后检查 stock+cost <0如果小于0添加一条补偿的记录进去。
这里先扣然后检查余量如果非法再加回去的做法可能会出现错报库存不足的情况。例如库存 = 10,ThreadA扣了11个,Thread扣B了9个。在ThreadA写补偿记录的时候ThreadB也会写入补偿记录。导致两个线程都扣库存失败。但是不会出现余额为负的情况。换个思路,这个商品如此受欢迎,先提前拒绝一些线程也是可以接受的。

数据结构&#

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值