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

本文介绍了在8台服务器集群的单体系统中,如何利用Jedis实现分布式锁来处理并发问题。特别是在用户查询抽奖次数的业务场景中,通过Jedis的setLock方法确保线程安全。此外,还分享了其他使用Jedis的场景,如管理中奖名单和用户抽奖提醒,展示了Jedis的lpop、rpush和过期键功能。总结提到,根据业务需求选择使用autoLock或loopLock,并强调了锁粒度的重要性。

前言

从项目来看,是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.场景:每个月提示用户一次抽奖需

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值