先说 存储的结构:
这里做了两块缓存 绿色是存储索引的缓存 黑色是存数据的缓存
翻页时需要两个参数 向上查询/或向下查询 还一个是 从第二页开始查询时需要一个索引的参数
有了这两个参数 就可以利用redis 中提供的方法进行操作
第一个是 jedis.zadd(String key, double score, String member) 这个方法 是类似于 map 的功能
第二个方法 jedis.set(String key, String value) 这个就是根据key获取对应的值
第三个方法 jedis.zrange(String key, long start, long end) 是对list中的数据 向下取值
第四个方法 jedis.zrevrange(String key, long start, long end) 是对list中的数据 向上取值
第五个方法是jedis.zcard(Sting key) 获取集合中的总数
下面是部分代码示例:
注意:jedis.zrange()中的元素值是从0 开始计算的
下面是将数据记录到缓存中去
String KEY = "object.Id";
Jedis jedis = new Jedis("127.0.0.1");
// 删除记录的索引
jedis.del(KEY);
// keys 可以进行前匹配 如: keys("ss") 就会找出所有已ss开头的缓存
Iterator<String> it = jedis.keys(KEY).iterator();
while (it.hasNext()) {
String key = it.next();
// 清空缓存中记录的数据
jedis.del(key);
}
// 获取数据源
List<Map<String, Object>> findliveAllList = liveService.findLiveAll();
if (findliveAllList != null && findliveAllList.size() > 0) {
// 做索引列
int i = 0;
for (Map<String, Object> map : findliveAllList) {
String id = map.get("id").toString();
// 记录回放的排序列表
jedis.zadd(KEY, i, id);
// 记录单条的直播数据
jedis.set(KEY + id, JSONObject.toJSON(map).toString());
i++;
}
}
取出数据
String key="object.Id";
Jedis jedis = new Jedis("127.0.0.1");
Set<String> list = null;
// redis 中的记录是从0 开始的
size = size - 1;
// 这个Id 是翻页时的索引 不传时从第一个开始
if (id == null || "".equals(id)) {
// zrange() 是向下取值
list = jedis.zrange(key, 0, size);
} else {
// 这里加1 是因为 总元素是从0开始计算的获取的坐标就会小1
long round = Math.round(jedis.zscore(key, id)) + 1;
// type 1 是下一页 2 是上一页
if (type != null && "1".equals(type)) {
// zrange() 是向下取值 获取下一页数据
list = jedis.zrange(key, round, size + round);
} else {
// //zrevrange() 是向上取值 获取上一页数据
list = jedis.zrevrange(key, round, size + round);
}
}
List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();
for (String backId : list) {
Map<String, Object> parseObject = JSON.parseObject(jedis.get(key + backId).toString(), new TypeReference<Map<String, Object>>() {
});
list2.add(parseObject);
}
map = new HashMap<String, Object>();
map.put("list", list2);
map.put("count", jedis.zcard(key));