redisson php,redisson的理解和使用-调用流程

redisson是一个用于连接redis的java客户端工作,相对于jedis,是一个采用异步模型,大量使用netty promise编程的客户端框架。

0     代码示例

从代码上来看,其基本的使用非常简单,在最后的使用当中。除与redisson打交道之外(获取各种数据结构),完全感觉不到与redis的信息连接。甚至于返回于上层直接不需要考虑下层的实现,一切均由redisson进行了封装。

1     创建初始连接结构

1.1     配置信息config

config信息由4种不同的连接配置和其它属性进行组合,如下所示:

针对上面的4种config,又是基于同一个继承体系,如下所示:

2253a8e2a10d5c68f7ffc7ba5ee1ed2f.png

如上所示,在baseConfig中定义了基本的属性,然后除单机器配置之外,其它的都基于一个主从的配置,类似多节点地址的配置信息。在后面的实现中,我们将看到更多这种设计,即通过继承来完成多种不同场景的实现。

然后,通过 Redisson.create来完成一个类似于client的创建,可以认为创建的对象是一个单例。在后面的调用中,都使用此实例即可。其内部结构如下所示:

其中config即刚才我们定义的配置对象,而connectionManager即可以理解为通过刚才的不同类型的连接配置实现了不同的连接管理器,与配置信息一致,相对象的连接管理器也是按照继承体系来实现的,如下所示:

9109212102c1a64061626935799f543b.png

上面的实现与配置一致,不过这里采用了主从管理的基本实现,其它实现通过override相应的方法来提供不同的子实现。其中单机实现,可以理解为没有slaver的连接处理。

连接管理器,实现了连接信息管理的机制,并且实现了如何选择合适的连接对象来执行不同的操作的语义。即向外封装了connection的调用,入口都通过connectionManager来处理。正因为redisson向外提供的是数据结构语义,因此也不需要暴露connection信息,因此这种实现是值得的。

connectionManager的定义如下所示:

2     创建数据连接

创建连接根据当前操作是读还是写来进行,因为如果是读操作,可以通过主从由从机器进行连接。这里仅考虑创建写操作的连接,其在主机器上进行。因此,我们直接查看相应的实现。

转交由entry,即masterSlaveEntry来处理,entry可以理解为一个具体的表示单个机器的连接配置对象。

从具体的connect方法来看,即创建一个 RedisAsyncConnection 对象,通过注册入连接远程端口的channel中,通过相应的active事件完成对channel的绑定。后续的操作均通过对channel发送事件来完成。具体的代码如下所示:

从上可以看出,在连接的时候指定了3个处理器,即IN OUT的处理器

watchlog负责处理连接断开的时候是否进行重连

handler负责处理最终进行命令的底层发送和接收

connection则负责进行命令的转发,包括各项对redis命令的封装调用。可以理解为handler工作在网络层,而connection则工作在应用层。

3     发送调用命令

3.1     发送的准备操作

如在redissonList中的size操作,即通过调用connection的dispatch命令来操作。如下所示:

type表示指定的指令,如LLEN

output表示在数据返回之后,由commandHandler将相应的结果反序列化入output中

args即表示指令具体的参数

因为在output数据返回之后,需要通知到外转的信息,因此需要有一个相对应的promise,其被作为listner加入到execute(connection)中的结果回调当中。

3.2     数据命令发送

相应的代码在connection中的dispatch中,主要由如下代码构成:

然后,这里需要由commandHander来负责具体的数据发送操作(因为,它是注册了channel的相应处理器), 具体代码如下所示:

3.3     数据结果的解析

接下来的操作,由commandHandler来接收相应的数据,如下所示:

这里,因为在发送命令时,将每个命令相应的顺序入queue,因此在结果时,也是按照queue相对应的结果对应起来。在这里,直接就认为最先的结果对应于最先的cmd。通过rsm.decode,负责将相应buffer的结果反序列化output中,最后调用cmd.complete来通知进一步的promise。如下所示:

3.4     数据结构的反向处理

在上一步的处理中,当相应cmd的complete的处理中,之前传递的promise被设置了result,因此在其上绑定的promise也会进一步设置数据值。如果在最上面,我们使用如下的代码时:

就会最终获取到相应的结果,其值最终体现在业务代码中。

4     与netty的整合

在上面,我们可以看到,整个redisson和netty的协议进行了完全的整合,包括handler的介入,eventGroup的使用等,都使用了全套的netty体系。然后,由于netty提供了promise功能,这里也大量使用了相应的异步模型来进行数据处理。

5     总结

在redisson中,各个部分均采用了最新的一些技术栈,包括java 5线程语义,Promise编程语义,在技术的学习上有很高的学习意义。相比jedis,其支持的特性并不是很高,但对于日常的使用还是没有问题的。其对集合的封装,编解码的处理,都达到了一个开箱即用的目的。相比jedis,仅完成了一个基本的redis网络实现,可以理解为redisson是一个完整的框架,而jedis即完成了语言层的适配。其次,redisson在设计模式,以及编码上,都有完整的测试示例,代码可读性也非常好,很值得进行源码级学习。

如果在项目中已经使用了netty,那么如果需要集成redis,那么使用redisson是最好的选择了,都不需要另外增加依赖信息。

相关文章:

作者: flym

I am flym,the master of the site:)查看flym的所有文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Predis Phpredis Rediska介绍 1 Predis   Predis是一个灵活和特性完备(PHP>5 3)的支持Redis的PHP客户端 当前版本为0 6 3 默认不支持PHP5 2 主要特性如下: 完整的支持从1 2到2 4的Redis 并且支持当前正在开发的版本; 提供客户端实现的一致性哈希算法 支持自定义; 在单个或聚合连接中支持命令管道;(Command pipelining on single and aggregated connections) 能够通过TCP IP或者Unix domain sockets连接到redis 支持持久连接; 自动连接Redis实例 使用“懒惰”方式 只在第一个命令发出时执行连接; 可以灵活定义客户端的命令集合; 2 Phpredis(推荐使用)   这是一个二进制版本的PHP客户端 按照的说法 效率要比Predis高 这个版本支持作为Session的Handler 这个扩展的有点在于无需加载 任何外部文件 使用比较方便 缺点在于难于扩展 一般的PHP程序员无法对其做出扩展 考虑到Redis正在飞速发展过程中 缺乏扩展的特性还是有些影响 的 需要维护过程中注意进行升级更新 调用Redis的相关方法 Redis:: construct构造函数$redis new Redis ; 1 基本相关操作 connect open 链接redis服务 参数host: string 服务地址 port: int 端口号 timeout: float 链接时长 可选 默认为 0 不限链接时间 注: 在redis conf中也有时间 默认为300 pconnect popen 不会主动关闭的链接 参考上面 setOption 设置redis模式 getOption 查看redis设置的模式 ping 查看连接状态 get 得到某个key的值(string值) 如果该key不存在 return false set 写入key 和 value(string值) 如果写入成功 return ture">Predis Phpredis Rediska介绍 1 Predis   Predis是一个灵活和特性完备(PHP>5 3)的支持Redis的PHP客户端 当前版本为0 6 3 默认不支持PHP5 2 主要特性如下: 完整的支持从1 2到2 4的Redis 并且支持当前正在开发的版本; 提供客户 [更多]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值