操作数据库时同时对redis进行操作

在Java服务中,当执行数据库的增删改操作时,如何确保Redis缓存同步更新。文章介绍了在修改数据库后如何更新Redis,并通过开启事务确保数据一致性。同时,提供了检查Redis更新是否成功的测试接口方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在对数据库中的数据进行增删改的操作的同时怎么对Redis缓存数据库进行同步更新,执行完成增删改SQL后,怎么检查Redis数据库是否更新成功。

据体操作如下:

1.这是一段在service实现层执行的修改操作的SQL

public boolean updateAll(SystemSetConfig setConfig) {
       int i = systemSetConfigMapper.updateAll(setConfig);
        if (i == 1) { 
           return true;
        } else {
           return false;
        }
    }

2.在运来的基础上增加一些操作,使在修改完成并成功后,同时更新Redis数据库(修改、新增操作一样),这里没有对redis数据进行限制,redis中的数据永不过期

  public boolean updateAll(SystemSetConfig setConfig) {
        int i = systemSetConfigMapper.updateAll(setConfig);
        if (i == 1) {
          /*SystemSetConfigRedis是一个数据库对应操作表格的实现类,并且这个实现类实现了 
           Serializable接口(序列化接口)*/
            SystemSetConfigRedis systemSetConfigRedis = new SystemSetConfigRedis();
          /*BeanUtils是Jar(org:springframework:spring-beans)下的一个工具类
          将传入的参数类(setConfig)复制给systemSetConfigRedis类(systemSetConfigRedis类实 
          现了序列化)*/
            BeanUtils.copyProperties(setConfig, systemSetConfigRedis);
          //注入redisService类调用封装好的对Redis进行操作的方法
          /* CarownerhomeKeyName.systemSetConfig + setConfig.getBak5()是key。
          CarownerhomeKeyName是一个专门用来封装数据库和redis对应的表关系的类,
         调取的systemSetConfig 就是对应定义的数据库和redis对应的表。
         setConfig.getBak5():正好我这里Bak5在类中是表示Id的字段加上是为了表示这个key的独有性
         当然这个key传参可以用其它方式*/
          /*systemSetConfigRedis是复制好的value,注意这里这个用来充当容器的 
          systemSetConfigRedis这个类一定是需要实现了Serializable可序列化接口的不然会报错*/

            boolean b = redisService.setObject(
                        CarownerhomeKeyName.systemSetConfig + setConfig.getBak5(), 
                        systemSetConfigRedis);
            
            if (!b) {
                throw new RuntimeException("redis更新失败");
            }else {
                return true;
            }
        } else {
            return false;
        }

    }
//RedisService 接口
public interface RedisService {

    Object getObject(String key);

    boolean setObject(String key,Object object);
    boolean deleteObject(String key);
}

//接口的实现类
public class RedisServiceImpl implements RedisService {
    /*RedisTemplate<Object, Object>是Jar(org:springframework:data:spring-data-redis)
    下的一个工具类,这个类下面直接有对redis进行操作的方法,
    也可以直接用这个类调用对redis进行操作的方法,
    这里是为了简便调用方法,进行了封装*/
    @Resource
    private RedisTemplate<Object, Object> redisTemplate;
    /*redis数据的获取方法*/
    @Override
    public Object getObject(String key) {
        return RedisUtil.getValue(redisTemplate,key);
    }
    /*redis的新增、修改方法*/
    @Override
    public boolean setObject(String key,Object object) {
        return RedisUtil.setRedis(redisTemplate,key,object);
    }
    /*删除方法*/
    @Override
    public boolean deleteObject(String key) {
          RedisUtil.deleteRedis(redisTemplate,key);
        return true;
    }
}

 删除操作 

public boolean updateIsDelete(SystemSetConfig setConfig) {
        int i = systemSetConfigMapper.updateIsDeletedInt(setConfig);
        if (i==1){
        /*删除操作比较简单,只需要调用相应redis的删除操作,传入需要删除数据的key即可*/
            boolean b = redisService.deleteObject
            (CarownerhomeKeyName.systemSetConfig + setConfig.getBak5());
            if (!b){
                throw new RuntimeException("redis更新失败");
            }else {
                return true;
            }
        }else {
            return false;
        }
    }

防止数据库修改成功,而redis更新时发生错误,导致数据库更新成功redis没有更新,需要开启事务。

检查redis是否更新成功

1.写一个测试接口

//@Controller
@Api(tags="redis测试接口")
@RestController //@Controller+各方法的@ResponseBody
@RequestMapping("/redis")
//@Api(tags="用户接口")
public class RedisTestController { 
     @Autowired private RedisTemplate<Object,Object> redisTemplate;
    
    @ApiOperation("初始化用户redis信息")
    @GetMapping("/selectByBak/{bak5}")
    public Object selectRedis(@PathVariable int bak5){
    /*调用RedisUtil类中的方法获取对应key键的值*/
        Object object = RedisUtil.getValue(redisTemplate,
                                CarownerhomeKeyName.systemSetConfig+bak5);

        SystemSetConfigRedis systemSetConfigRedis = (SystemSetConfigRedis)object;
        
        return systemSetConfigRedis;


}

}

2.测试:对数据进行操作执行完成后,访问测试接口查看redis缓存数据库中对应key键的值是否也成功修改。

Redis缓存数据库中的其它操作,对redis中的数据设置过期时间

public class RedisUtil {
    public static int hourtime15Day = 3600*24*15;// key的有效时间15天(60*60)     可自定义时常

    public static boolean setRedis(RedisTemplate<Object,Object> redisTemplate,String key,Object o){
        redisTemplate.opsForValue().set(key,o);
        return true;
    }
    public static boolean setRedisTimeout(RedisTemplate<Object,Object> redisTemplate,String key,Object o,long timeoutSeconds){
        redisTemplate.opsForValue().set(key,o);
        redisTemplate.expire(key,timeoutSeconds, TimeUnit.SECONDS);//设置6秒过期
        return true;
    }

    public static Object getValue(RedisTemplate<Object,Object> redisTemplate,String key){
        return redisTemplate.opsForValue().get(key);
    }

    public static Object deleteRedis(RedisTemplate<Object,Object> redisTemplate,String key){
         redisTemplate.delete(key);
         return true;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值