利用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 開始計算的

下面是將數據記錄到緩存中去

 

 
  1. String KEY = "object.Id";

  2. Jedis jedis = new Jedis("127.0.0.1");

  3. // 刪除記錄的索引

  4. jedis.del(KEY);

  5. // keys 可以進行前匹配 如: keys("ss") 就會找出所有已ss開頭的緩存

  6. Iterator<String> it = jedis.keys(KEY).iterator();

  7. while (it.hasNext()) {

  8. String key = it.next();

  9. // 清空緩存中記錄的數據

  10. jedis.del(key);

  11. }

  12. // 獲取數據源

  13. List<Map<String, Object>> findliveAllList = liveService.findLiveAll();

  14. if (findliveAllList != null && findliveAllList.size() > 0) {

  15. // 做索引列

  16. int i = 0;

  17. for (Map<String, Object> map : findliveAllList) {

  18. String id = map.get("id").toString();

  19. // 記錄回放的排序列表

  20. jedis.zadd(KEY, i, id);

  21. // 記錄單條的直播數據

  22. jedis.set(KEY + id, JSONObject.toJSON(map).toString());

  23. i++;

  24. }

  25. }

  26.  

 

 


取出數據

 

 

 
  1. String key="object.Id";

  2. Jedis jedis = new Jedis("127.0.0.1");

  3. Set<String> list = null;

  4. // redis 中的記錄是從0 開始的

  5. size = size - 1;

  6. // 這個Id 是翻頁時的索引 不傳時從第一個開始

  7. if (id == null || "".equals(id)) {

  8. // zrange() 是向下取值

  9. list = jedis.zrange(key, 0, size);

  10. } else {

  11. // 這裏加1 是因爲 總元素是從0開始計算的獲取的座標就會小1

  12. long round = Math.round(jedis.zscore(key, id)) + 1;

  13. // type 1 是下一頁 2 是上一頁

  14. if (type != null && "1".equals(type)) {

  15. // zrange() 是向下取值 獲取下一頁數據

  16. list = jedis.zrange(key, round, size + round);

  17. } else {

  18. // //zrevrange() 是向上取值 獲取上一頁數據

  19. list = jedis.zrevrange(key, round, size + round);

  20. }

  21. }

  22. List<Map<String, Object>> list2 = new ArrayList<Map<String, Object>>();

  23. for (String backId : list) {

  24. Map<String, Object> parseObject = JSON.parseObject(jedis.get(key + backId).toString(), new TypeReference<Map<String, Object>>() {

  25. });

  26. list2.add(parseObject);

  27. }

  28. map = new HashMap<String, Object>();

  29. map.put("list", list2);

  30. map.put("count", jedis.zcard(key));

 

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章