springboo单机多线程高并发防止重复消费的redis方案

springboo单机多线程高并发防止重复消费的redis方案

仅提供方案与测试。

想法:第一次收到userCode时,检查是否在redis中有,如果有,就表明已经消费了,返回抢单失败;否则,就去消费,顺便写入redis缓存中。

1、单独做redis锁,测试(失败案例)

java 复制代码
	public static int countNum = 0;
    public static int countFailNum = 0;
    @Anonymous
    @GetMapping("/testRedis")
    public AjaxResult testRedis(String userCode){
        String key = "sign:"+userCode;
        if (redisCache.hasKey(key)){
            ++countFailNum;
            System.out.println("抢单成功,人数是"+countNum+"  | 抢单失败的人数是"+countFailNum);
            return AjaxResult.error("抢单失败");
        }
        redisCache.setCacheObject(key,userCode,10, TimeUnit.MINUTES);
        ++countNum;
        System.out.println("抢单成功,人数是"+countNum+"  | 抢单失败的人数是"+countFailNum);
        return AjaxResult.success("抢单成功,人数是"+countNum);
    }


很明显,单纯的redis,根本扛不住基础的并发请求

2、线程锁+redis锁,测试(正确方案)

给方法加线程锁 关键字:synchronized

结果结果如下

相关推荐
数据皮皮侠AI11 小时前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节
开开心心就好1 天前
系统清理工具清理缓存日志,启动卸载管理
linux·运维·服务器·神经网络·cnn·pdf·1024程序员节
Evan东少4 天前
[踩坑]笔记本Ubuntu20.04+NvidiaRTX5060驱动+cuda+Pytorch+ROS/Python实现人脸追踪(环境准备)
1024程序员节
不爱编程的小陈5 天前
C/C++每日面试题
面试·职场和发展·1024程序员节
开开心心就好5 天前
右键菜单管理工具,添加程序自定义名称位置
linux·运维·服务器·ci/cd·docker·pdf·1024程序员节
码农三叔6 天前
(4-2-05)Python SDK仓库:MCP服务器端(5)Streamable HTTP传输+Streamable HTTP传输
开发语言·python·http·大模型·1024程序员节·mcp·mcp sdk
西幻凌云10 天前
初始——正则表达式
c++·正则表达式·1024程序员节
启芯硬件10 天前
电源XL6009E1的dieshot细节分析-芯片设计干货
大数据·经验分享·硬件工程·1024程序员节
一颗青果12 天前
单例模式 | 死锁
linux·服务器·单例模式·1024程序员节