当前位置: 首页 > news >正文

Redisson官方文档 - 10. 额外功能

10.1. 对Redis节点的操作

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();
Collection<Node> allNodes = nodesGroup.getNodes();
for (Node n : allNodes) {
    n.ping();
}
// 或者
nodesGroup.pingAll();

10.2. 复杂多维对象结构和对象引用的支持

Redisson突破了Redis数据结构维度的限制,通过一个特殊引用对象的帮助,Redisson允许以任意的组合方式构建多维度的复杂对象结构,实现了对象之间的类似传统数据库里的关联关系。使用范例如下:

RMap<RSet<RList>, RList<RMap>> map = redisson.getMap("myMap");
RSet<RList> set = redisson.getSet("mySet");
RList<RMap> 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。

10.3. 命令的批量执行

多个连续命令可以通过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();
// 或者
Future<BatchResult> asyncRes = batch.executeAsync();

在集群模式下,所有的命令会按各个槽所在的节点,筛选分配到各个节点并同时发送。每个节点返回的结果将会汇总到最终的结果列表里。

10.4. 脚本执行

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<Object> r1 = redisson.getScript().evalShaAsync(Mode.READ_ONLY,
   "282297a0228f48cd3fc6a55de6316f31422f5d17",
   RScript.ReturnType.VALUE, Collections.emptyList());

10.5. 底层Redis客户端

Redisson在底层采用了高性能异步非阻塞式Java客户端,它同时支持异步和同步两种通信模式。如果有哪些命令Redisson还没提供支持,也可以直接通过调用底层Redis客户端来实现。Redisson支持的命令在Redis命令和Redisson对象匹配列表里做了详细对比参照。

// 在使用多个客户端的情况下可以共享同一个EventLoopGroup
EventLoopGroup 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();
// 或
RFuture<RedisConnection> connFuture = 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();

相关文章:

  • Flask---日常笔记1
  • 服务发现的基本原理
  • Win7无法访问Win2003共享文件夹的解决办法
  • bash: php: command not found
  • 贪心算法《最短路径》
  • javascript 封装一个class选择器
  • ubuntu 环境下的QT程序打包
  • dom4j解析xml
  • sublime text less安装踩坑图文讲解(less无法生成css)
  • PHP中遍历关联数组的方法
  • opencv再学习之路(五)---灰度直方图显示
  • 在windows2003上部署MVC4.0需要具备的环境
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • ContentProvider介绍
  • 10.19 iptables规则备份和恢复10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作...
  • 【EOS】Cleos基础
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • mac修复ab及siege安装
  • MySQL数据库运维之数据恢复
  • Puppeteer:浏览器控制器
  • v-if和v-for连用出现的问题
  • 机器学习 vs. 深度学习
  • 记录:CentOS7.2配置LNMP环境记录
  • 今年的LC3大会没了?
  • 开源SQL-on-Hadoop系统一览
  • 如何编写一个可升级的智能合约
  • 我感觉这是史上最牛的防sql注入方法类
  • 与 ConTeXt MkIV 官方文档的接驳
  • 自制字幕遮挡器
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​ArcGIS Pro 如何批量删除字段
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #宝哥教你#查看jquery绑定的事件函数
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #微信小程序:微信小程序常见的配置传值
  • ( 10 )MySQL中的外键
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (蓝桥杯每日一题)love
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)SpringBoot3---尚硅谷总结
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • *上位机的定义
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core跨平台微服务学习资源
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 设置默认首页
  • .NET序列化 serializable,反序列化