激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - redis使用watch秒殺搶購實現思路

redis使用watch秒殺搶購實現思路

2019-11-11 14:50LinvingCode Redis

這篇文章主要為大家詳細介紹了redis使用watch秒殺搶購的實現思路,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了redis使用watch秒殺搶購的具體代碼,供大家參考,具體內容如下

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

代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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();
 }
}
 
 
import java.util.List;
import java.util.UUID;
 
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
 
public class MyRunnable implements Runnable {
 
 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命令都會清除連接中的所有監視。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
主站蜘蛛池模板: 一级α片免费看刺激高潮视频 | 欧美日韩亚洲精品一区二区三区 | 欧美黄色免费视频 | 青青国产在线视频 | 欧洲成人精品 | 久久精品re | 久久精品一区二区三 | 亚洲国产午夜精品 | 成人av一区二区免费播放 | 黄色网欧美 | 久久99久久99免费视频 | 国产女同玩人妖 | 91精彩在线 | 久久亚洲春色中文字幕久久 | 毛片久久| 97干色| 曰韩精品 | 精品无码久久久久久国产 | 日韩一级片免费 | 性大片性大片免费 | 久久久久电影网站 | 免看黄大片aa | 妇子乱av一区二区三区 | 色婷婷一区二区三区 | 久久精品日产第一区二区三区 | 一级电影在线免费观看 | 可以看逼的视频 | 天天艹综合 | 亚洲精品在线观看网站 | 黄色电影免费网址 | 精品中文字幕久久久久四十五十骆 | 国产一区精品在线观看 | 日韩欧美高清一区 | 成人黄色在线视频 | 国产在线观看免费视频软件 | 免费专区 - 91爱爱 | 国产精品美女一区二区 | 中文字幕www | 韩国一级免费视频 | 久久精品一二三区白丝高潮 | 在线高清中文字幕 |