深圳网站建设科技有限公司,网站开发业务好做吗,旧房改造装修翻新,新型网站建设问题描述
测试阶段#xff0c;由于存在某一功能的同时操作#xff0c;该功能还是入库逻辑#xff0c;此时若不进行处理#xff0c;会造成插入表中多条重复数据#xff0c;为此该问题需要修复。
解决办法
在接口开始进行对是否存在某个key值的判断#xff0c;若不存在由于存在某一功能的同时操作该功能还是入库逻辑此时若不进行处理会造成插入表中多条重复数据为此该问题需要修复。
解决办法
在接口开始进行对是否存在某个key值的判断若不存在则插入一条到redis中并加锁若存在则提示“正在处理中”若中间出现逻辑处理异常则需要对该key值删除最后进行对锁的释放
话不多说上代码
pom.xml 依赖补充
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency
application.yml文件中redis配置
redis:host: 127.0.0.1port: 6379timeout: 10poolMaxTotal: 1000poolMaxIdle: 500poolMaxWait: 500
UserMapper.java
import com.example.demo.entity.User;import org.apache.ibatis.annotations.Mapper;Mapper
public interface UserMapper {int add(User user);User queryByName(String name);
}UserMapper.xml
?xml version1.0 encodingutf-8?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.mapper.UserMapperselect idqueryByName resultMapuserResultselect id,name,age from USERwhere name#{name}/selectinsert idadd parameterTypecom.example.demo.entity.UserINSERT INTO USER (id,name, age)VALUES (SYS_GUID(),#{name},#{age})/insert
/mapper
RedisService类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;Service
public class RedisService {AutowiredRedisTemplateString,Object redisTemplate;/*** 加锁* param key* param value* param expireTime* return*/public boolean lock(String key, String value, Long expireTime) {Boolean success redisTemplate.opsForValue().setIfAbsent(key, value);if (expireTime ! null expireTime 0) {redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);}return success ! null success;}/*** 释放锁* param key*/public void unlock(String key) {redisTemplate.opsForValue().getOperations().delete(key);}/*** 根据key删除信息* param key*/public void deleteStr(String key) {redisTemplate.delete(key);}
}bean配置 解决redis内容乱码为了方便我这边直接在启动类中配置
BeanSuppressWarnings(all)public RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) {RedisTemplateString, Object template new RedisTemplateString, Object();template.setConnectionFactory(factory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);StringRedisSerializer stringRedisSerializer new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用jackson的序列化方式template.setHashKeySerializer(jackson2JsonRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}
controller类
该程序对新增用户功能同时操作的模拟补充redis中key的判断具体开发逻辑或内容可以视情况而定
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.service.RedisService;import java.util.List;RestController
RequestMapping(/user)
public class UserController {private static final Logger logger LoggerFactory.getLogger(UserController.class);Autowiredprivate UserMapper userMapper;Autowiredprivate RedisService redisService;PostMapping(/addTest)public void addTest(RequestBody User user) throws Exception {//todo 该功能的状态校验//1.判断该用户在redis是否存在if (!redisService.lock(addUser, String.valueOf(System.currentTimeMillis()), 15L)) {throw new Exception(正在操作中);}try {//2.逻辑处理User user1 userMapper.queryByName(user.getName());if (user1 ! null) {throw new Exception(该用户 user.getName() 已存在);}for (int i 0; i 1000; i) {for (int j 0; j 1000; j) {logger.info(i*j{}, i * j);}}userMapper.add(user);} catch (Exception e) {redisService.deleteStr(addUser);throw e;} finally {redisService.unlock(addUser);}}
}测试结果
一用户信息操作结果 另一用户操作结果 等待2分钟该用户继续操作该数据会提示“该用户已存在”