Redis学习9——与springboot结合(事务,管道,Lua)

事务:不多解释,保证数据的一致性。
管道:在需要大批量执行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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值