使用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();
    }
}

總結

到此這篇關於使用Redis實現秒殺功能的文章就介紹到這瞭,更多相關Redis秒殺功能內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: