The code is as follows: Among them, if you want to add an expiration time when locking, don't use opsForValue(), just change it to boundValueOps.
@ Slf4j @Component public class RedisService { @Autowired private StringRedisTemplate stringRedisTemplate; /*** * lock * @param key * @param value current time + timeout * @return lock returns true */ public boolean lock(String key,String value){ if(stringRedisTemplate.opsForValue().setIfAbsent(key,value)){//setNX 返回boolean return true; } //if the lock times out*** String currentValue = stringRedisTemplate.opsForValue().get(key); if(!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue)<System.currentTimeMillis()){ //time to acquire the last lock String oldvalue = stringRedisTemplate.opsForValue().getAndSet(key,value); if(!StringUtils.isEmpty(oldvalue)&&oldvalue.equals(currentValue)){ return true; } } return false; } /*** * Unlock * @param key * @param value * @return */ public void unlock(String key,String value){ try { String currentValue = stringRedisTemplate.opsForValue().get(key); if(!StringUtils.isEmpty(currentValue)&¤tValue.equals(value)){ stringRedisTemplate.opsForValue().getOperations().delete(key); } } catch (Exception e) { log.error("unlock exception"); } } }