兰州网站设计有限公司,访问公司网站公司会知道吗,杭州网络科技网站建设,基于jquery做的网站20240809 一、解决redis数据被删除的方案1、发现问题2、解决注意#xff01;#xff01; 二、声明式事务#xff08;当有redis的时候#xff09;1. 先看代码2. Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面#xff0c;如何保证原子性和一致性3… 20240809 一、解决redis数据被删除的方案1、发现问题2、解决注意 二、声明式事务当有redis的时候1. 先看代码2. Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面如何保证原子性和一致性3.1 我们可以用try catch finally来实现3.2 我们可以让redis的执行放到最后这样当其他的 三、使用分布式锁redis1. 先看代码2. 为什么要使用3. 使用的redis的 setnx进行加锁 一、解决redis数据被删除的方案
1、发现问题
在我们小组进行开发的时候发现redis中的数据老是会丢失刚开始以为是若依的SpringBoot配置问题一直找但是没有发现有关的地方。 然后开始看是不是服务器重启AOF不保存数据的问题然后发现没有那就只有一个了那就是redis的config配置了
2、解决
打开Redis配置文件在Redis服务器上找到redis.conf文件所在的位置通常位于Redis安装目录下的/etc/redis/目录中。使用文本编辑器打开该文件。
注释掉相关配置项 在打开的redis.conf文件中搜索以下两个配置项
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size修改为
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 0保存对redis.conf文件的修改 重启Redis服务器 使用以下命令重启Redis服务器以使修改后的配置生效 sudo systemctl restart redis
注意
完成以上步骤后Redis将不再自动进行AOF重写操作从而关闭了自动清理缓存的功能。 需要注意的是关闭自动清理缓存可能会导致AOF文件过大而影响性能因此在实际应用中需要根据实际情况合理配置AOF重写的触发条件以及定期手动执行AOF重写操作来清理缓存。
二、声明式事务当有redis的时候
1. 先看代码 OverrideTransactional(rollbackFor Exception.class)public void updateInspectList(ListSub subList) {for (Sub sub : subList) {SubVo subVo new SubVo();SubDTO subDTO new SubDTO();BeanUtils.copyProperties(sub, subVo);BeanUtils.copyProperties(sub, subDTO);// 更新 term_production_infohomePageCMapper.updateInspectA(subVo);// 更新 om_term_infosubDTO.setDevidqi_state(1);subDTO.setTerm_qi_devid_qi_time(sub.getDevid_qi_time());homePageCMapper.updateInspectB(subDTO);// 将 inspect_list 存入 RedisString term_sn sub.getTerm_sn();ListInspect configList sub.getInspect_list();for (Inspect inspect : configList) {if(Objects.equals(inspect.getResult(), ok)){inspect.setResult(1);}else {inspect.setResult(2);}}try {stringRedisTemplate.opsForValue().set(configList: term_sn, JSONUtil.toJsonStr(configList));} catch (Exception e) {stringRedisTemplate.delete(configList: term_sn);Console.error(Redis创建数据失败, e);throw e;}}}2. Transactional(rollbackFor Exception.class)
声明式事务根据捕获的异常进行回滚。 Exception.class这是很多异常的父类 Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面如何保证原子性和一致性
3.1 我们可以用try catch finally来实现
当遇到错误的时候我们可以在最后执行到finally来删除我们在这个里面创建的redis或者修改数据回去从而避免数据不一致或部分更新的情况。。
3.2 我们可以让redis的执行放到最后这样当其他的
我们也可以直接在最后执行redis然后对他进行try cath。只有在上面的所有操作都执行完毕之后才会执行redis然后对redis的操作进行判断如果是redis出错了就只用看抛出的异常然后操作redis。
三、使用分布式锁redis
1. 先看代码
Transactional(rollbackFor Exception.class)Overridepublic void Add(AddPageA addPageA) {String lockKey lock_key;Boolean lock stringRedisTemplate.opsForValue().setIfAbsent(lockKey, locked, 10, TimeUnit.SECONDS);if (lock ! null lock) {try {OmTermInfoDTO omTermInfoDTO new OmTermInfoDTO();OutTermShipDTO outTermShipDTO new OutTermShipDTO();BeanUtil.copyProperties(addPageA, omTermInfoDTO);BeanUtil.copyProperties(addPageA, outTermShipDTO);outTermShipDTO.setBom_no(addPageA.getOut_term_ship_bom_no());omTermInfoDTO.setCreat_time(new Date());/*omTermInfoDTO.setOut_term_ship_ship_time(addPageA.getShip_time());omTermInfoDTO.setOut_term_ship_take_address(addPageA.getTake_address());*/outTermShipDTO.setTake_address(addPageA.getOut_term_ship_take_address());outTermShipDTO.setShip_time(addPageA.getOut_term_ship_ship_time());ListString regionData new ArrayList();regionData addPageA.getOut_region_name_no();String term_sn addPageA.getTerm_sn();stringRedisTemplate.opsForValue().set(term_sn :region, JSONUtil.toJsonStr(regionData));// 获取集合ListString list addPageA.getOut_region_name_no();// 获取集合的最后一位int lastElement Integer.parseInt(list.get(list.size() - 1));omTermInfoDTO.setOut_region_id(lastElement);addMapper.AddOmTerInfo(omTermInfoDTO);addMapper.AddOutTerShip(outTermShipDTO);}catch (Exception e){throw new RuntimeException(代码异常);}finally {stringRedisTemplate.delete(lockKey);}}else {throw new RuntimeException(Could not acquire lock);}}2. 为什么要使用
因为我在一次操作中连点了好几次就发现数据和预想不一样多了一条所以针对于这样的操作就需要进行加锁。
3. 使用的redis的 setnx进行加锁
先定义一个key然后进来一个线程需要先去获取锁如果拿到就执行拿不到就没了哈哈哈没有重试啊因为它不是多线程吧这个稍后在研究。 最后执行完之后释放这个锁下次就能实现了。 String lockKey lock_key;Boolean lock stringRedisTemplate.opsForValue().setIfAbsent(lockKey, locked, 10, TimeUnit.SECONDS);if (lock ! null lock) {try{}finally {stringRedisTemplate.delete(lockKey);}}else {throw new RuntimeException(无法拿到锁);}