使用redisd做瀏覽記錄,在Hash的情況下(本身是無序的)。保證順序的一致性,順序不亂
阿新 • • 發佈:2018-12-13
首先,我存放redis是Hash,本身Hash是無序的,取出的時候結果肯定也是無序的。所以瀏覽記錄的列表不夠人性化(理論是:使用者點選最近的一條記錄,在瀏覽記錄頁面裡面應該是第一條。但是因為hash是無序的,所以沒法保證。)
其次,在存放hash的時候是,hmset,為了保證key的唯一。用ID+當前時間戳(System.currentTimeMillis() )。
所以,排序可以用時間戳來進行排序:
1.獲取所有的Key
Set<String> allkeys = jedis.keys(userJid + "*");
2.迴圈遍歷 ,分割 ,取出時間戳的值
List<String> tNumList = new ArrayList<>(); for (String value : allkeys) { String[] nets = value.split("net"); String time = nets[1]; String tNum = time; tNumList.add(tNum); }
3.比較所有的時間戳,同時進行排序(有固定的方法直接用就可以,但是因為時間戳的數值太大,所以要用Double來比較。原先是int,自己改一下就好)。
Collections.sort(tNumList, new Comparator<String>() { @Override public int compare(String o1, String o2) { Double num1 = Double.parseDouble(o1); Double num2 = Double.parseDouble(o2); if (num1 < num2) { return 1; } else if (num1 > num2) { return -1; } else { return 0; } } });
4.得到最大的值後,拼接hmset時候存放的完整key,得到一條資料,此資料是當前使用者瀏覽記錄中最近的一次記錄,然後迴圈遍歷出 name id 等等自己需要的值。然後返回給頁面。
for ( String ivalue : tNumList){ String UserVa = userJid+ ivalue; HashMap map = new HashMap(); List<String> rsmap = jedis.hmget(UserVa, "id"); List<String> rsmapName = jedis.hmget(UserVa, "name"); List<String> rsmapTime = jedis.hmget(UserVa, "time"); List<String> rsmapUrl = jedis.hmget(UserVa, "url"); map.put("rsmapName", rsmapName); map.put("rsmapTime", rsmapTime); map.put("rsmap", rsmap); map.put("rsmapUrl", rsmapUrl); list.add(map); }
完整程式碼: