jedis实现的分布式锁--项目中循环锁的使用

前言

从项目来看,是8台服务器集群来实现的单体系统,前端是vue,后台是MVC+Oracle+Redis来实现,前后端分离,业务中涉及到分布式事务的场景就是对jedis的实例调用的情况。

业务场景

在移动端的页面有这样的业务,用户可以查询自己的抽奖的次数,而且这种抽奖是每24小时会发放一次机会,但是现在为了防止用户在某一时刻重复的提交请求查询抽奖的次数的情况,而业务里面涉及到倒计时的功能。业务落实到代码就是线程安全。

源码的逻辑

大概的逻辑是通过jedis来实现的,因为jedisPool产生的jedis实例是线程安全的,所以通过jedis实例的setLock(key,time,timeout)的方法对业务的安全做管理,下面是伪码

//判断是否获取锁
if(jedisService.loopLock()){
	//执行业务逻辑
}
loopLock(){
	//这里使用了原子类的Boolean类型来实现变量全局可见
	AotimaticBoolean lock = new AotimaticBoolean(jedis.setLock());
}

从其他文章看到关于jedis的jedisPool的使用

项目中其他的使用场景

1.场景:从获奖的名单中,显示最新的一百个中奖用户,并且中奖的为二等奖以上。
这种场景就是使用了jedis的lpop以及rpush,结合使用来实现的,逻辑大概是,判断用户是否获得奖励,如果获取奖励,判断是否是二等奖,如果是二等奖,就通过rpush放到redis中,如果长度为100个,新中奖并且是二等奖以上的用户,就rpush到队列里面,lange队列的范围,设置为1到100,llen队列长度。然后lpop出最后一个队列元素。
2.场景:每个月提示用户一次抽奖需要消耗的金币。
这种场景也是使用了redis的过期键的方法来实现的,这里只要设计的是针对提醒设计接口,调用接口触发判断是否提示消耗金币,使用hset来key是活动字段,value是map,key是userId,value是状态,是否提示。
最后附上redis的官网提供读者扩展,以及中文网站

猜你喜欢

转载自blog.csdn.net/weixin_30947631/article/details/85650405
今日推荐