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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章