• SpringBoot集成Redis业务功能 01、限制玩家积分的每日重置次数


    前言

    所有博客文件目录索引:博客目录索引(持续更新)

    业务背景

    最近参与弹幕游戏的后台开发,其中的需求是这样的:初始玩家进入直播间默认积分是300分,参与弹幕游戏发送指令操作就会去消耗积分,若是积分为0则无法参与游戏,所以就会有重置积分的需求,不过重置积分次数不是无限的,目前商讨方案是每天在300分以下只可重置3次。

    梳理下需求:一天,一个玩家,重置三次积分。


    方案思路

    对于限制玩家每日的重置次数方案如下:

    方案一:在数据库中存储用户Id及校验次数,定时任务根据每日时间定时删除。(比较繁琐,且不优雅,不推荐)

    • 这种方案的话,那么随着用户的增多,后期定时删除的任务也会更加繁重。

    方案二:使用redis缓存,以uid生成不同的key,value初始化为0,每次重置积分后加1,超过3次进行校验提示,根据业务需要对key设置过期时间(推荐)。

    那么此时就确定开发思路了:使用redis来进行实现。


    实现方案

    Redis实现

    采用redis来实现方案.。

    关于SpringBoot如何集成Redis见:SpringBoot整合篇 04、Springboot整合Redis

    思路

    1、从redis中获取指定key。

    2、若是没有key,说明今天的机会次数还没开始用,那么存储redis对应的value为1,设置过期时间为1天。

    2、若是有key,说明今日已经用了n次,接着判断这个n是否<3,若是的话,执行积分查询动作(业务操作);若已经>=3,那么直接返回即可。

    下面直接给出模板:修改其中注释的两个地方【修改1、修改2】后即可直接使用

    @Override
    public PlayerInfo resetIntegral(Long uid) {
        String LimitIntegralKey = "xxx" + uid; //修改1、redis存储key前缀(一般是业务名)+uid
        //首先走缓存
        Integer counts = redisCache.getCacheObject(LimitIntegralKey);
        //若是缓存没有找到(说明是新的一天了)设置缓存值
        if (ObjectUtils.isEmpty(counts)) {
            if (doResetIntegral(uid)) {
                redisCache.setCacheObject(LimitIntegralKey, 1, 1, TimeUnit.DAYS);
            }
        }else {
            //若是找到了:情况1:<=2则进行加一
            if (counts < 3) {
                if (doResetIntegral(uid)) {
                    redisCache.increment(LimitIntegralKey);
                }
            }
        }
        //获取玩家信息
        return this.getPlayerInfo(uid);
    }
    
    /**
         * 真正执行重置动作,返回是否重置积分成功!
         * @param uid 玩家的id
         * @return 执行成功与否
         */
    public boolean doResetIntegral(Long uid) {
        //修改2:重置积分业务
        return xx;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    另外说明以下,重置操作只有当积分<300的时候才能够成功,我们执行重置动作成功就根据执行sql语句影响成功与否作为最后的结果:

    • 对应的mapper的动态sql可以像我这么写
    
    <update id="resetPlayerIntegral" parameterType="long">
        update sys_player
        <trim prefix="SET" suffixOverrides=",">
            <if test="integral != null">integral = #{integral},if>
        trim>
        WHERE uid = #{uid} and integral < #{integral}
    update>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试

    首先找一条数据其积分为<300的,来进行测试:

    image-20220804095032574

    调用重置接口:

    image-20220804095225739

    image-20220804095525645

    此时再次调用重置积分,由于积分并不是小于300,那么在redis里的并不会进行计数+1操作,只有当玩家积分确实是小于300才表示确实重置成功了一次,直至一天三次。


    参考资料

    [1]. 一次简单的基于Redis的每日使用次数限制需求开发

    我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
    欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
    Q群:851968786 我们可以一起探讨学习
    注明:转载可,需要附带上文章链接

  • 相关阅读:
    软件测试面试题合集
    python数据分析及可视化(五)Pandas的介绍、Series和DataFrame的创建和增加、删除、更改、查找、重新索引、重新命名等基本操作
    智慧校园建设的进阶之路
    python实现五子棋-人机对战/人人对战(动图演示+源码分享)
    JPA中@ElementCollection使用
    anaconda环境迁移
    c++程序内存区域划分
    现在加入3D游戏建模有没有前景,次世代全流程来啦
    CAM350 - 打印装配图 for openpnp
    Javase | 集合-上
  • 原文地址:https://blog.csdn.net/cl939974883/article/details/126154579