java利用redis实现排行榜_Redis实现排行榜
ZSet有序集合
redis的有序集合与集合一样也是String类型元素的集合,不允许有重复的元素。
每一个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合中的成员是唯一的,但是分数可以重复。
集合是通过哈希表实现的,集合中的最大元素是2的32次方减1。Zset是有序且不重复的。
注意:默认排序从小到大。
ZSet命令
1、赋值
127.0.0.1:6379> zadd rank 90 c++ 80 java 70 php 60 lua
(integer) 4
创建了一个key(名字)为rank的排行版。
2、修改分数
127.0.0.1:6379> zincrby rank 10 c++
"10"
3、通过索引区间返回指定区间内的成员
127.0.0.1:6379> zrange rank 0 -1
1) "lua"
2) "php"
3) "java"
4) "c++"
127.0.0.1:6379> zrange rank 0 1
1) "lua"
2) "php"
4、通过索引区间返回指定区间内的成员及分数
127.0.0.1:6379> zrange rank 0 -1 withscores
1) "lua"
2) "60"
3) "php"
4) "70"
5) "java"
6) "80"
7) "c++"
8) "90"
5、从大到小查询
127.0.0.1:6379> zrevrange rank 0 1 withscores
1) "c++"
2) "90"
3) "java"
4) "80"
6、获取成员数量
127.0.0.1:6379> zcard rank
(integer) 4
7、计算指定区间分数的成员数
127.0.0.1:6379> zcount rank 80 90
(integer) 2
注意这个最小分数和最大分数都是闭区间。
8、返回指定成员的索引(排名)
127.0.0.1:6379> zrank rank c++
(integer) 3
127.0.0.1:6379> zrevrank rank c++
(integer) 0
zrank是从小到大的排名,zrevrank 是从大到小的。
9、返回指定分数区间的成员
127.0.0.1:6379> zrangebyscore rank 80 90
1) "java"
2) "c++"
127.0.0.1:6379> zrevrangebyscore rank 90 80 withscores
1) "c++"
2) "90"
3) "java"
4) "80"
zrangebyscore的参数是最低分最高分,zrevrangebyscore 的参数是最高分最低分,同样是闭区间。
10、移除指定域成员
127.0.0.1:6379> zrem rank lua
(integer) 1
127.0.0.1:6379> zrange rank 0 -1
1) "php"
2) "java"
3) "c++"
11、移除给定的排名区间的所有成员
127.0.0.1:6379> zremrangebyrank rank 0 1
(integer) 2
127.0.0.1:6379> zrange rank 0 -1
1) "c++"
12、移除给定分数区间的所有成员
127.0.0.1:6379> zremrangebyscore rank 80 85
(integer) 0
13、移除整个集合排行榜
127.0.0.1:6379> del rank
(integer) 1
127.0.0.1:6379> exists rank
(integer) 0
如何处理分数相同
一般的思路都是采用实际分数和时间戳相组合结合成的最终分数作为存入ZSet的分数。
年月日时分秒xx(2x年)xx(月)xx(日)xx(时)xx(分)xx(秒),这里需要10个十进制位,如果还精确到毫秒,那么需要13个十进制位。
一个int类型最大值是2^31-1(包含±),2,147,483,647,大约是10个十进制位。
一个double类型最大值是2^63-1(包含±),9,223,372,036,854,775,807,大约是19个十进制位。
而ZSet的分数是 64位的有符号长整型,也就是约19个十进制位。
所以去掉毫秒级别13个十进制位的时间戳,还剩6个十进制位,能存储10^6个数据。
有个小问题就是分数是越大排名越靠前,但是时间戳得越小排名越靠前,这里可以采用“实际分数 + 13个9 - 13位时间戳”作为分数。
java利用redis实现排行榜_Redis实现排行榜相关推荐
- java的redis的作用_redis用途
分布式锁(string) setnx key value,当key不存在时,将 key 的值设为 value ,返回1.若给定的 key 已经存在,则setnx不做任何动作,返回0. 当setnx返回 ...
- java利用redis实现排行榜_Java简单使用redis-zset实现排行榜
简单使用redis-zset实现排行榜 此方法实现一个根据某字段的查询次数进行排行,查询的次数越多排行越前(从大到小排序),适用于初学者 1.添加依赖 org.springframework.boot ...
- java 利用redis 记录文章的阅读量
最近接到一个需求,需要记录阅读过文章的数量.6 package org.java.redis_count;import org.springframework.beans.factory.annota ...
- Java利用Redis实现短信验证码功能
本文将详情介绍从Redis+阿里云注册短信服务到后端调用等过程. 这个功能比较实用的地方就是注册用户的时候,防止一个用户多个账户注册,因为手机号毕竟有限 短信服务 首先,打开你的阿里云 话不多说,第一 ...
- java token redis生成算法_Redis实现单点登录
Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...
- java利用redis的setIfAbsent和incr,实现自增,限制总数
/** * 生成任务时,任务编号的规则是"XJRW-"+nowday(格式yyyyMMdd)+"-"+(当天生成任务数量+1)左补零4位 * * @au ...
- java基于Redis实现排行榜功能-附源码
java基于Redis Zset实现排行榜功能 前言 做之前要思考的问题? Zset怎么存储需要的多个字段? 话不多说先上效果图 数据存储格式 代码 源码下载 闲暇之余,整理了一下之前利用Redis ...
- apache在线升级yum_基于Redis实现在线游戏积分排行榜 - phyger
介绍 本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能. 背景知识 Redis Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化 ...
- 基于Redis实现在线游戏积分排行榜
介绍 本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能. 背景知识 Redis Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化 ...
最新文章
- java.text.SimpleDateFormat多线程下的问题
- VS2005下开发PPC2003和WM50编译器一些设置
- GNU Wget 命令及其参数说明
- echarts散点图使用
- AtCoder AGC029E Wandering TKHS
- java 如何把源码导出为jar包,以及如何使用导出的jar包
- Lumia 800 7.10.8858.136
- 玻璃体浑浊的分子原理
- JavaScript+Css实现的鼠标悬停时动态翻滚的紫色菜单导航
- oracle宕机原因排查,oracle不定期的出现宕机的问题诊断
- Spring-@Value
- 学生信息管理系统——C语言版
- JCR分区与中科院分区
- ns账号切换服务器对存档有影响吗,switch主副账号切换与存档机制简介 - 步蜗网...
- centos7平台手动搭建snort入侵检测系统
- 第13节 IIS之WEB服务器—用于发布网站
- Laravel OAuth2 (三) ---使用 services 和 facades
- Qt的QBuffer
- 详解TCP/IP协议栈面临的五大网络安全问题
- pygame 等有缘人接盘
热门文章
- 2022年保险保险经纪人考试每日一练及答案
- html背景视频铺满网页,HTML – 中心全屏背景视频
- Tushare平台使用经验分享
- paper survey ——deep learning or machine learing and optical communication
- 爱奇艺,腾讯和优酷市场分析(1)
- 关于php的所有问题,关 于 解 析 php 的 问 题
- android 获取电池最大容量,Android 获取电池电压和电池电压高提示
- Intel名字的由来
- 京东回应显卡售后服务问题
- 消息称腾讯低调试水小游戏门户 推出3366.com