1,引入依赖(百度搜索即可)
2,配置yaml
spring:redis:##redis 单机环境配置host: 127.0.0.1# host: 10.192.33.144port: 6379# port: 20051# password: 123456password: ''# database: 1database: 0ssl: false##redis 集群环境配置#cluster:# nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003# commandTimeout: 5000redisson:config:single-server-config:address: "redis://${spring.redis.host}:${spring.redis.port}"
3,创建配置类
package org.springblade.sample.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissonConfig {@Value("${redisson.config.single-server-config.address}")private String redisAddress;@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress(redisAddress);return Redisson.create(config);}
}
4,使用示例
@Resourceprivate RedissonClient redissonClient;//获取初始编码private StringBuffer getInitCode(Integer isForeignInput) {String prefix = isForeignInput == 0 ? "BT" : "SR";String redisKey = CommonConstant.COVID19_ID + "::" + prefix;LocalDate now = LocalDate.now();String yearStr = String.valueOf(now.getYear()).substring(2);// 获取当前编号信息 当前编号long currentNumber = getCodeInfo(redisKey, yearStr, isForeignInput);// 生成新编号return generateCode(yearStr, prefix, currentNumber - 1);}//生成唯一编码private StringBuffer createCode(Integer isForeignInput) {String prefix = isForeignInput == 0 ? "BT" : "SR";String redisKey = CommonConstant.COVID19_ID + "::" + prefix;LocalDate now = LocalDate.now();String yearStr = String.valueOf(now.getYear()).substring(2);// 获取当前编号信息 当前编号long currentNumber = getCodeInfo(redisKey, yearStr, isForeignInput);// 生成新编号return generateCode(yearStr, prefix, currentNumber);}// 获取当前编号信息,返回当前编号private long getCodeInfo(String redisKey, String currentYear, Integer isForeignInput) {if (redisTemplate.hasKey(redisKey)) {String code = (String) redisTemplate.opsForValue().get(redisKey);String[] parts = code.split(",");// 如果年份变化,重置编号if (!parts[0].equals(currentYear)) {return 0L;}return Long.parseLong(parts[1]);} else {// 查询数据库最新数据SampleCovid19 sample = baseMapper.selectPageIn(isForeignInput, CommonConstant.CDC_COVID19);if (sample == null) {return 0L;} else {String number = sample.getSampleNo().substring(sample.getSampleNo().lastIndexOf("-") + 1);return Long.parseLong(number);}}}// 生成编号private StringBuffer generateCode(String yearStr, String prefix, Long number) {StringBuffer code = new StringBuffer();code.append(CommonConstant.CDC_COVID19).append("-").append(yearStr).append("-").append(prefix).append("-").append(number + 1);return code;}// 更新Redis中的编号private void updateCodeInRedis(Integer isForeignInput, String code) {if (StringUtil.isBlank(code)) {return;}String prefix = isForeignInput == 0 ? "BT" : "SR";String redisKey = CommonConstant.COVID19_ID + "::" + prefix;String[] parts = code.split("-");String number = code.substring(code.lastIndexOf("-") + 1);redisTemplate.opsForValue().set(redisKey, parts[2] + "," + number);}//样本插入线程安全public String insertSample(SampleCovid19 sample) {String prefix = sample.getIsForeignInput() == 0 ? "BT" : "SR";String lockKey = CommonConstant.COVID19_CODE_LOCK + prefix;RLock lock = redissonClient.getLock(lockKey);boolean isLocked = false;try {isLocked = lock.tryLock(100, 60, TimeUnit.SECONDS);if (!isLocked) {throw new ServiceException("获取锁超时,请稍后重试");}String sampleNo = this.createCode(sample.getIsForeignInput()).toString();sample.setSampleNo(sampleNo);baseMapper.insert(sample);this.updateCodeInRedis(sample.getIsForeignInput(), sampleNo);log.info("数据添加成功,样本库编号: {}", sampleNo);return sampleNo;} catch (Exception e) {log.error("数据添加失败,样本编号生成已回滚", e);throw new ServiceException("数据插入异常,请联系管理员!");} finally {if (isLocked && lock.isHeldByCurrentThread()) {lock.unlock();}}}