在对数据库中的数据进行增删改的操作的同时怎么对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;
}
}