Redis 场景

1.分布式锁实现

上锁:setnx key value

解锁:del key

超时机制:set key value nx ex time

基于此思路实现伪代码:

public class RedisLock{@Autowiredprivate static RedisTemplate rt;  private static final LOCK_WORD = "lock";private static final int TIME_OUT = 3;public void tryLock(String uuid ){//String uuid = UUID.get();boolean lock = rt.setnx(LOCK_WORD,uuid,TIME_OUT,TimeUnit.SECOND);if(lock){			//	没有考虑可重入锁设计try{do(业务逻辑)}finally{	//	需要保证原子操作String tempLock = rt.get(LOCK_WORD);if(uuid.equals(tempLock)){rt.del(LOCK_WORD);}}       }else {try{Thread.sleep(100);tryLock();	//	递归调用可能会爆栈,应该实现一个等待队列}catch(InterruptedException e){e.printStackTrace();}}}
}

实际实现代码

@GetMapping("testLock")
public void testLock() {// 1 获取锁,setIfAbsent,同时设置3秒过期,以避免中间出现异常,导致锁一直无法释放Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "111", 3, TimeUnit.SECONDS);// 2 获取锁成功,查询num的值if (lock) {Object value = redisTemplate.opsForValue().get("num");// 2.1 判断num为空,returnif (StringUtils.isEmpty(value)) {return;}// 2.2 有值就转成intint num = Integer.parseInt(value + "");// 2.3 把redis的num加1redisTemplate.opsForValue().set("num", ++num);// 2.4 释放锁,删除lockString lockUuid = (String) redisTemplate.opsForValue().get("lock");if ("111".equals(lockUuid)) {redisTemplate.delete("lock");}} else {// 3 获取锁失败,每隔0.1秒再获取try {Thread.sleep(100);testLock();} catch (InterruptedException e) {e.printStackTrace();}}
}

2.秒杀场景(解决超卖)

思路:

  1. 维护一个用户 id,商品 id,库存信息,秒杀成功名单
  2. 先确认库存正常,即秒杀开始
  3. 先查询 uid 是否在成功名单,避免重复秒杀
  4. 再查询库存是否充足,
  5. 利用事务完成: 扣除库存、添加名单,秒杀成功

伪代码

@Autowired
private RedisTemplate rt;public boolean doSecondKill(String uid,String productId){String successListKey = "User-"+productId;String invenKey = "Inventory-"+productId;if(rt.get(invenKey)==null){print("秒杀尚未开启");return false;}if(rt.sismember(successListKey,uid)){print("不可重复秒杀");return false;}if(Integer.parseInt(rt.get(invenKey))<=0){print("秒杀已结束");return false;}Transaction multi = rt.multi();multi.decr(invenKey);		//	扣除库存multi.sadd(successListKey,uid);	//	添加成功秒杀List<Object> result = multi.exec();if(result==null || result.size()==0){print("秒杀失败");return false;}print("秒杀成功");return true;
}

代码实现

public class SecKill {public static void main(String[] args) {Jedis jedis = new Jedis();}public static boolean doSecKill(String uid, String proid) throws IOException {//  1.uid和proid判断if (uid == null || proid == null) {return false;}// 2.连接jedis,使用连接池,避免超时JedisPool jedisPool = new JedisPool();Jedis jedis = jedisPool.getResource();//  3. 拼接keyString invenKey = "sk:" + proid + "qt";String userKey = "sk:" + proid + "qt";//  监视库存jedis.watch(invenKey);//  4. 判断是否开始String inven = jedis.get(invenKey);if (inven == null) {System.out.println("秒杀尚未开始");jedis.close();return false;}//  5.判断是否抢过if (jedis.sismember(userKey, uid)) {System.out.println("不可重复参与!");jedis.close();return false;}//  6.判断库存是否充足if (Integer.parseInt(jedis.get(invenKey)) <= 0) {System.out.println("秒杀已结束,失败");jedis.close();return false;}//  multi事务操作Transaction multi = jedis.multi();multi.decr(invenKey);multi.sadd(userKey, uid);List<Object> result = multi.exec();if (result == null || result.size() == 0) {System.out.println("秒杀失败");jedis.close();return false;}System.out.println("秒杀成功");jedis.close();return true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c语言进阶】字符函数和字符串函数知识总结

字符函数和字符串函数 前期背景求字符串长度函数strlen函数strlen函数三种模拟实现 长度不受限制的字符串函数strcpy函数strcpy函数模拟实现strcat函数strcat函数模拟实现strcmp函数strcmp函数模拟实现 长度受限制的字符串函数strncpy函数strncpy函数模拟实现strncat函数strnca…

粘包处理的方式

为什么出现粘包&#xff1a; 发送端在发送的时候由于 Nagel 算法的存在会将字节数较小的数据整合到一起发送&#xff0c;导致粘包&#xff1b;接收端不知道发送端数据的长度&#xff0c;导致接收时无法区分数据&#xff1b; 粘包处理的方式&#xff1a; 通过在数据前面加上报…

最新版本docker 设置国内镜像源 加速办法

解决问题:加速 docker 设置国内镜像源 目录: 国内加速地址 修改方法 国内加速地址 1.Docker中国区官方镜像 https://registry.docker-cn.com 2.网易 http://hub-mirror.c.163.com 3.ustc https://docker.mirrors.ustc.edu.cn 4.中国科技大学 https://docker.mirrors…

windows11打不开任务管理器,

目录 第一章、win11系统任务管理器打不开&#xff1f;第二章、解决方式修改注册表 友情提醒&#xff1a; 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、win11系统任务管理器打不开&#xff1f; Win11任务管理…

Docker 安全及日志管理与https部署

容器的安全性问题的根源在于容器和宿主机共享内核。如果容器里的应用导致Linux内核崩溃&#xff0c;那么整个系统可能都会崩溃。与虚拟机是不同的&#xff0c;虚拟机并没有与主机共享内核&#xff0c;虚拟机崩溃一般不会导致宿主机崩溃。 Docker 容器与虚拟机的区别 虚拟机通…

FPGA+EMMC 8通道存储小板

FPGA 采用XILINX公司A7100作为主芯片 AD采用AD7606及一款陀螺仪传感器&#xff0c;可以实时存储到EMMC&#xff0c;系统分为采集模式及回放模式 通过232接口对工作模式进行配置&#xff0c;采样率可以动态配置 回放采用W5100S通过TCP协议进行回放数据

二、使用运行自己的docker python容器环境

第一篇参考&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/131953866 运行容器同时执行命令或脚本 1&#xff09;这是打开一个对外的jupyter notebook容器环境 docker run -d --name my_container -p 8090:8888 mynewpythonimage jupyter notebook --…

linux------解压与压缩

在windows系统下&#xff0c;我们接触最多的压缩格式是 rar 或 zip &#xff0c;但在Linux上使用最多的压缩格式是 zip 和 tar.gz 。当然不用担心&#xff0c;Linux上的压缩格式放在windows系统下都是可以正常打开的。 PS: Linux不支持 Windows下的 RAR 格式的压缩文件。Window…

【C语言进阶篇】回调函数都学了吧!那么用冒泡排序实现qsort函数你会嘛?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; qsort 和 冒泡排序的区别&#x1f4d1; qsort 的特点&#x1f4d1; 冒泡排序 …

56. 合并区间

题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;inter…

JS逆向之猿人学爬虫第20题-wasm

文章目录 题目地址sign参数分析python算法还原往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/20第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 sign参数分…

[Linux]进程间通信

[Linux]进程间通信 文章目录 [Linux]进程间通信进程间通信什么是进程间通信进程间通信的目的进程间通信的本质为什么存在进程间通信进程间通信的分类 管道什么是管道匿名管道本质pipepipe的使用匿名管道读写情况匿名管道的特征 命名管道本质命令行创建命名管道创建和删除命名管…

如何在电脑上查看连接过的wifi信息?

忘记wifi密码&#xff1f;想要看看wifi信息&#xff1f; 我想这篇文章可以帮到你O(∩_∩)O哈哈~。 通过网络连接中心查看 电脑上找到“网络和共享中心” 点击连接的wifi名称 点击无线属性 在安全选项中就有密码 通过电脑命令行工具查看推荐 通过winr快捷键打开电脑运…

随手笔记——根据点对来估计相机的运动综述

随手笔记——根据点对来估计相机的运动综述 说明计算相机运动 说明 简单介绍3种情况根据点对来估计相机运动所使用的方法 计算相机运动 有了匹配好的点对&#xff0c;接下来&#xff0c;要根据点对来估计相机的运动。这里由于相机的原理不同分为&#xff1a; 当相机为单目时…

剑指YOLOv5改进主干EfficientNet模型:重新思考卷积神经网络的模型扩展,YOLOv5提升性能

💡本篇内容:剑指YOLOv5改进主干EfficientNet模型:重新思考卷积神经网络的模型扩展,YOLOv5提升性能 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv5原创改进》只更新改进 YOLOv5 模型的内容 💡…

vim工具 windows系统使用

vim常用命令&#xff1a; 编辑–>输入&#xff1a; i: 在当前光标所在字符的前面&#xff0c;转为输入模式&#xff1b; 粘贴命令 p p: 如果删除或复制为整行内容&#xff0c;则粘贴至光标所在行的下方&#xff0c;如果复制或删除的内容为非整行&#xff0c;则粘贴至光标所…

手动搭建gateway,项目集成gateway实现Token效果

目录 背景步骤1、首先创建springboot项目2、引入依赖3、配置文件&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;超级重要&#xff01;&#xff01;&#xff01;根据自己的需要进行配置&#xff09;4、相关类我们在服务中进行的白名单中接口的操作如…

信驰达推出RTL8720DN系列2.4G和5G双频Wi-Fi+蓝牙二合一模块

近日&#xff0c;领先的无线物联网通信模块厂商深圳信驰达科技RF-star推出了基于RTL8720DN SoC的2.4 GHz和5 GHz双频Wi-Fi蓝牙二合一模块—RF-WM-20DNB1。 图 1信驰达RF-WM-20DNB1 Wi-Fi模块 RF-WM-20DNB1是一款低功耗单芯片无线蓝牙和Wi-Fi组合模块&#xff0c;支持双频(2.4 G…

详细介绍如何使用HuggingFace和PyTorch进行医学图像分割-附源码

医学图像分割是一种创新过程,使外科医生能够拥有虚拟的“X 射线视觉”。它是医疗保健领域非常有价值的工具,可提供非侵入性诊断和深入分析。考虑到这一点,在这篇文章中,我们将探索威斯康辛大学麦迪逊分校胃肠道图像分割Kaggle 挑战数据集。作为该项目的一部分,我们将使用 …

爬虫005_python类型转换_其他类型转换为整型_转换为Float类型_转换为字符串_转换为布尔值---python工作笔记023

首先来看,字符串转换成int 很简单 float转换成int 会把小数点后面的内容丢掉 boolean转换为int true是1 false 是0 然后字符串转换为int,要注意 不能有特殊字符比如1.23 中有点 就报错 上面字符串12ab,有ab也报错 看上面