jhipster入门之路疑问之四

最近两三天要实现一个功能,***在线用户查询***,返回在线的所有用户。我的想法是从缓存中取,因为我们的设计师用户登录后要在缓存中存储他的基本信息。
初次接触redis并不了解其原理和操作,只能借助网上的一些知识和spring action书中的一些讲解进行尝试。
在尝试了很多次以后,终于实现了该功能,是利用的jedis。
原因如下:
1 尝试利用spring中的redistemplate来实现该功能,但是始终找不到如何获取缓存中所有数据,或者所有key值得方法。

2 jedis中有keys()方法,可以通过传入正则表达式进行匹配全部    keys("*");

3 spring的注解@cacheable的属性 key支持spel表达式,但是貌似不支持匹配全部。

总结一下:
1 ,利用jedis不可以直接new jedis 而是通过pool获取资源。

2 ,keys(“*”)返回的是Set<byte[]>redis.mget(keys) 参数是set,返回值是 byte[][]

3 ,redis在存储的时候会序列化,所以返回值要想使自定义的对象,需要反序列化。

代码如下,只是实现了所需功能,但是不规范,需要优化。

 // 利用jedis获取redis中缓存的在线用户信息
    public List<UserInfoDTO> getkeys() {  
        long start = System.currentTimeMillis();  
        List<String> list = new ArrayList<>();
        List<UserInfoDTO> list2 =new ArrayList<>();
        //连接redis服务器 
        Jedis redis = new JedisPool(new GenericObjectPoolConfig(),
        "host",port,50000,"password").getResource();
        // 获取所有key  
        Set<byte[]> keySet = redis.keys("*".getBytes());  
        byte[][] keys = keySet.toArray(new byte[keySet.size()][]); 
        // 获取所有value  
        byte[][] values = redis.mget(keys).toArray(new byte[keySet.size()][]);  

        // 打印key-value对  
        for (int i = 0; i < keySet.size(); ++i) {  

            ByteArrayInputStream bais = null;

            //反序列化
            try {
            bais = new ByteArrayInputStream(values[i]);
            ObjectInputStream ois = new ObjectInputStream(bais);
            list2.add((UserInfoDTO)ois.readObject());
        }catch (Exception e) {

            } 
        }

        long end = System.currentTimeMillis();  
        // 计算耗时  
        System.out.println("Query " + values.length + " pairs takes " + (end - start) + " millis");  
        redis.close();  
        return list2;
    }  
发布了32 篇原创文章 · 获赞 10 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章