首先,我存放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); }
完整代码: