redis的使用场景-分布式锁
创始人
2024-12-14 03:05:57
0

使用redis的setnx命令放入数据并用此数据当锁完成业务(但是如果用户操作途中出现异常导致超出指定时间会出现问题)

@Service public class StockService {      @Autowired     private StockDao stockDao;	//mapper注入     @Autowired     private StringRedisTemplate redisTemplate;	//使用redis方法     //     public String decrement(Integer productid) {         ValueOperations opsForValue = redisTemplate.opsForValue();         //1.获取共享锁资源(通过进行redis放入数据的方式,如果放入成功说明redis没有该数据)         Boolean flag = opsForValue.setIfAbsent("product::" + productid, "1111", 30, TimeUnit.SECONDS);         //表示获取锁成功         if(flag) {             try {                 //根据id查询商品的库存                 int num = stockDao.findById(productid);                 if (num > 0) {                     //修改库存                     stockDao.update(productid);                     System.out.println("商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个");                     return "商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个";                 } else {                     System.out.println("商品编号为:" + productid + "的商品库存不足。");                     return "商品编号为:" + productid + "的商品库存不足。";                 }             }finally {                 //释放锁资源(删除放入的该数据,然后准备开始下一次抢锁)                 redisTemplate.delete("product::"+productid);             }         }else{             //休眠100毫秒 在继续抢锁             try {                 Thread.sleep(100);             } catch (InterruptedException e) {                 throw new RuntimeException(e);             }             return decrement(productid);         }     } }

看门狗(改善版,解决了超时的bug)

引入依赖

             org.redisson             redisson             3.24.3 

编写配置类

@Configuration public class RedissonConfig {      @Bean     public RedissonClient redisson(){         Config config = new Config();         //连接redis集群         config.useClusterServers()          use "rediss://" for SSL connection         .addNodeAddress("redis://127.0.0.1:7181","","","");         //连接单机         config.useSingleServer().setAddress("redis://192.168.111.188:6379");         RedissonClient redisson = Redisson.create(config);         return redisson;     } }

业务代码

@Service public class StockService {      @Autowired     private StockDao stockDao;	//注入mapper     @Autowired     private RedissonClient redisson;	//注入看门狗      //     public String decrement(Integer productid) {         RLock lock = redisson.getLock("product::" + productid);	//获取锁资源         lock.lock();	//上锁         try {             //根据id查询商品的库存: 提前预热到redis缓存中             int num = stockDao.findById(productid);             if (num > 0) {                 //修改库存---incr---定时器[redis  数据库同步]                 stockDao.update(productid);                 System.out.println("商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个");                 return "商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个";             } else {                 System.out.println("商品编号为:" + productid + "的商品库存不足。");                 return "商品编号为:" + productid + "的商品库存不足。";             }         }finally {             lock.unlock();	//释放锁资源         }     } }

相关内容

热门资讯

突发!天天贵阳app修改器,天... 突发!天天贵阳app修改器,天天海南家园辅助(原来有挂插件)-哔哩哔哩进入游戏-大厅左侧-新手福利-...
据权威媒体报道!随意玩辅助器透... 据权威媒体报道!随意玩辅助器透视挂,新西部外卦辅助器(果然真的有挂)-哔哩哔哩;1、随意玩辅助器透视...
此事迅速冲上热搜!微乐自建房脚... 此事迅速冲上热搜!微乐自建房脚本免费下载,欢聚水鱼智能辅助教程(本来是真的脚本)-哔哩哔哩微乐自建房...
昨日!心悦俱乐部游戏辅助,欢乐... 昨日!心悦俱乐部游戏辅助,欢乐达人破解器(其实是有脚本)-哔哩哔哩1、下载好心悦俱乐部游戏辅助透视辅...
现就发布提示!广西友乐解码器辅... 现就发布提示!广西友乐解码器辅助器,圣游牛牛辅助器(果然有挂修改器)-哔哩哔哩1、玩家可以在广西友乐...
据相关数据显示!边锋辅助脚本,... 据相关数据显示!边锋辅助脚本,决战卡五星游戏辅助器(果然是真的脚本)-哔哩哔哩亲,关键说明,决战卡五...
连日来!微信小程序多乐辅助器免... 连日来!微信小程序多乐辅助器免费下载,人海大厅挂件怎么买(切实真的有修改器)-哔哩哔哩一、微信小程序...
最新消息!潮汕汇游戏辅助,湖北... 最新消息!潮汕汇游戏辅助,湖北逍遥辅助(都是真的有下载)-哔哩哔哩1、超多福利:超高返利,海量正版游...
经核实!广丰510k辅助,心悦... 经核实!广丰510k辅助,心悦游戏辅助(好像是有插件)-哔哩哔哩一、心悦游戏辅助可以开透视的定义与意...
经核实!南通长牌有挂吗,蜀山辅... 经核实!南通长牌有挂吗,蜀山辅助工具(确实真的是有脚本)-哔哩哔哩进入游戏-大厅左侧-新手福利-激活...