1、使用注解
@Cacheable(value = RedisService.REDIS_VALUE_IPLOG,sync=true)
@Override
public List<Userinfo> getAllUserinfo() {
System.out.println("userinfoMapper = " + userinfoMapper);
return userinfoMapper.getAll();
}
2、代码控制,双重监测加锁
①Service中代码
return redisService.gettWithThread("redis_keys_all_user_info", new Callable() {
@Override
public Object call() throws Exception {
return userinfoMapper.getAll();
}
});
②RedisService 中代码,统一封装,用callable返回值
public List<Userinfo> gettWithThread(final String key, Callable callable) {
boolean result = false;
List<Userinfo> list = ( List<Userinfo> )redisTemplate.opsForValue().get(key);
try {
// 双重检测锁
if (null==list){
synchronized (this){
// 在redis中获取
list= ( List<Userinfo> )redisTemplate.opsForValue().get(key);
if (null==list){
System.out.println("查询数据库------------");
list = (List<Userinfo>) callable.call();
redisTemplate.opsForValue().set(key,list);
result = true;
}else {
System.out.println("查询redis缓存------------");
}
}
}else{
System.out.println("查询redis缓存------------");
}
}catch (Exception e){
return list;
}
return list;
}
3、测试接口
@RequestMapping(value = "/getAllUserInfo.do")
public Object getAllUserInfo() {
Runnable runnable = () -> iUserinfoService.getAllUserinfo();
/**简历线程池,避免直接用线程**/
ExecutorService executorService = Executors.newFixedThreadPool(5);
/**submit有返回值,而execute没有*/
for (int i = 0; i < 1000; i++) {
executorService.submit(runnable);
}
return iUserinfoService.getAllUserinfo();
}
@RequestMapping(value = "/getAllUserInfo2.do")
public Object getAllUserInfo2() {
Runnable runnable = () -> iUserinfoService.getAllUserinfoWithRedis();
/**简历线程池,避免直接用线程**/
ExecutorService executorService = Executors.newFixedThreadPool(5);
/**submit有返回值,而execute没有*/
for (int i = 0; i < 1000; i++) {
executorService.submit(runnable);
}
return iUserinfoService.getAllUserinfoWithRedis();
}










网友评论