久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么在redis中使用watch實現一個秒殺搶購功能

148次閱讀
沒有評論

共計 2282 個字符,預計需要花費 6 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

怎么在 redis 中使用 watch 實現一個秒殺搶購功能?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

具體內容如下

1、使用 watch,采用樂觀鎖
2、不使用悲觀鎖,因為等待時間非常長,響應慢
3、不使用隊列,因為并發量會讓隊列內存瞬間升高

代碼:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import redis.clients.jedis.Jedis;
 * redis 測試搶購
 * 
 * @author 10255_000
 * 
 */
public class RedisTest { public static void main(String[] args) {
 final String watchkeys =  watchkeys 
 ExecutorService executor = Executors.newFixedThreadPool(20);
 final Jedis jedis = new Jedis(192.168.3.202 , 6379);
 jedis.set(watchkeys,  0 //  重置 watchkeys 為 0
 jedis.del( setsucc ,  setfail //  清空搶成功的,與沒有成功的
 jedis.close();
 for (int i = 0; i   10000; i++) {//  測試一萬人同時訪問
 executor.execute(new MyRunnable());
 }
 executor.shutdown();
 }

 String watchkeys =  watchkeys //  監視 keys  Jedis jedis = new Jedis(192.168.3.202 , 6379);  public MyRunnable() { }  @Override  public void run() {  try { jedis.watch(watchkeys);// watchkeys  String val = jedis.get(watchkeys);  int valint = Integer.valueOf(val);  String userifo = UUID.randomUUID().toString();  if (valint   10) { Transaction tx = jedis.multi();//  開啟事務  tx.incr( watchkeys  List Object  list = tx.exec();//  提交事務,如果此時 watchkeys 被改動了,則返回 null  if (list != null) {  System.out.println( 用戶: + userifo +  搶購成功,當前搶購成功人數:  + (valint + 1));  /*  搶購成功業務邏輯  */  jedis.sadd(setsucc , userifo);  } else {  System.out.println( 用戶: + userifo +  搶購失敗  /*  搶購失敗業務邏輯  */  jedis.sadd(setfail , userifo);  }  } else {  System.out.println( 用戶: + userifo +  搶購失敗  jedis.sadd(setfail , userifo);  // Thread.sleep(500);  return;  }  } catch (Exception e) { e.printStackTrace();  } finally { jedis.close();  }  } }

Redis 對事物的支持目前比較簡單。Redis 只能保證一個 client 發起的事務中的命令可以連續的執行, 但后面命令出錯前面不會回滾。而中間不會插入其他 client 的命令。當一個 client 在找一個連續中發出 multi 命令時,這個鏈接會進入一個事務上下文,該鏈接后續的命令不會立即執行,而是先放到隊列中,當執行 exec 命令是,redis 會順序的執行隊列中的所有命令。當如果隊列中有命令錯誤,不會回滾。

樂觀鎖:大多數是基于數據版本 (version) 的記錄機制實現的。即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表添加一個”version”字段來實現讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號 +1。此時,將提交數據的版本號與數據庫表對應記錄版本號進行比對,如果提交的數據版本號大于數據當前版本號,則予以更新,否則認為是過去數據。

在 Redis 中,使用 watch 命令實現樂觀鎖(watch key):
watch 命令會監視給定的 key,當 exec 時,如果監視的 key 從調用 watch 后發生過變化,則事務會失敗,也可以調用 wathc 多長監視多個 key。這樣就可以對指定 key 加樂觀鎖了。注意 watch 的可以是對整個連接有效的。事務也一樣。如果連接斷開,監視和事務都會被自動清除。當然 exec,discard,unwatch 命令都會清除連接中的所有監視。

關于怎么在 redis 中使用 watch 實現一個秒殺搶購功能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計2282字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 安乡县| 呼和浩特市| 长兴县| 仙居县| 麻江县| 东莞市| 桦南县| 肃宁县| 溧水县| 高唐县| 汉川市| 上高县| 祁连县| 新津县| 喀喇| 康定县| 义马市| 诸城市| 崇义县| 方正县| 沿河| 丹阳市| 定结县| 阜城县| 保定市| 安溪县| 丰台区| 澎湖县| 龙门县| 安福县| 固始县| 鹿邑县| 陵水| 都匀市| 桂东县| 博湖县| 临潭县| 阿勒泰市| 中牟县| 延长县| 衡东县|