jhipster入门之路疑问之四
来源:互联网 发布:魔镜大数据可视化 编辑:程序博客网 时间:2024/05/24 05:57
最近两三天要实现一个功能,***在线用户查询***,返回在线的所有用户。我的想法是从缓存中取,因为我们的设计师用户登录后要在缓存中存储他的基本信息。初次接触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; }
阅读全文