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

结果结果如下

相关推荐
unable code2 小时前
攻防世界-Misc-pdf
网络安全·ctf·misc·1024程序员节
第七序章4 小时前
【C + +】C + + 11(中)——Lambda 表达式 + 可变参数模板
c语言·c++·算法·1024程序员节
qq19257230274 小时前
23种设计模式
设计模式·1024程序员节
美狐美颜sdk7 小时前
直播美颜SDK特效功能实战:从API调用到效果调优的全过程
人工智能·1024程序员节·美颜sdk·直播美颜sdk·第三方美颜sdk
码力引擎15 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
代码村新手1 天前
数据结构-链表
1024程序员节
第七序章1 天前
【C + +】C++11 (下) | 类新功能 + STL 变化 + 包装器全解析
c语言·数据结构·c++·人工智能·哈希算法·1024程序员节
努力学习的小廉1 天前
初识MYSQL —— 基本查询
数据库·mysql·1024程序员节
码力引擎1 天前
【零基础学MySQL】第四章:DDL详解
数据库·mysql·1024程序员节
少林码僧1 天前
1.1 大语言模型调用方式与函数调用(Function Calling):从基础到实战
人工智能·ai·语言模型·自然语言处理·llm·1024程序员节