本文共 3304 字,大约阅读时间需要 11 分钟。
Redisson的NodesGroup
对象提供了许些对Redis节点的操作。
NodesGroup nodesGroup = redisson.getNodesGroup();nodesGroup.addConnectionListener(new ConnectionListener() { public void onConnect(InetSocketAddress addr) { // Redis节点连接成功 } public void onDisconnect(InetSocketAddress addr) { // Redis节点连接断开 }});
也可以用来PING单个Redis节点或全部节点。
NodesGroup nodesGroup = redisson.getNodesGroup();CollectionallNodes = nodesGroup.getNodes();for (Node n : allNodes) { n.ping();}// 或者nodesGroup.pingAll();
Redisson突破了Redis数据结构维度的限制,通过一个特殊引用对象的帮助,Redisson允许以任意的组合方式构建多维度的复杂对象结构,实现了对象之间的类似传统数据库里的关联关系。使用范例如下:
RMap, RList > map = redisson.getMap("myMap");RSet set = redisson.getSet("mySet");RList list = redisson.getList("myList");map.put(set, list);// 在特殊引用对象的帮助下,我们甚至可以构建一个循环引用,这是通过普通序列化方式实现不了的。set.add(list);list.add(map);
可能您已经注意到了,在map包含的元素发生改变以后,我们无需再次“保存/持久”这些对象。因为map对象所记录的并不是序列化以后的值,而是元素对象的引用。这让Redisson提供的对象在使用方法上,与普通Java对象的使用方法一致。从而让Redis成为内存的一部分,而不仅仅是一个储存空间。
以上范例中,一共创建了三个Redis数据结构:一个Redis HASH,一个Redis SET和一个Redis LIST。
多个连续命令可以通过RBatch
对象在一次网络会话请求里合并发送,这样省去了产生多个请求消耗的时间和资源。这在Redis中叫做。
RBatch batch = redisson.createBatch();batch.getMap("test").fastPutAsync("1", "2");batch.getMap("test").fastPutAsync("2", "3");batch.getMap("test").putAsync("2", "5");batch.getAtomicLongAsync("counter").incrementAndGetAsync();batch.getAtomicLongAsync("counter").incrementAndGetAsync();// 原子化(事务)批量执行所有的命令batch.atomic();// 告知Redis不用返回结果(可以减少网络用量)batch.skipResult();// 将写入操作同步到从节点// 同步到2个从节点,等待时间为1秒钟batch.syncSlaves(2, 1, TimeUnit.SECONDS)// 处理结果超时为2秒钟batch.timeout(2, TimeUnit.SECONDS);// 命令重试等待间隔时间为2秒钟batch.retryInterval(2, TimeUnit.SECONDS);// 命令重试次数,仅适用于未发送成功的命令batch.retryAttempts(4);BatchResult res = batch.execute();// 或者FutureasyncRes = batch.executeAsync();
在集群模式下,所有的命令会按各个槽所在的节点,筛选分配到各个节点并同时发送。每个节点返回的结果将会汇总到最终的结果列表里。
redisson.getBucket("foo").set("bar");String r = redisson.getScript().eval(Mode.READ_ONLY, "return redis.call('get', 'foo')", RScript.ReturnType.VALUE);// 通过预存的脚本进行同样的操作RScript s = redisson.getScript();// 首先将脚本保存到所有的Redis主节点String res = s.scriptLoad("return redis.call('get', 'foo')");// 返回值 res == 282297a0228f48cd3fc6a55de6316f31422f5d17// 再通过SHA值调用脚本Future
Redisson在底层采用了高性能异步非阻塞式Java客户端,它同时支持异步和同步两种通信模式。如果有哪些命令Redisson还没提供支持,也可以直接通过调用底层Redis客户端来实现。Redisson支持的命令在里做了详细对比参照。
// 在使用多个客户端的情况下可以共享同一个EventLoopGroupEventLoopGroup group = new NioEventLoopGroup();RedisClientConfig config = new RedisClientConfig();config.setAddress("redis://localhost:6379") // 或者用rediss://使用加密连接 .setPassword("myPassword") .setDatabase(0) .setClientName("myClient") .setGroup(group);RedisClient client = RedisClient.create(config);RedisConnection conn = client.connect();// 或RFutureconnFuture = client.connectAsync();conn.sync(StringCodec.INSTANCE, RedisCommands.SET, "test", 0);// 或conn.async(StringCodec.INSTANCE, RedisCommands.GET, "test");conn.close()// 或conn.closeAsync()client.shutdown();// 或client.shutdownAsync();
转载地址:http://ikkdo.baihongyu.com/