日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jedis对redis键加锁+解锁+事务提交

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jedis对redis键加锁+解锁+事务提交 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【README】

redis的java客戶端對鍵加鎖和解鎖(Jedis.watch()?? Jedis.unwatch()? );

?

【1】代碼

/*** redis加鎖-watch * 【場景描述】: watch命令就是標記一個鍵,如果標記了一個鍵,* 在提交事務前如果該鍵被別人修改過,那事務提交就會失敗;這種情況可以再重新嘗試一次;* 首先標記了鍵 balance,然后檢查余額是否足夠,不足就取消標記,并不做扣減;* 足夠的話,啟動事務進行更新;* 如果在此期間,balance被其他人修改,那么在提交事務(執行exce)時就會報錯;* 程序可以捕獲此類錯誤并重新執行一次,直到成功; */public static void main(String[] args) {boolean shopResult = new RedisTxTest().doShopping();System.out.println("購物結果 " + shopResult); }/*** 購物刷信用卡 * @return*/public boolean doShopping() {Jedis redis = new Jedis("192.168.163.201", 6382);int balance; // 余額-初始為100 int debt; // 欠額 int realConsumeAmount = 10; // 實際消費額 boolean result = false; redis.watch("balance"); // 對鍵 balance 監聽加鎖 balance = Integer.valueOf(redis.get("balance")); if (realConsumeAmount > balance ) { // 若實際消費金額 大于 信用卡內余額,即不夠刷,放棄本次事務的提交=返回 false redis.unwatch(); System.out.printf("消費失敗,原因【信用卡額度不夠】信用卡額度【%d】消費額【%d】\n", balance, realConsumeAmount); } else { // 若實際消費金額小于 信用卡內余額,即夠刷, 可以扣款System.out.println("****** shopping tx ******");Transaction tx = redis.multi(); // 開啟事務 tx.decrBy("balance", realConsumeAmount); // 減去余額tx.incrBy("debt", realConsumeAmount); // 增加欠額tx.exec(); // 提交事務 /** 提交事務后,獲取余額 和 欠額 */balance = Integer.valueOf(redis.get("balance"));debt = Integer.valueOf(redis.get("debt"));System.out.printf("消費扣款【%d】元成功后, 信用卡余額【%d】,欠額【%d】", realConsumeAmount, balance, debt); result = true; }// 記得關閉redis連接 redis.close();return result; }

?

總結

以上是生活随笔為你收集整理的jedis对redis键加锁+解锁+事务提交的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。