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

举报
长路 发表于 2022/11/28 19:54:18 2022/11/28
1k+ 0 0
【摘要】 博客目录索引(持续更新)

@[toc]

前言

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

业务背景

最近参与弹幕游戏的后台开发,其中的需求是这样的:初始玩家进入直播间默认积分是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;
}

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

  • 对应的mapper的动态sql可以像我这么写
<!--   在xml中使用&lt;来替代<号  -->
<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 &lt; #{integral}
</update>

测试

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

image-20220804095032574

调用重置接口:

image-20220804095225739

image-20220804095525645

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


参考资料

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。