事务:不多解释,保证数据的一致性。
管道:在需要大批量执行Redis命令的时候,这样可以极大地提升Redis执行的速度。
Lua语言:在高并发的场景中,往往我们需要保证数据的一致性,利用Redis执行Lua的原子性来达到数据一致性的目的。
一、使用Redis事务
在Redis中使用事务,命令组合是watch… multi…exec,在spring中可以使用SessionCallback接口来实现。
watch:监控Redis的一些键;
multi:开始事务,开始事务后,该客户端的命令不会马上被执行,而是存放在一个队列里,也就是在这时我们执行一些返回数据的命令,结果都是返回null;
exe:执行事务,它在命令执行前会判断被watch监控的Redis的键的数据是否发生过变化(即使赋予与之前相同的值也会被认为是变化过),如果它认为发生了变化,那么Redis就会取消事务,否则就会执行事务。
Redis事务执行过程:
通过Spring使用Redis事务机制:
@RequestMapping("/multi")
@ResponseBody
public Map<String, Object> testMulti() {
redisTemplate.opsForValue().set("key1", "value1");
List list = (List)redisTemplate.execute((RedisOperations operations) -> {
// 设置要监控key1
operations.watch("key1");
// 开启事务,在exec命令执行前,全部都只是进入队列
operations.multi();
operations.opsForValue().set("key2", "value2");
// operations.opsForValue().increment("key1", 1);// ①
// 获取值将为null,因为redis只是把命令放入队列
Object value2 = operations.opsForValue().get("key2");
System.out.println("命令在队列,所以value为null【"+ value2 +"】");
operations.opsForValue().set("key3", "value3");
Object value3 = operations.opsForValue().get("key3");
System.out.println("命令在队列,所以value为null【"+ value3 +"】");
// 执行exec命令,将先判别key1是否在监控后被修改过,如果是则不执行事务,否则就执行事务
ret