jedis对redis键加锁+解锁+事务提交
生活随笔
收集整理的這篇文章主要介紹了
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键加锁+解锁+事务提交的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis-java客户端jedis测试
- 下一篇: redis主从复制部署策略+jedis设