使用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);
}

完整代码:

猜你喜欢

转载自blog.csdn.net/qq_33220391/article/details/84987782
今日推荐