Redis缓存实现排序功能
如果对实时并发排序感兴趣,请关注这个项目(java):https://github.com/xuerong/hqrank,欢迎参与开发,pass:支持多字段排行
最近遇到一个问题就是根据需求需要对所有的用户根据积分,显示他的全站排名,数据量大概200万左右,积分是实时更改的,怎么能让这个排名尽量的实时呢?一直很困惑,之前用过db的count查,速度很慢,并且高峰时候db也容易堵住。
这个实时性排序要求高,不建议用db做,db只是恢复数据用,排序及前端获取排行列表,我推荐用redis,数据结构采用其内置的sorted list,性能非常好,redis只保存最简单的id+积分这么一个数据,关闭实体化选项,全部用内存来保存数据,搭建主从防止宕机,然后自己实现一个从db到redis的数据恢复过程即可。
数据保存的话,根据你实际并发量考虑,并发不高的话可以定时写入db,并发很高的话,中间需要再做一个缓冲队列。
Jedis 是 Redis 官方首选的 Java 客户端开发包。这篇文章我们将介绍如何使用 Sorted Set 排序集合(zsets)。
Sorted Set 跟一个集合一样,它是不会存在重复的数值,最大的不同是 Sorted Set 中每个元素都是经过排序的。
我们先看一些命令:
import java.util.HashMap;
import java.util.Map; import redis.clients.jedis.Jedis;
public class TestJedis { public static void main(String[] args) {
String key = "mostUsedLanguages";
Jedis jedis = new Jedis("localhost");
//Adding a value with score to the set
jedis.zadd(key,100,"Java");//ZADD //We could add more than one value in one calling
Map<Double, String> scoreMembers = new HashMap<Double, String>();
scoreMembers.put(90d, "Python");
scoreMembers.put(80d, "Javascript");
jedis.zadd(key, scoreMembers); //We could get the score for a member
System.out.println("Number of Java users:" + jedis.zscore(key, "Java")); //We could get the number of elements on the set
System.out.println("Number of elements:" + jedis.zcard(key));//ZCARD
}
}
上述例子中我们看到了 Zset 命令,为了将元素添加到 zet 中,我们使用 zadd 方法,不同的是我们还传递了一个元素的评分值,我们可以使用 Map 对象来一次传递很多个对象,而 zadd 方法可用于增加和更新已有元素的评分值。
我们可使用 zscore 来获取某元素的评分,通过 zcard 获取元素个数。
下面的例子我们可看到来自 zsets 的其他命令:
import java.util.Set; import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
public class TestJedis { public static void main(String[] args) {
String key = "mostUsedLanguages";
Jedis jedis = new Jedis("localhost"); //get all the elements sorted from bottom to top
System.out.println(jedis.zrange(key, 0, -1)); //get all the elements sorted from top to bottom
System.out.println(jedis.zrevrange(key, 0, -1));
//We could get the elements with the associated score
Set<Tuple> elements = jedis.zrevrangeWithScores(key, 0, -1);
for(Tuple tuple: elements){
System.out.println(tuple.getElement() + "-" + tuple.getScore());
} //We can increment a score for a element using ZINCRBY
System.out.println("Score before zincrby:" + jedis.zscore(key, "Python"));
//Incrementing the element score
jedis.zincrby(key, 1, "Python");
System.out.println("Score after zincrby:" + jedis.zscore(key, "Python"));
}
}
通过 zrange 我们能获取给定范围的元素,它将返回经过排序后的元素列表(自底向上),也可以通过 zrevrrange 获取自顶向下的元素列表。Redis 还允许我们通过关联的评分来获取元素,传递 “withscores“ 参数即可。使用 Jedis API 的 zrevrangeWithScores 方法可返回对象集合。另外一个有用的命令是 zincrby 可用于增加元素的评分值。
zsets 还有其他的命令,这里我们只是介绍跟 Jedis API 相关的一些基本用法。这里还有一些关于排序集合的介绍。
Redis缓存实现排序功能的更多相关文章
- 简单实现Redis缓存中的排序功能
1.在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发 ...
- redis(四)--简单实现Redis缓存中的排序功能
在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发的应 ...
- 基于Redis缓存几十万条记录的快速模糊检索的功能实现(c#)
在开发一套大型的信息系统中,发现很多功能需要按公司查询,各个模块在实现时都是直接查数据库进行模糊检索,虽然对表进行向各个应用的库中进行了同步,但是在使用中发现,模糊检索公司时还是比较卡,原始的查询数据 ...
- spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)
一,为什么要更新caffeine缓存? 1,caffeine缓存的优点和缺点 生产环境中,caffeine缓存是我们在应用中使用的本地缓存, 它的优势在于存在于应用内,访问速度最快,通常都不到1ms就 ...
- Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager
Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...
- Windows环境下使用Redis缓存工具的图文详细方法
一.简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合). ...
- NoSQL:redis缓存数据库
一 Redis介绍 Redis和Memcached类似,也属于key-value nosql 数据库 Redis官网redis.io, 当前最新稳定版4.0.1 和Memcached类似,它支持存储的 ...
- Redis缓存你必须了解的!
不管你是从事Python.Java.Go.PHP.Ruby等等… Redis都应该是一个比较熟悉的中间件.而大部分经常写业务代码的程序员,实际工作中或许只用到了set value.get value两 ...
- redis缓存数据库
redis 介绍 redis是业界主流的key-value nosql 数据库之一.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set( ...
随机推荐
- java实现一个简单的Web服务器
注:本段内容来源于<JAVA 实现 简单的 HTTP服务器> 1. HTTP所有状态码 状态码 状态码英文名称 中文描述 100 Continue 继续.客户端应继续其请求 101 Swi ...
- Percona 5.7.13 已经发布
Percona 5.7.13 已经正式发布,需要的人士可以去官方网站下载 https://www.percona.com/downloads/Percona-Server-5.7/Percona-Se ...
- jQuery-委托事件和on方法注册事件
delegate注册委托事件 delegate--代理.委托 事件代理----事件最终不是由$("#first")执行,它只是代理元素 第一个参数:最终发生事件的元素 第二个参数: ...
- SQL优化(面试题)
因为现在面试经常需要问的需要SQL优化,问的具体操作步骤时候的常见做法,所以网上总结这些操作步骤: SQL优化的具体操作: 1.在表中建立索引,优先考虑where.group by使用到的字段. 2. ...
- TPshop之邮箱注册配置教程--附加常见问题集合
准备:企业邮箱(开启POP/SMTP功能) 一.步骤教程: 1.登录企业邮箱(QQ邮箱示例) QQ邮箱 POP3:pop.qq.com SMTP:smtp.qq.com SMTP端口号:25 邮箱 ...
- 方法总结:如何实现html页面自动刷新
使用场景: 1. 页面需要定时刷新,实时加载数据,需要实时查看监控数据(H5中的WebSocket和SSE可以实现局部刷新) 2. 一定时间之后跳转到指定页面(登录注册之类) 3. 前端开发使用伪数据 ...
- Spark中集群相关概念
来源:http://spark.apache.org/docs/latest/cluster-overview.html Term Meaning Application User program b ...
- Java 自定义注释@interface的用法
最简单的待校验的注解定义 @Documented @Constraint(validatedBy = ExistBlankByListValidator.class) @Target({PARAMET ...
- EF Core 2.2 对多个 DbContext 多个数据库的情况进行迁移的示例
目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 场景 在一个项目中,使用了多个 DbContext 且每个 DbContext 对应一个数据库的情况 创建新 ...
- gitlab搭建,结合pycharm和vs2015配置用于开发python和c++
利用Ubuntu16.04服务器搭建gitlab仓库,本地windows系统使用pycharm和VS开发,通过软件配置可进行代码管理. 1.gitlab安装 ①安装依赖包: sudo apt-get ...