set命令保证java中的redis分布式操作的原子性

网络看到很多各种方式的redis的使用,但是都无法避免原子操作的保证,看到很多各种麻烦的方式,很难实现,而且存在各种问题。redis自己提供了安全的原子操作方式。

redis命令:

SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
XX : 只在键已经存在时, 才对键进行设置操作

java中的使用:

引用spring-boot依赖,使用RedisTemplate.java类

	
	@Autowired
	private RedisTemplate<String, Object> redisTemplate;

    /**
	 * 尝试操作,线程安全的操作
     * outTime 设定超时时间,timeUnit 超时时间的单位 建议秒和毫秒
	 * @return true 操作成功, false 操作失败
	 */
	public Boolean tryLock(String lockKey, Object value, long outTime, TimeUnit timeUnit){
		try {
			ValueOperations realValueOperations = redisTemplate.opsForValue();
			Boolean status = realValueOperations.setIfAbsent(lockKey, value, outTime, timeUnit);
			return status;
		}catch (Exception e){
			// redis自身异常,并打印异常堆栈
			return false;
		}
	}

	/**
	 * 释放
	 * @return true 操作成功, false 操作失败
	 */
	public Boolean  releaseLock(String lockKey){
		try {
			return redisTemplate.delete(lockKey);
		}catch (Exception e){
			// redis自身异常,并打印异常堆栈
			return false;
		}
	}

ps:面试的时候,很多老的程序员都问怎么保证原子操作的,每次说set方法可以保证,这些人都一脸懵,redis自身已然提供了完善、简单的原子操作命令,相应的方法自然在java的内库中也存在,何必一直问这个问题呢,说了你还没听过,还说我不会...时代已经不再是处于setNX和Lua语言的时代了,大人,时代变了。下次再面试,遇到了直接代码糊脸上

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值