AliCloudDB for redis应用场景之实现帖子排序
场景介绍
各大论坛帖子通常会有各种排序方式方便用户查看,比如按发帖时间排序,按回复时间排序,按回复数排序等,这种场景对响应时间要求较高,因此可以选择AliCloudDB for redis来缓存排序信息。对这种TOP N 的场景,使用AliCloudDB for redis的zset结构存储比较合适
业务设计
假设论坛某版块需要按发帖时间和按回复时间两种排序方式,那么对于第一个种按发帖时间的数据结构可以这样设计:
key:帖子版块id(唯一标识)+ 排序type
score:发帖时间
member:帖子id
同理按回复时间的数据结构将score改回回复时间即可
当有新帖子时,用zadd接口写入,获取帖子列表时,用zrangebyscore接口展示帖子,删除帖子时,用zrem
代码示例
package com.aliyun;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import redis.clients.jedis.Jedis;
public class SamplePostsRank {
static int POST_NUM = 20;
public void SAMPLE_PostsRank()
{
String host = "127.0.0.1";
int port = 6728;
try {
Jedis jedis = new Jedis(host, port);
String authString = jedis.auth("INSTANCEID:PASSWORD");
if (!authString.equals("OK"))
{
//log.error("AUTH Failed: " + authString);
return;
}
String key = "Test-Board";
List<String> postList = new ArrayList<String>();
for (int i = 0; i < POST_NUM; ++i)
{
postList.add(UUID.randomUUID().toString());
}
String postType ="RepNum";
//Set Score
for (int i = 0; i < postList.size(); i++)
{
String postId = postList.get(i);
String member = postId + "-" + postType;
int score = (int)(Math.random() % 100);
jedis.zadd(key, score, member);
System.out.println("POST: " + postId + " ReplyNumber: " + score);
}
Set<String> scoreList = jedis.zrangeByScore(key, 80, 100);
for (String str : scoreList) {
System.out.println(str);
}
jedis.quit();
jedis.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}