Redis的快取高併發處理
阿新 • • 發佈:2018-11-19
Springboot 整合Redis,快取過期之後,如果多個執行緒同時請求對某個資料的訪問,會同時去到資料庫,導致資料庫瞬間負荷增高。
解決辦法:
①Spring4.3為@Cacheable註解提供了一個新的引數“sync”(boolean型別,預設為false),當設定它為true時,只有一個執行緒的請求會去到資料庫,其他執行緒都會等待直到快取可用。這個設定可以減少對資料庫的瞬間併發訪問。
@Cacheable(sync=true)
②使用RedisTemplate 來設定快取
// 注入springboot自動配置的 @Autowired private RedisTemplate<Object, Object> redisTemplate; @Override public List<User> selectAll() { //字串的序列化器 預設utf8 RedisSerializer resdisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(resdisSerializer); List<User> list = (List<User>) redisTemplate.opsForValue().get("users"); //雙重檢測鎖 if (null == list) { synchronized (this) { list = (List<User>) redisTemplate.opsForValue().get("users"); if (null == list) { list = userMapper.selectAll(); System.out.println("查詢了資料庫----------"); redisTemplate.opsForValue().set("users", list); }else{ System.out.println("使用了快取"); } } }else{ System.out.println("使用了快取"); } return list; }