400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Redis+lua进行类似秒杀的实现

redis+lua进行类似秒杀的实现

由于项目需要,需要多线程去获取和修改数据库的库存,考虑到给数据库加锁效率低,所以采用redis+lua来进行实现 。

创新互联主营高昌网站建设的网络公司,主营网站建设方案,成都app开发,高昌h5微信小程序定制开发搭建,高昌网站营销推广欢迎高昌等地区企业咨询

redis的单线程操作特性来执行lua脚本,通过lua脚本来保证原子性。如果通过单纯的redis指令来进行更改,在读和写之间会存在多线程并发更新的问题。

1.首先定义redis数据结构

goodId:
 {
 "total":100,
 "released":0;
 }

- 执行脚本命令`EVAL script_string 1 goodId apply_count`
- 若库存足够则返回申请的数量,否则返回0,不返回可满足的剩余数

3.spring boot 调用 
- pom dependency 

org.springframework.boot
spring-boot-starter-data-redis
2.0.1.RELEASE

- java code
```java
        long count = redisHelper.getStrCache().execute(new RedisCallback() {
            @Nullable
            @Override
            public Long doInRedis(RedisConnection redisConnection) throws DataAccessException {
                long ret = redisConnection.eval(script.getScriptAsString().getBytes(), ReturnType.INTEGER, 1, key.getBytes(), String.valueOf(count).getBytes());
                return ret;
            }
        });

4.redis->database

针对redis到databases的更新,思考了很久,没有找到较好的解决办法,先采用定时任务异步更新。至于数据是否丢失的问题,如果redis挂了,重启后redis会恢复数据,等下次定时任务就可以将数据库中的数据保持一致,缺点是redis挂了秒杀活动会失败。

至于redis到database更新的如何驱动,列出两种愚见:

欢迎各位提出问题,谢谢您的阅读


网站题目:Redis+lua进行类似秒杀的实现
URL地址:http://mzwzsj.com/article/gcigei.html

其他资讯

让你的专属顾问为你服务