1. 程式人生 > >使用redisd做瀏覽記錄,在Hash的情況下(本身是無序的)。保證順序的一致性,順序不亂

使用redisd做瀏覽記錄,在Hash的情況下(本身是無序的)。保證順序的一致性,順序不亂

首先,我存放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);
}

 

完整程式碼: