利用redis快取對 list集合中的資料 進行分頁操作(一)

利用redis快取對 list集合中的資料 進行分頁操作(一)

先說 儲存的結構: 

這裡做了兩塊快取  綠色是儲存索引的快取  黑色是存資料的快取

翻頁時需要兩個引數  向上查詢/或向下查詢    還一個是   從第二頁開始查詢時需要一個索引的引數

有了這兩個引數 就可以利用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));

這裡是優化後的程式碼地址:http://blog.csdn.net/qq_27292113/article/details/54645899