最近项目中遇到了需要对数据排序的需求,之前都是在持久化层或者是利用 java 代码进行的排序。而最近在研究 redis ,之前看到过有人利用 redis sorted set 对数据进行排序,就顺便进行了尝试,发现效果不错,所以记录下 。
Redis 简介
- redis 是开源的 key-value 内存数据库,同时支持可选的持久化方案。通俗点说,就是十分适合用来做缓存的 nosql(因为跑在内存里)。
- 相比较 memocached ,支持更多的数据类型(字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)),使用上更加方便。
Springboot 项目引入redis
首先就是需要在程序运行的机器上安装 redis,安装教程可以参照这里。
利用 idea 创建项目,选择 spring initializer,然后再引入依赖的步骤里选择
NoSQL->Redis
,打上勾即可,项目初始化完成后便引入了 redis 所需的依赖。当然,也可以使用 spring-boot-starter 引入 spring-data-redis ,同样可以引入所需的依赖,我这里没做尝试。
实战代码
Sorted set 中,每一项元素都又两部分组成:score 与 string 。其中,score 可以通俗的理解为权值或者评分,用于排序;string用来存储对应的数据,更详细的说明可以参照官网文档。
所以接下来的工作就比较简单了,获取对象,转换为 string,再获取排序时需要的数值作为 score,然后先存储到 sorted set 中,再依次取出即可。
jedis 是 java 下一个易用的 redis client,官方文档在这里。
核心伪代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18for(int i = 0;i < array.length;i++){
Double score = array[i].getScore();//获取score
String member = array[i].serialize();//对对象进行序列化,方便存储
jedis.zadd("sort_set", score, member);//放入sorted set
}
Set<Tuple> set = jedis.zrevrangeWithScores(key, 0, -1);//获取排序后set
Map result = new LinkedHashMap<Double, Object>();
int rank = 0;
for (Tuple tuple : set) {
//遍历存储
Map tmp = new HashMap<String,Object>(2);
tmp.put("score", tuple.getScore());
tmp.put("member",tuple.getElement());
result.put(++rank, tmp);
}
//清除sorted set 方便下次排序
jedis.zremrangeByRank(BizConstants.COMPANY_SORT_SETS, 0, -1);
jedis.close();代码中 result 即为排序后的结果,当然,根据需求也可以使用别的集合类型。