專案開發視頻:
SpringCloud微服務開發入門
手把手開發基于SpringBoot的員工管理系統
億度云盤~Java小白入門實戰
前言
本文我們將學習Redis的事務、分布式鎖以及持久化策略和淘汰策略,
事務
Redis提供的事務是將多個命令打包,然后一次性、按照先進先出的順序(FIFO)有序的執行,在執行程序中不會被打斷(在事務執行程序,其他客戶端提交的命令請求不會插入到事務執行命令序列中),當事務佇列中的所以命令都被執行(無論成功還是失敗)完畢之后,事務才會結束,
事務相關命令
- multi 啟動事務
- exec 提交事務
- discard 放棄事務
- watch 監視一個或多個鍵,如果有其他客戶端修改鍵的值,事務將失敗
事務操作
案例1:開啟事務,正常執行,提交事務

案例2:開啟事務,放棄事務,事務中的操作沒有執行

案例3:開始事務,出現了語法錯誤,提交事務后,操作都沒有執行

案例4:開始事務,出現數值錯誤(k1是字串不能遞增),提交事務后,其它的操作可以執行

案例5:監視score鍵,沒有其它客戶端修改,事務正常執行

案例6:監視score鍵,提交前打開另一個客戶端修改score,提交事務后incrby score沒有執行

分布式鎖
我們的軟體系統經常會遇到并發問題,比如:網路購票,N個用戶同時搶購100張票,只能有100個用戶搶到,如果不進行處理,可能會出現:一張票賣給A又賣給B的情況,
悲觀鎖和樂觀鎖
并發問題一般采用鎖機制來解決,分為悲觀鎖和樂觀鎖,
- 悲觀鎖
認為當前的資源存在競爭,所以每次獲得資源時都會上鎖,阻塞住其它執行緒,
資料庫中的行鎖、表鎖、讀鎖、寫鎖以及Java的synchronized和Lock都屬于悲觀鎖,
悲觀鎖會降低系統性能和吞吐量,提高資料的安全性,適用于多寫少讀的場景, - 樂觀鎖
認為當前的資源不存在競爭,所以每次獲得資源時都不上鎖,通過監視資料,提交修改前通過比較資料和原來的值,判斷是否有其他并發操作,最后決定修改的成功和失敗,
樂觀鎖執行效率高,有利于提高系統吞吐量,適用于多讀少寫的場景,
Redis的watch命令采用的是樂觀鎖機制,性能很高,適合于作為分布式鎖來解決并發問題,
分布式鎖操作
模擬購票,核心代碼:
@Repository
public class TicketCache{
Logger logger = Logger.getLogger(TicketCache.class);
@Autowired
private RedisTemplate<String,String> redisTemplate;
public String buyTicket(){
//執行購票邏輯
Boolean execute = redisTemplate.execute(new SessionCallback<Boolean>() {
@Override
public Boolean execute(RedisOperations redisOperations) throws DataAccessException {
//監視票數
redisOperations.watch("ticket_num");
//讀取票數
int num = Integer.parseInt(redisOperations.opsForValue().get("ticket_num").toString());
if (num <= 0) {
logger.info("票已售完");
return false;
}
//開啟事務
redisOperations.multi();
//修改票數
redisOperations.opsForValue().increment("ticket_num", -1);
//提交事務
List list = redisOperations.exec();
//list為空,提交失敗
if (list == null || list.isEmpty()) {
logger.info("購票失敗");
return false;
}
logger.info("購票成功" + list.get(0));
return true;
}
});
return String.valueOf(execute);
}
}
Redis持久化
Redis資料保存在記憶體中,為避免關閉程式后資料的丟失,就需要將資料保存到磁盤檔案上,
持久化策略
持久化策略包含
- AOF:默認每秒對資料進行持久化
- RDB:按條件觸發持久化操作,滿足任意一個條件
- 900 1 900秒中修改1次
- 300 10 300秒中修改10次
- 60 10000 60秒中修改10000次
配置方法
可以在redis.conf中配置持久化
如:RDB

啟動AOF的配置
appendonly yes 開啟AOF
appendfsync everysec 每秒保存
選擇持久化策略
我們如何選擇RDB和AOF呢?視業務場景而定:
- 允許少量資料丟失,性能要求高,選擇RDB
- 只允許很少資料丟失,選擇AOF
- 幾乎不允許資料丟失,選擇RDB + AOF
Redis淘汰策略
Redis中的資料太多可能導致記憶體溢位,Redis會根據情況淘汰一些資料,
Redis的記憶體上限:64位系統,上限就是記憶體上限;32位系統,最大是4G
配置最大記憶體:
max-memory 配置0就是無上限(默認)
淘汰策略
配置淘汰策略
maxmemory-policy
值:
- noevication(默認)不淘汰
- allkeys-lru (推薦)使用LRU演算法淘汰比較少使用的鍵
LRU演算法:Least Recently Used 最近最少使用演算法,淘汰長期不用的快取 - volatile-lru 在過期的鍵中淘汰較少使用的
- allkeys-random 在所有鍵中隨機淘汰
- volatile-random 在過期鍵中隨機淘汰
- volatile-ttl 在過期鍵中淘汰存活時間短的鍵
結束
大家如果需要學習其他Java知識點,戳這里 超詳細的Java知識點匯總
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254033.html
標籤:其他
下一篇:TikTok 宣布在印度裁員
