纯净、安全、绿色的下载网站

首页

当前位置:首页IT学院IT技术

Redis秒杀功能 使用Redis实现秒杀功能的简单方法

_灯火阑珊处   2021-05-08 我要评论
想了解使用Redis实现秒杀功能的简单方法的相关内容吗,_灯火阑珊处在本文为您仔细讲解Redis秒杀功能的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:redis秒杀功能,下面大家一起来学习吧。

1. 怎样预防数据库超售现象

设置数据库事务的隔离级别为Serializable(不可用)

Serializable就是让数据库去串行化的去执行事务,一个事务执行完才能去执行下一个事务,效率太慢

在数据表上设置乐观锁字段,例如设置版本号(version)

不同事务在执行更新操作时,需要先判断一下版本号是否已被修改

代码实现乐观锁流程

1.1. 什么表需要设置乐观锁

出现同时修改同一条记录的业务,相应的数据表要设置乐观锁

不会出现同时修改同一记录的数据库,就不需要设置乐观锁

2. 利用Redis防止超售

为了保证事务的一致性,在开启事务之前必须要用WATCH命令监视要操作的记录

redis > WATCH kill_num kill_user

使用MULTI命令开启一个事务

redis > MULTI

开启事务后的所有操作都不会立即执行,只有执行EXEC命令的时候才会批处理执行

redis > DECR kill_num
redis > RPUSH kill_user 10086
redis > EXEC

spring-boot 引入 redis 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

实现代码

@Autowired
private StringRedisTemplate redisTemplate;

public void kill() {
    // 获取库存
    int killNum = Integer.parseInt(Objects.requireNonNull(redisTemplate.opsForValue().get("kill_num")));
    if (killNum > 0) {
        redisTemplate.watch(Arrays.asList("kill_num", "kill_user"));
        // 开启事务
        redisTemplate.multi();
        // 库存-1
        redisTemplate.opsForValue().decrement("kill_num");
        // 记录秒杀用户id(10086)
        redisTemplate.opsForList().rightPush("kill_user", "10086");
        // 提交事务
        redisTemplate.exec();
    }
}

总结


相关文章

猜您喜欢

  • Kotlin中?和!!区别 Kotlin中?和!!的区别详细对比

    想了解Kotlin中?和!!的区别详细对比的相关内容吗,王晓清在本文为您仔细讲解Kotlin中?和!!区别的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:kotlin应用,kotlin,?,!!,区别,下面大家一起来学习吧。..
  • redis 限制内存 redis 限制内存使用大小的实现

    想了解redis 限制内存使用大小的实现的相关内容吗,四月的水在本文为您仔细讲解redis 限制内存的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:redis,限制内存,下面大家一起来学习吧。..

网友评论

Copyright 2022 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们