Redis Java client 类的理解

linugb118 贡献于2014-12-25

作者   创建于2012-06-06 01:30:00   修改者ep  修改于2014-12-23 09:27:00字数4789

文档摘要:Redis Java client今天研究一下Jedis的代码,配套Redis的命令进行学习,本身Redisjavaclient就是java的一个实现,他的目标也是通过java代码来完成命令。1.Command命令相关BasicCommands:基础命令主要包括作为client端连接的命令以及作为server端的相关操作命令.Commands:命令抽象接口主要指常规数据操作的行为,这些接口无返回值,而JedisCommands这接口定义的方法和Commands相同,也是常规数据操作,只是不同的是,它里面有返回值。
关键词:

 Redis Java client 今天研究一下Jedis的代码,配套Redis的命令进行学习,本身Redis java client就是java的一个实现,他的目标也是通过java代码来完成命令。 1. Command 命令相关 BasicCommands: 基础命令 主要包括作为client端连接的命令以及作为server端的相关操作命令. Commands: 命令抽象接口 主要指常规数据操作的行为,这些接口无返回值,而JedisCommands这接口定义的方法和Commands相同,也是常规数据操作,只是不同的是,它里面有返回值。 BinaryJedisCommands也是一样定义,里面定义了所以常规操作命令,和前面两个接口不同的是,上面两个接口的key参数是String,而这个接口key是Byte类型。 AdvancedJedisCommands:高级特性的命令,主要有SLOWLOG, CONFIGGET, CONFIGSET, OBJECT. SLOWLOG--- Slow log 是 Redis 用来记录查询执行时间的日志系统。 CONFIGGET—-命令用于取得运行中的 Redis 服务器的配置参数(configuration parameters) CONFIGSET---命令可以动态地调整 Redis 服务器的配置(configuration)而无须重启 OBJECT-----命令允许从内部察看给定 key 的 Redis 对象。 AdvancedBinaryJedisCommands:与AdvancedJedisCommands功能一样,数据不论是参数还是返回以byte。 ScriptingCommands:Redis内嵌Lua 解释器,执行Lua脚本相关的命令。 http://redis.readthedocs.org/en/latest/script/index.html BinaryScriptingCommands:与ScriptingCommands类似 SentinelCommands:哨兵命令。 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。 Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。 http://redis.readthedocs.org/en/latest/topic/sentinel.html ClusterCommands:集群命令,提供设置,测试,操作cluster一些命令。 http://redis.io/topics/cluster-tutorial MultiKeyCommands:该命令集主要处理多个key操作。操作命令还是基本都是上面command的,只是面向的参数是多key的情况。MultiKeyBinaryCommands是对byte处理。 2. 返回类对象: Response:Redis命令后的返回值,他可以通过builder来处理成不同类型 Builder:类型处理 BuilderFactory: Builder工厂 3.管道Pipeline 对于多key的命令,除了可以利用mget,mset 之类的单条命令处理多个key的命令外我们还可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。具体多少合适需要根据具体情况测试。Jedis的pipeline类也是实现相关命令操作,只是返回Response可以是当前命令的连续操作后的结果一次返回。 BasicRedisPipeline:对应BasicCommands BinaryRedisPipeline:对应BinaryJedisCommands ClusterPipeline:对应ClusterCommands MultiKeyBinaryRedisPipeline:对应MultiKeyBinaryCommands MultiKeyCommandsPipeline: 对应MultiKeyCommands 这些PipeLine 的类都返回 Response对象。Response就是String的一些描述 Queable 类这里面放入List来存储每次执行的Response。 PipelineBase:是指具体类的实现,上面只是接口的定义,当需要具体执行命令,还是需要使用Client端的来执行命令,同时要保证一系列命令是同一个client执行的。因此PipelineBase里面有一个Client实例,并且通过 key可以获取到当前client实例。 MultiKeyPipelineBase:继承PipelineBase,实现多key的pipline。 Pipeline: 也是MultiKeyPipelineBase的具体一个实现。 4.通信 Socket: 使用Java net 里面的Socket RedisOutputStream:继承FilterOutputStream RedisInputStream:继承FilterInputStream Protocol:包含SendCommand 的处理以及根据不同协议描述来处理返回流。 Connection:类似Jdbc的连接,里面包含OutputStream,InputStream,Socket以及Protocol。 5. Client端 BinaryClient:继承Connection,实现所有前面有的命令。有connect,有设置密码等。 Client:继承BinaryClient,直接暴露给客户使用的。 6.事务 Transaction: 基于MultiKeyPipelineBase,主要有一个inTransaction标志位,里面有exc和discard。其本质也是通过pipeline来完成所谓事务的功能。 7.Jedis类 BinaryJedis:实现Binary相关的命令接口,里面有一个client,一个transaction,一个pipeline。Transaction实现multi功能。 MULTI---标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。 Jedis:继承BinaryJedis。功能一样。 8.Util 工具类 JedisURIHelper:URL解析工具,从URL获取密码;获取DB的index号。 SafeEncoder:编码类 MurmurHash:http://murmurhash.googlepages.com/ murmurhash是 Austin Appleby于2008年创立的一种非加密hash算法,适用于基于hash进行查找的场景 JedisClusterCRC16:http://redis.io/topics/cluster-spec JedisByteHashMap: hashMap Hashing: hash 接口 ClusterNodeInformationParser:节点信息的解析器 ClusterNodeInformation:节点信息,包括有效的插槽,即将导入的插槽和需要移除的插槽 9.发布订阅 BinaryJedisPubSub:定义了发布和订阅的几个事件。 10.Shared分布式使用 ShardedJedis是基于一致性哈希算法实现的分布式Redis集群客户端;ShardedJedis的设计分为以下几块: 对象池设计:Pool,ShardedJedisPool,ShardedJedisFactory 面向用户的操作封装:BinaryShardedJedis,BinaryShardedJedis 一致性哈希实现:Sharded shared一致性哈希采用以下方案: Redis服务器节点划分:将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重),将划分虚拟节点采用TreeMap存储,对每个Redis服务器的物理连接采用LinkedHashMap存储,对Key or KeyTag 采用同样的hash算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点存储;当key的hash值大于虚拟节点hash值得最大值时,存入第一个虚拟节点 Sharded: 抽象了基于一致性哈希算法的划分设计,设计思路: (1)基于hash算法划分redis服务器 (2)保持每台Redis服务器的Jedis客户端 (3)提供基于Key的划分方法;提供了ShardKeyTag实现 BinaryShardedJedis 同BinaryJedis类似,实现BinaryJedisCommands对外提供基于Byte[]的key,value操作 ShardedJedis 同Jedis类似,实现JedisCommands对外提供基于String的key,value操作。 JedisClusterInfoCache:包括节点信息和插槽信息 JedisClusterConnectionHandler:对JedisClusterInfoCache里面的节点和插槽的获取动作。 11. 参数类对象 DebugParams:debug 命令参数 http://redis.io/commands/debug-object BitOP:bitop 参数 http://redis.readthedocs.org/en/latest/string/bitop.html BitPosParams:bitpos参数 http://redis.io/commands/bitpos HostAndPort: 记录Host和Port参数对象 ScanParams: 用于hscan,scan,sscan,zscan参数 ScanResult: 用于hscan,scan,sscan,zscan返回 SortingParams:用户sort命令 ZParams:用于zinterstore,zunionstore命令参数 Tuple: 用于zrang,zrerange,zsan的返回。 12.连接池 Pool:使用org.apache.commons.pool2来完成 JedisPool:pool中放Jedis实例 ShardedJedisPool:pool中放ShardedJedis实例 JedisSentinelPool:pool实例为Jedis,里面会有一系列MasterListener监听器 MasterListener继承Thead。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档