最近兩三天要實現一個功能,***在線用戶查詢***,返回在線的所有用戶。我的想法是從緩存中取,因爲我們的設計師用戶登錄後要在緩存中存儲他的基本信息。
初次接觸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;
}