案例实战之SortedSet⽤户积分实时榜单最佳实践

背景

⽤户玩游戏-积分实时榜单
IT视频热销实时榜单
电商商品热销实时榜单
⼀般的排⾏榜读多写少,可以对 master 进⾏写⼊操作,然后多个 slave 进⾏读取操作。如果是对象记得重写HashCode与Equals⽅法

UserPointVO

package net.xdclass.xdclassredis.vo;import java.util.Objects;public class UserPointVO {public UserPointVO(String username, String phone) {this.username = username;this.phone = phone;}private String username;private String phone;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserPointVO that = (UserPointVO) o;return Objects.equals(phone, that.phone);}@Overridepublic int hashCode() {return Objects.hash(phone);}
}

加入测试数据

@SpringBootTest
class XdclassRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid testData() {UserPointVO p1 = new UserPointVO("老王","13113");UserPointVO p2 = new UserPointVO("老A","324");UserPointVO p3 = new UserPointVO("老B","242");UserPointVO p4 = new UserPointVO("老C","542345");UserPointVO p5 = new UserPointVO("老D","235");UserPointVO p6 = new UserPointVO("老E","1245");UserPointVO p7 = new UserPointVO("老F","2356432");UserPointVO p8 = new UserPointVO("老G","532332");BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");operations.add(p1,324);operations.add(p2,542);operations.add(p3,52);operations.add(p4,434);operations.add(p5,1123);operations.add(p6,64);operations.add(p7,765);operations.add(p8,8);}
}

接⼝开发

返回榜单-从⼤到⼩排序
查看这个⼈的排名,从⼤到⼩,0就是第⼀
给某个⽤户加积分
查看某个⽤户的积分

import net.xdclass.xdclassredis.model.VideoDO;
import net.xdclass.xdclassredis.util.JsonData;
import net.xdclass.xdclassredis.vo.UserPointVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundZSetOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Set;@RestController
@RequestMapping("api/v1/rank")
public class RankController {@Autowiredprivate RedisTemplate redisTemplate;private static final String DAILY_RANK_KEY = "video:rank:daily";/*** 返回全部榜单,从大到小* @return*/@RequestMapping("real_rank1")public JsonData realRank1() {BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");Set<UserPointVO> set = operations.reverseRange(0, -1);return JsonData.buildSuccess(set);}/*** 返回全部榜单,从小到大* @return*/@RequestMapping("real_rank2")public JsonData realRank2() {BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");Set<UserPointVO> set = operations.range(0, -1);return JsonData.buildSuccess(set);}/*** 返回全部榜单,从大到小,指定长度* @return*/@RequestMapping("real_rank3")public JsonData realRank3() {BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");Set<UserPointVO> set = operations.reverseRange(0, 3);return JsonData.buildSuccess(set);}/*** 查看某个用户的排名* @param phone* @param name* @return*/@RequestMapping("find_myrank")public JsonData realMyRank(String phone,String name) {BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");UserPointVO userPointVO = new UserPointVO(name,phone);long rank = operations.reverseRank(userPointVO);return JsonData.buildSuccess(++rank);}/*** 加积分* @param phone* @param name* @return*/@RequestMapping("uprank")public JsonData uprank(String phone,String name,int point) {BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");UserPointVO userPointVO = new UserPointVO(name,phone);operations.incrementScore(userPointVO,point);Set<UserPointVO> set = operations.range(0, -1);return JsonData.buildSuccess(set);}/*** 查看个人的积分* @param phone* @param name* @return*/@RequestMapping("mypoint")public JsonData mypoint(String phone,String name) {BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");UserPointVO userPointVO = new UserPointVO(name,phone);double score = operations.score(userPointVO);return JsonData.buildSuccess(score);}}

Redis(案例六:ZSet数据)相关推荐

  1. 2021年大数据Spark(四十一):SparkStreaming实战案例六 自定义输出 foreachRDD

    目录 SparkStreaming实战案例六 自定义输出-foreachRDD 需求 注意: 代码实现 SparkStreaming实战案例六 自定义输出-foreachRDD 需求 对上述案例的结果 ...

  2. 19.2、Javaweb案例_Servlet代码抽取优化分页数据redis缓存优化分页数据展示

    优化Servlet 目的 减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方 ...

  3. Redis重点六:怎么保证redis挂掉之后重启数据可以恢复?

    redis的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的? redis如果仅仅只是将数据缓存在内存里面,如果redis宕机了,再重启,内存里的数据就全部都弄丢了啊 ...

  4. redis的基本操作And数据持久化方式以及redis实现mybatis缓存

    Redis 1.NoSql # NoSql(Not Only Sql),不仅仅是sql,泛指非关系型数据库 2.NoSql的诞生 随着互联网web2.0网站的兴起,传统的关系型数据库在高并发和特大规模 ...

  5. redis介绍命令性能数据及监控缓存穿透

    上一章: linux安装部署redis&配置远程连接_傲娇的喵酱的博客-CSDN博客 一.redis介绍 Redis是C语言写的,官方提供的数据为100000+的QPS(每秒查询率) Redi ...

  6. springboot整合redis案例——点赞取消点赞

    目录 springboot与缓存 JSR-107 Spring缓存抽象 重要概念和缓存注解 springboot整合redis 案例一:Redis是实现点赞.取消点赞 一.Redis 缓存设计及实现 ...

  7. Redis-学习笔记06【Redis案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] Redis-学习笔记01[Redis环境搭建] Redis-学习笔记02[Redis命令操作] Redis-学习笔记03[Redis持久化] Redi ...

  8. redis基础命令和数据操作命令学习笔记

    redis基础命令和数据操作命令学习笔记 基础命令 安装成功后,redis的启动命令:先修改配置文件.将服务改成默认运行.然后以配置文件启动服务 redis-server config/redis-c ...

  9. redis常用的五大数据类型和redis新增类型以及对应的命令

    常用五大数据数据类型 1.1 String 类型 String类型是一个key对应一个value. String类型是二进制安全的,也就是Redis的string可以包含任务数据.比如jpg图片或者序 ...

最新文章

  1. 计算机视觉之一:特征检测
  2. Caused by: java.lang.NoClassDefFoundError: Lorg/sl
  3. java 高级数据类型_java 数据类型(上):分类
  4. ITIL内部培训资料(IT服务持续性管理(IT Service Continuity Management) )
  5. java 高级泛型_Java 泛型高级
  6. Django 优秀资源大全项目资源非 Python 包工具贡献
  7. sqlite3 可视化工具 linux,【SQLite3下载】SQLite3可视化工具 v3 3.27.2 官方版-开心电玩...
  8. Linux安装python第三方库
  9. 前端UI配色辅助RGB颜色调色板配色表HTML源码
  10. 求职面试PPT模板推荐
  11. Windows驱动程序开发 - 初识驱动
  12. 百度网盘html资源,百度网盘目录索引搭建教程:如何把百度网盘文件做成在线html目录...
  13. 电视盒子显示ntp服务器异常,云计算-更换VRM主节点所在服务器主板后,出现VRM与NTP服务器状态异常的处理方法...
  14. 关闭小米系统自动更新通知
  15. 【新智元峰会】德国AI教皇盛赞中国人工智能,25位AI领袖强势打造中国新智极...
  16. java FTP连接时出现“227 Entering Passive Mode”的解决方法
  17. 润和软件携手高鸿信安助力构建可信计算生态
  18. Linux如何卸载软件
  19. docker搭建fabric
  20. 追光的人终会光芒万丈

热门文章

  1. laravel 模板继承_Laravel框架模板之公共模板、继承、包含实现方法分析
  2. 2019年第十届蓝桥杯 C / C ++省赛 B 组真题题解
  3. P4173 残缺的字符串
  4. 数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem
  5. CF1415D:XOR-gun(异或)
  6. YBTOJ洛谷P4068:数字配对(网络流)
  7. YbtOJ-毒瘤染色【LCT】
  8. P3639-[APIO2013]道路费用【最小生成树】
  9. P3288-[SCOI2014]方伯伯运椰子【0/1分数规划,负环】
  10. P7099-[yLOI2020]灼【数学期望,结论】