1. 程式人生 > >Redis的快取高併發處理

Redis的快取高併發處理

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;
	}