redis 事务
事务特性:发生异常不会回滚已经执行的命令
****************
相关接口
public interface SessionCallback<T> {
@Nullable
<K, V> T execute(RedisOperations<K, V> var1) throws DataAccessException;
}
****************
controller 层
HelloController
@RestController
public class HelloController {
@Autowired
private StringRedisTemplate redisTemplate;
@RequestMapping("/hello")
public String hello(){
redisTemplate.opsForValue().set("version","0");
Thread t=new Thread(()-> {
redisTemplate.execute(new SessionCallback<Object>() {
public Object execute(RedisOperations redisOperations) throws DataAccessException {
redisOperations.watch("version");
redisOperations.multi();
System.out.println(redisOperations.opsForValue().get("count"));
//命令只是排队,没有执行,返回null
redisOperations.opsForValue().increment("count");
redisOperations.opsForValue().increment("version");
redisOperations.exec();
return null;
}
});
});
ExecutorService executorService= Executors.newFixedThreadPool(10);
for(int i=0;i<100;i++){
executorService.submit(t);
}
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
return redisTemplate.opsForValue().get("count");
}
@RequestMapping("/hello2")
public String hello2(){
Runnable r=()->{
synchronized(this){
if(redisTemplate.opsForValue().get("count 2")==null){
redisTemplate.opsForValue().set("count 2","1");
}else {
redisTemplate.opsForValue().increment("count 2");
}
}
};
ExecutorService executorService=Executors.newFixedThreadPool(10);
for(int i=0;i<100;i++){
executorService.submit(r);
}
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
return redisTemplate.opsForValue().get("count 2");
}
}