springboot redis并发写入实现记录

springboot redis并发实现记录

前言(说一下这过程中我踩的坑)

redis并发写入防止数据在写入过程中已经被修改再写入后数据不对的处理方法如下
111111
那么我按照上面的流程准备开干,我使用的是springboot封装的StringRedisTemplate来操作redis,刚好我看到这里面需要的方法都有,于是我就先调用watch监控、然后get到数据、修改、multi开启事务、set写入、exec提交,结果提交这里就报了异常,Redis.clents.jedis.exceptions.JedisDataException:ERR EXEC without MULTI。查询之后发现RedisConnection conn每次都是新的,导致出现那个错误。也就是说提交的redis连接和开始的不是同一个这就很坑了、详情见RedisTemplate实现事物问题剖析和解决,解决方法就是重写SessionCallback的execute方法就可以解决问题。

实现

		//监控的key
		String [] s = {"test1","test2"};
		final boolean[] flag = {true};
        while (flag[0]) { //如果失败则重试
            Object o = stringRedisTemplate.execute(new SessionCallback<Object>() {
                @Override
                public  Object execute(RedisOperations redisOperations) throws DataAccessException {
                    List<Object> result = null;
                    redisOperations.watch(Arrays.asList(s));
                    Integer test1 = redisClient.get("test1",Integer.class);
                    Integer test2 = redisClient.get("test2",Integer.class);
                    if(test1==null || test2==null) {
                    	flag[0] = false;
                        return null;
                    }
                    redisOperations.multi();
                    redisOperations.opsForValue().set("test1",test1+1+"");
                    redisOperations.opsForValue().set("test2",test2+1+"");
                    //这里会返回一个boolean数组 记录提交的结果,这里由于上面开启了监控,成功就是全部成功,失败全部失败全失败会返回一个空数组
                    result = redisOperations.exec();
                    redisOperations.unwatch();
                    //result 不为null和空数组则成功
                    if(result != null && result.size()!=0) flag[0] = false;
                    return result;
                }
            });
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
watchdog-framework是一个基于SpringBoot + Shiro + Mybatis + Mybatis-Plus + HikariCP + Redis + Vue + iView等开发的轻量级管理系统快速开发脚手架。它提供了角色、用户、资源管理、权限数据同步更新等功能,并且还支持使用Redis实现看门狗功能。 在watchdog-framework中,使用Redis实现看门狗功能可以通过以下步骤实现: 1. 首先,在Spring Boot的配置文件中配置Redis的连接信息,包括主机名、端口号、密码等。 2. 在watchdog-framework的代码中,使用RedisTemplate来操作Redis。可以通过注入RedisTemplate对象来实现。 3. 在需要使用看门狗功能的地方,使用RedisTemplate的相关方法来实现。例如,可以使用RedisTemplate的expire方法设置一个键的过期时间,当过期时间到达时,可以触发相应的操作。 下面是一个示例代码,演示了如何在watchdog-framework中使用Redis实现看门狗功能: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @Component public class WatchdogService { @Autowired private RedisTemplate<String, String> redisTemplate; public void startWatchdog(String key, long timeout) { // 设置键的过期时间 redisTemplate.expire(key, timeout, TimeUnit.SECONDS); // 在过期时间到达时触发相应的操作 redisTemplate.addKeyExpirationListener((key, time) -> { // 执行相应的操作 System.out.println("Watchdog triggered for key: " + key); }); } } ``` 在上面的示例代码中,startWatchdog方法接收一个键和一个过期时间作为参数。它使用RedisTemplate的expire方法设置键的过期时间,并使用addKeyExpirationListener方法添加一个键过期的监听器。当键过期时,监听器会触发相应的操作。 请注意,上述示例代码仅演示了如何在watchdog-framework中使用Redis实现看门狗功能的基本思路,实际使用时还需要根据具体需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值