我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis分布式缓存怎么实现微信抢红包

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis分布式缓存怎么实现微信抢红包

本篇内容主要讲解“Redis分布式缓存怎么实现微信抢红包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis分布式缓存怎么实现微信抢红包”吧!

一、场景分析

微信抢红包已经在我们生活中很常见的场景了,特别是年底公司开年会和春节2个时间段,长辈领导都发红包,手都点抽筋了,也没抢到多少。

在这段时间里,对于单个群里的单个红包,qps也是上千的,对于整个微信红包系统,高峰的并发量是上亿的。

高峰的抢红包有3大特点:

  1. 包红包的人多:也就是创建红包的任务比较多,即红包系统是以单个红包的任务来区分,特点就是在高峰期红包任务多。

  2. 抢红包的人更多:当你发红包出去后,是几十甚至几百人来抢你的红包,即单红包的请求并发量大。

  3. 低延迟:当你发现红包时,要越快抢到越开心,所以要求抢红包的响应速度要快,一般1秒响应。

二、技术方案

包红包

先把金额拆解为小金额的红包,例如 总金额1000元,发10个,用户在点保存的时候,就自动拆解为10个随机小红包。

这里的存储就是个难题,多个金额(例如10个小金额的红包)如何存储?

Redis分布式缓存怎么实现微信抢红包

抢红包

高并发的抢红包时核心的关键技术,就是控制各个小红包的操作的原子性。

例如 10个红包在100人的群里被抢,10个红包被抢走一个的同时要红包的库存减1,即剩下19个。在整个过程中抢走一个和红包库存减1个是一个原子操作。

list的pop操作弹出一个元素的同时会自动从队列里面剔除该元素,它是一个原子性操作。

Redis分布式缓存怎么实现微信抢红包

三、案例实战

包红包

    @GetMapping(value = "/set")    public long setRedpacket(int total, int count) {        //拆解红包        Integer[] packet= this.splitRedPacket(total,count);        //为红包生成全局唯一id        long n=this.incrementId();        //采用list存储红包        String key=RED_PACKET_KEY+n;        this.redisTemplate.opsForList().leftPushAll(key,packet);        //设置3天过期        this.redisTemplate.expire(key,3, TimeUnit.DAYS);        log.info("拆解红包{}={}",key,packet);        return n;    }

拆解红包

public  Integer[] splitRedPacket(int total, int count) {    int use = 0;    Integer[] array = new Integer[count];    Random random = new Random();    for (int i = 0; i < count; i++) {        if (i == count - 1)            array[i] = total - use;        else {            // 红包随机金额浮动系数            int avg = (total - use) * 2 / (count - i);            array[i] = 1 + random.nextInt(avg - 1);        }        use = use + array[i];    }    return array;}

抢红包 

        @GetMapping(value = "/rob")    public int rob(long redid,long userid) {        //第一步:验证该用户是否抢过        Object packet=this.redisTemplate.opsForHash().get(RED_PACKET_CONSUME_KEY+redid,String.valueOf(userid));        if(packet==null){            //第二步:从list队列,弹出一个红包            Object obj=this.redisTemplate.opsForList().leftPop(RED_PACKET_KEY+redid);            if(obj!=null){                //第三步:抢到红包存起来                this.redisTemplate.opsForHash().put(RED_PACKET_CONSUME_KEY+redid,String.valueOf(userid),obj);                log.info("用户={}抢到{}",userid,obj);                //TODO 异步把数据落地到数据库上                                return (Integer) obj;            }            //-1 代表抢完            return -1;        }        //-2 代表已抢        return -2;    }

到此,相信大家对“Redis分布式缓存怎么实现微信抢红包”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis分布式缓存怎么实现微信抢红包

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis分布式缓存怎么实现微信抢红包

本篇内容主要讲解“Redis分布式缓存怎么实现微信抢红包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis分布式缓存怎么实现微信抢红包”吧!一、场景分析微信抢红包已经在我们生活中很常见的场
2023-06-22

基于Redis缓存怎么实现分布式锁

本篇内容介绍了“基于Redis缓存怎么实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是分布式锁首先我们先来简单了解一下什么是
2023-06-19

Redis分布式缓存与秒杀怎么实现

本篇内容介绍了“Redis分布式缓存与秒杀怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、单点Redis的问题1、数据丢失问题Re
2023-07-05

ehcache怎么实现分布式缓存

要实现分布式缓存,可以使用Ehcache的Terracotta插件。Terracotta是一个开源的分布式缓存解决方案,可以与Ehcache集成,提供分布式缓存的功能。以下是实现分布式缓存的步骤:1. 添加依赖:在项目的pom.xml文件中
2023-08-26

怎么使用SignalR和Redis实现实时分布式缓存

要实现实时分布式缓存,可以结合使用SignalR和Redis。首先,通过SignalR建立一个实时通信的连接,可以让不同的服务之间实时地传递消息和数据。然后,借助Redis作为分布式缓存存储,可以在不同的服务之间共享缓存数据。具体步骤
怎么使用SignalR和Redis实现实时分布式缓存
2024-05-09

C#中怎么使用Couchbase实现分布式缓存

C#中怎么使用Couchbase实现分布式缓存,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、简介 目前C#业界使用得最多的 Cache 系统主要是 Memcached和
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录