双重检测锁
try{
//序列化器,将key的值设置为字符串
RedisSerializer redisSerializer=new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer);
//查缓存
List<UsersDO> list=(List<UsersDO>)redisTemplate.opsForValue().get("allUsers");
if(null==list){
//双重检测 锁
synchronized (this) {
List<UsersDO> list1 = (List<UsersDO>) redisTemplate.opsForValue().get("allUsers");
if (null == list1) {
UsersQuery query=new UsersQuery();
list=usersDOMapper.selectByExample(query);
redisTemplate.opsForValue().set("allUsers", list);
System.out.println("从数据库中取数据");
}
else{
System.out.println("从缓存中取数据");
}
}
}
else{
System.out.println("从缓存中取数据");
}
return list;
}
catch (Exception e) {
logger.error("UserService.getAllUserWithNoPage error",e);
}
双重检测锁压测
ExecutorService executorService= Executors.newFixedThreadPool(20);
for(int i=1 ; i<=10000;i++){
executorService.submit(new Runnable() {
@Override
public void run() {
userService.getAllUserWithNoPage();
}
});
}
结果
从数据库中去数据
从缓存中取数据
从缓存中取数据
从缓存中取数据
从缓存中取数据
…