1 需求

  • 添加积分
    在用户签到的基础上添加用户积分,签到 1 天送 10 积分,连续签到 2 天送 20 积分,3 天送 30 积分,4 天以上均送 50 积分。
  • 积分排行榜

2 表设计

  • 利用MySQL保存积分数据

    这类似于一张日志表,因此数据量很大,想要统计用户积分做排行榜时,表数据可能如下:

3 实现TopN积分排行榜

MySQL 方案

  • 统计 SQL 获取排行榜前二十,如果重复排名,则后一位就靠后
  • 业务逻辑

缺点

看上去实现简单,数据量小时运行也没大问题,但当数据量超过一定量后,就会出现很大延迟,毕竟 MySQL 查询要消耗大量 IO。

因为 t_diner_points 本质上是一张日志表,记录了所有用户的积分记录,因此直接去数据库统计的话会有如下问题:
• SQL 编写复杂
• 数据量大,执行统计 SQL 慢
• 高并发下会拖累其他业务表的操作,导致系统变慢

Redis方案

使用 Sorted Sets 保存用户的积分总数,因为 Sorted Sets 有 score 属性,能够方便保存与读取,使用指令:

# 添加元素的分数,如果member不存在就会自动创建
ZINCRBY key increment member
# 按分数从大到小进行读取
zrevrange key
# 根据分数从大到小获取member排名
zrevrank key member
diner_points("diner:points", "diner用户的积分")

代码实现

添加积分记录

  • 当将用户积分记录插入数据库后,同时利用ZINCRBY指令,将数据存入 Redis,不使用ZADD是因为当用户不存在记录要插入,而且存在时需要将分数累加。

积分排行榜

从 Redis 根据 diner:points 的 key 按 score 的排序进行读取。使用 Redis 的ZREVRANGE命令,但ZREVRANGE只返回 member,不返回 score,在 RedisTemplate 的 ZSetOperations 中的 reverseRangeWithScores(key, start, end),start 从 0 开始,返回的是 member 和 score,底层是将ZREVRANGEZSCORE指令进行组装,使用起来非常方便。

  • 个人排名
    使用REVRANKZSCORE命令读取。

  • 从 redis 获取排行榜

优点

  • Redis 本身内存数据库,读取性能高
  • Sorted Sets 底层是 SkipList + ZipList 既能保证有序又能对数据进行压缩存储
  • Sorted Sets 操作简单,几个命令搞定

使用Redis实现用户积分及TopN排行榜功能相关推荐

  1. Redis 实现用户积分排行榜

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如"用户积分榜".如果没有实效性一直按照总榜来排,可能榜 ...

  2. 用redis做游戏内的各种排行榜功能

    一.前言 年前公司有很多活动要进行定制开发,活动中有游戏可以玩,最后对每个人的游戏分数进行排行展示,最终根据排名发放奖品.乍一看需求确实很简单,直接order by score一下不就完事了?需求确实 ...

  3. 使用Redis的有序集合Zset实现排行榜功能

    游戏中存在各种各样的排行榜,比如玩家的等级排名.分数排名等.玩家在排行榜中的名次是其实力的象征,位于榜单前列的玩家在虚拟世界中拥有无尚荣耀,所以名次也就成了核心玩家的追求目标. 一个典型的游戏排行榜包 ...

  4. 如何使用redis来实现常见的游戏排行榜

    前言 前面几篇文章给大家聊了下目前的常用的排行榜做法. 关于游戏排行榜设计开发的一些总结 游戏排行榜-跳表实现原理分析 那么这篇文章将给大家带来如何使用redis来实现常见的游戏排行榜功能. 为什么使 ...

  5. 用户积分和积分排行榜功能微服务实现

    文章目录 需求分析 什么是积分 积分的获取 为啥需要积分服务 数据库表 创建 ms-points 积分微服务 新增用户积分功能 用户积分实体 积分控制层 积分业务逻辑层 数据交互mapper层 网关 ...

  6. java排行榜任务积分redis_Redis 实现用户积分排行榜

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如"用户积分榜".如果没有实效性一直按照总榜来排,可能榜 ...

  7. 开发笔记:基于积分的游戏排行榜实现方式探讨

    竞技场往往是游戏中不可缺少的系统,根据不同的需求类型,竞技场排行榜的类型可以有如下划分: 1.按照排名更新的方式划分:依靠积分进行排行的竞技场,当玩家完成挑战后根据一定的规则进行双方积分的增减,依据新 ...

  8. 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?

    现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...

  9. php数值相加_PHP+Redis 有序集合实现 24 小时排行榜实时更新

    php中文网最新课程 每日17点准时技术干货分享 基本介绍 Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个 double 类型的分 ...

最新文章

  1. ccc计算机比赛如何报名,整理:加拿大的CCC是什么,怎么报名?
  2. 日事清【员工绩效】功能活动上线!
  3. OpenCV-裁剪图片
  4. nginx有10个以上参数rewrite的处理
  5. android 升级带服务端,安卓应用升级服务端设计思路
  6. 跟我一起学.NetCore之文件系统应用及核心浅析
  7. Mongodb -(3) replica set+sharding
  8. 奥鹏17计算机应用基础离线,奥鹏《计算机应用基础》离线
  9. java 用ajax更新表单,ajax刷新表格,该如何处理
  10. [转载] Sublime Text 3 插件 ClangFormat 格式化 C/C++版
  11. 微信公众号之接入微信公众号服务器开发(二)
  12. 【Linux】MySQL常用命令
  13. Visual Studio 2019 编译报错:错误 CS2012 无法打开 obj\Debug\xx.exe”进行写入 --“对路径xx.exe”的访问被拒绝)解决方法
  14. SSH服务移植到ARM单板
  15. Hadoop分析NCDC气象数据
  16. 第二、三代基因组测序数据混合拼接软件综述
  17. 小规模纳税人、一般纳税人、个体户的区别
  18. 安卓隐藏输入法键盘以及去除光标方法
  19. 程序员面试宝典3TH
  20. 博途V15.1专业版安装教程

热门文章

  1. git ssh 设置代理服务器_linux下设置 git ssh 代理
  2. Graphics2D 图片上绘制文字,并设置文字边框
  3. Altium Designer 17.1 奇特的短路错误
  4. 海盗王怪物和掉料查询工具V1.0 For 混沌界版
  5. 李彦宏内部信:呼唤狼性 淘汰小资
  6. 基于CT107S与LCD12864的多功能电子锁
  7. 【STM32系列】硬件介绍及固件安装
  8. Day26.爬虫案例一:拍拍网
  9. mysql的触发器实验报告_数据库原理实验报告s11-数据库触发器的创建.doc
  10. 背景属性:背景颜色、背景图片、背景图片平铺方式、背景图片定位、背景属性复合写法