精华内容
下载资源
问答
  • 客户端分片Redis Sharding是Redis Cluster出来之前,业界普遍使用的多Redis实例集群方法。...java redis客户端驱动jedis,支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool。Shar...

    客户端分片

    Redis Sharding是Redis Cluster出来之前,业界普遍使用的多Redis实例集群方法。其主要思想是采用哈希算法将Redis数据的key进行散列,通过hash函数,特定的key会映射到特定的Redis节点上。java redis客户端驱动jedis,支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool。

    1aeb92d40e08e8d1094032d7c6a116cb.png

    Sharding

    Redis Sentinel提供了主备模式下Redis监控、故障转移功能达到系统的高可用性。在主Redis宕机时,备Redis接管过来,上升为主Redis,继续提供服务。主备共同组成一个Redis节点,通过自动故障转移,保证了节点的高可用性。

    客户端sharding技术其优势在于非常简单,服务端的Redis实例彼此独立,相互无关联,每个Redis实例像单服务器一样运行,非常容易线性扩展,系统的灵活性很强。

    客户端sharding的劣势也是很明显的。由于sharding处理放到客户端,规模进一步扩大时给运维带来挑战。客户端sharding不支持动态增删节点。服务端Redis实例群拓扑结构有变化时,每个客户端都需要更新调整。连接不能共享,当应用规模增大时,资源浪费制约优化。

    基于代理的分片

    客户端发送请求到一个代理组件,代理解析客户端的数据,并将请求转发至正确的节点,最后将结果回复给客户端。

    该模式的特性如下:

    • 透明接入,业务程序不用关心后端Redis实例,切换成本低。
    • Proxy 的逻辑和存储的逻辑是隔离的。
    • 代理层多了一次转发,性能有所损耗。

    简单的结构图如下:

    fbb36543ce3a2a0ac078d5f53b83faff.png

    proxy

    主流的组件有:Twemproxy和Codis。

    Twemproxy

    Twemproxy也叫nutcraker,是twtter开源的一个redis和memcache代理服务器程序。redis作为一个高效的缓存服务器,非常具有应用价值。但在用户数据量增大时,需要运行多个redis实例,此时将迫切需要一种工具统一管理多个redis实例,避免在每个客户端管理所有连接带来的不方便和不易维护,Twemproxy即为此目标而生。

    Twemproxy有以下几个特点:

    • 轻量级
    • 维持永久的服务端连接
    • 支持失败节点自动删除;可以设置重新连接该节点的时间,还可以设置连接多少次之后删除该节点
    • 支持设置HashTag;通过HashTag可以自己设定将同一类型的key映射到同一个实例上去。
    • 减少与redis的直接连接数,保持与redis的长连接,可设置代理与后台每个redis连接的数目
    • 自带一致性hash算法,能够将数据自动分片到后端多个redis实例上;支持多种hash算法,可以设置后端实例的权重,目前redis支持的hash算法有:one_at_a_time、md5、crc16、crc32、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins。
    • 支持redis pipelining request,将多个连接请求,组成reids pipelining统一向redis请求。
    • 支持状态监控;可设置状态监控ip和端口,访问ip和端口可以得到一个json格式的状态信息串;可设置监控信息刷新间隔时间。

    TwemProxy 官网介绍了如上的特性。TwemProxy的使用可以像访问redis客户端一样访问TwemProxy。然而Twitter已经很久放弃了更新TwemProxy。Twemproxy最大的痛点在于,无法平滑地扩容/缩容。Twemproxy另一个痛点是,运维不友好,甚至没有控制面板。

    Codis

    Codis是豌豆荚开源的redis集群方案,是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 , 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。

    Codis当前最新release 版本为 codis-3.2,codis-server 基于 redis-3.2.8。有一下组件组成:

    289b19c34d0feb5bcd4e9de9f5afd20e.png

    Codis

    • Codis Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。
    • Codis Proxy:客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
    • Codis Dashboard:集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。在集群状态发生改变时,codis-dashboard 维护集群下所有 codis-proxy 的状态的一致性。
    • 对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;所有对集群的修改都必须通过 codis-dashboard 完成。
    • Codis Admin:集群管理的命令行工具。
    • 可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。
    • Codis FE:集群管理界面。
    • 多个集群实例共享可以共享同一个前端展示页面;
    • 通过配置文件管理后端 codis-dashboard 列表,配置文件可自动更新。
    • Storage:为集群状态提供外部存储。
    • 提供 Namespace 概念,不同集群的会按照不同 product name 进行组织;目前仅提供了 Zookeeper、Etcd、Fs 三种实现,但是提供了抽象的 interface 可自行扩展。

    至于具体的安装与使用,见官网CodisLabs,不在此涉及。

    Codis的特性:

    • Codis支持的命令更加丰富,基本支持redis的命令。
    • 迁移成本低,迁移到codis没这么麻烦,只要使用的redis命令在codis支持的范围之内,只要修改一下配置即可接入。
    • Codis提供的运维工具更加友好,提供web图形界面管理集群。
    • 支持多核心CPU,twemproxy只能单核
    • 支持group划分,组内可以设置一个主多个从,通过sentinel 监控redis主从,当主down了自动将从切换为主

    路由查询

    Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供。Redis Cluster并没有使用一致性hash,而是采用slot(槽)的概念,一共分成16384个槽。将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行。当客户端操作的key没有分配到该node上时,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node,这有点儿像浏览器页面的302 redirect跳转。

    Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,如果主节点失效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。

    321013af95110a20555189e7c31fe6cc.png

    Cluster

    特点:

    • 无中心架构,支持动态扩容,对业务透明
    • 具备Sentinel的监控和自动Failover能力
    • 客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
    • 高性能,客户端直连redis服务,免去了proxy代理的损耗

    缺点是运维也很复杂,数据迁移需要人工干预,只能使用0号数据库,不支持批量操作,分布式逻辑和存储模块耦合等。

    选型最后确定redis cluster。主要原因是性能高,去中心化支持扩展。运维方面的数据迁移暂时业内也没有特别成熟的方案解决,redis cluster是redis官方提供,我们期待redis官方在后面能够完美支持。

    作者:aoho

    链接:https://www.jianshu.com/p/ee76b717f88c

    来源:简书

    展开全文
  • SSDB支持 Redis 网络协议, 所以你可以用 Redis 的客户端来连接 SSDB 服务器. 但是, 使用 SSDB 客户端是最高效的方式。所有的 SSDB 客户端 API 都是支持...关于java客户端,有如下几种:1.官方客户端2.ssdb4jSSDB的Ja...

    SSDB支持 Redis 网络协议, 所以你可以用 Redis 的客户端来连接 SSDB 服务器. 但是, 使用 SSDB 客户端是最高效的方式。所有的 SSDB 客户端 API 都是支持二进制数据的, 二进制数据即是字符串,字符串就是二进制数据。SSDB 源码仓库中, 内置了许多语言的客户端, 这些便是所谓的官方客户端。

    关于java客户端,有如下几种:

    1.官方客户端

    2.ssdb4j

    SSDB的Java驱动,实现了连接池,主从。连接池使用commons-pool。

    maven  dependency:

    org.nutz

    ssdb4j

    9.3

    SSDBJ是一款支持SSDB NoSQL数据库集群的驱动。

    功能:

    1、ssdb数据库连接池

    2、支持多个SSDB数据库的master-slave集群

    3、支持集群内部的master和slave的负载均衡,负载均衡暂时支持4中方式(Random round_robin round_robin_weight random_weight)

    4、实现了读写分离

    5、支持集群内slave获取not_found的情况下从master再次直接获取

    6、支持同步未完成时slave读取error的情况下,从master尝试或者重复在slave中尝试。尝试次数可以再配置文件中修改。

    具体参考 src/test/resource/ssdbj.xml

    ssdbj提供了3中使用方式:

    1、直接手动创建连接,可以参考src/test/java/SSDBJTest.java

    2、使用单库连接池,可以参考 src/test/java/SSDBPoolTest.java

    3、使用集群模式,可以参考src/test/java/SSDBClusterTest.java

    集群模式的配置文件可以参考src/test/resource/ssdbj.xml

    下面以jbakwd的ssdbj为例。需要下载源码添加到本地maven仓库中。

    com.lovver

    ssdbj

    0.0.1

    集群配置:ssdbj.xml

    port="8888"user=""password=""loginTimeout="3"tcpKeepAlive="true"

    protocolName="ssdb"maxTotal="200"maxIdle="10"minIdle="5"

    testWhileIdle="true"/>

    port="8888"user=""password=""loginTimeout="3"tcpKeepAlive="true"

    protocolName="ssdb"maxTotal="200"maxIdle="10"minIdle="5"

    testWhileIdle="true"/>

    error_retry_times="3"error_master_retry="true"retry_interval="500"

    balance="random_weight">

    ssdb_db1

    ssdb_db2

    测试代码:SSDBClusterTest.java

    packagecn.slimsmart.redis.demo.ssdb;

    importcom.lovver.ssdbj.SSDBJ;

    importcom.lovver.ssdbj.core.BaseResultSet;

    importcom.lovver.ssdbj.core.SSDBCmd;

    @SuppressWarnings("unchecked")

    publicclassSSDBClusterTest {

    publicstaticvoidmain(String[] args)throwsException {

    //解析ssdbj.xml,查询ssdb_cluster,找到一个实例执行get key命令

    //SSDBCmd 支持ssdb命令

    //executeUpdate 添加更新

    BaseResultSet rs= SSDBJ.execute("ssdb_cluster",SSDBCmd.GET,"key");

    System.out.println(rs.getStatus());

    System.out.println(newString(rs.getResult()));

    if(SSDBJ.executeUpdate("ssdb_cluster",SSDBCmd.SET,"key","value22")){

    rs= SSDBJ.execute("ssdb_cluster",SSDBCmd.GET,"key");

    System.out.println(rs.getStatus());

    System.out.println(newString(rs.getResult()));

    }else{

    System.out.println("executeUpdate fail.");

    }

    }

    }

    http://blog.csdn.net/zhu_tianwei/article/details/45013497

    http://www.oschina.net/question/35855_142213\

    http://ssdb.io/docs/zh_cn/redis-to-ssdb.html

    http://ssdb.io/zh_cn/

    展开全文
  • 聊一聊Java中的几种读取properties配置文件的方式 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置: config.properties会经常存放一些系统常量,版本号,路径之类的database....

    聊一聊Java中的几种读取properties配置文件的方式

    相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:

    • config.properties会经常存放一些系统常量,版本号,路径之类的
    • database.properties存放数据库的连接参数
    • log4j.properties 日志的一些基本配置
    • redis.properties 缓存数据库的一些配置

    当然前缀是根据用能自行定义的,一般来说文件的内容的格式是“键=值”的格式,文本注释信息可以用”#”来注释,下面来说说开发中如何读写properties配置文件。

    Java读取Properties文件

    Properties类读取

    Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方,就是它的键和值都是字符串类型。

    1. //方式一
    2. InputStream in = new BufferedInputStream(new FileInputStream("文件路径名"));
    3. Properties p = new Properties();
    4. p.load(in);
    5. System.out.println(p.getProperty("version"));
    6. //方式二
    7. InputStream ins = PropertiesUtil.class.getResourceAsStream("文件路径名");
    8. Properties ps = new Properties();
    9. ps.load(ins);
    10. System.out.println(ps.getProperty("version"));
    11. //方式三
    12. InputStream inss = PropertiesUtil.class.getClassLoader().getResourceAsStream("文件名");
    13. Properties pss = new Properties();
    14. pss.load(inss);
    15. System.out.println(pss.getProperty("version"));
    16. //方式四
    17. InputStream insss = ClassLoader.getSystemResourceAsStream("文件名");
    18. Properties psss = new Properties();
    19. psss.load(insss);
    20. System.out.println(pss.getProperty("version"));

    ResourceBundle读取方式

    这个类提供软件国际化的捷径。通过此类,可以使您所编写的程序可以:

    • 轻松地本地化或翻译成不同的语言
    • 一次处理多个语言环境
    • 以后可以轻松地进行修改,支持更多的语言环境

    说的简单点,这个类的作用就是读取资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。

    使用这个类,要注意的一点是,这个properties文件的名字是有规范的:一般的命名规范是: 自定义名语言代码国别代码.properties,如果是默认的,直接写为:自定义名.properties
    比如:
    myres_en_US.properties
    myres_zh_CN.properties
    myres.properties

    1. //方式五
    2. ResourceBundle rb = ResourceBundle.getBundle("文件名前缀", Locale.getDefault());
    3. System.out.println(rb.getObject("version"));
    4. //方式六
    5. InputStream is = new BufferedInputStream(new FileInputStream("文件名前缀"));
    6. ResourceBundle rbs = new PropertyResourceBundle(is);
    7. System.out.println(rbs.getObject("version"));

    ResourceBundle读取方式,相对来说比较方便,但是仔细查看源码,ResourceBundle读取一次就会被系统缓存。

    对于在生产环境中,如果我们要动态修改properties的一些参数,如果使用ResourceBundle读取方式就必须要重启服务器了。

    展开全文
  • 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:config.properties会经常存放一些系统常量,版本号,路径之类的database.properties存放数据库的连接参数log4j.properties 日志的一些基本...

    相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:

    config.properties会经常存放一些系统常量,版本号,路径之类的

    database.properties存放数据库的连接参数

    log4j.properties 日志的一些基本配置

    redis.properties 缓存数据库的一些配置

    当然前缀是根据用能自行定义的,一般来说文件的内容的格式是“键=值”的格式,文本注释信息可以用”#”来注释,下面来说说开发中如何读写properties配置文件。

    Java读取Properties文件

    Properties类读取

    Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方,就是它的键和值都是字符串类型。

    ResourceBundle读取方式

    这个类提供软件国际化的捷径。通过此类,可以使您所编写的程序可以:

    轻松地本地化或翻译成不同的语言

    一次处理多个语言环境

    以后可以轻松地进行修改,支持更多的语言环境

    说的简单点,这个类的作用就是读取资源属性文件(properties),然后根据.properties文件的名称信息(本地化信息),匹配当前系统的国别语言信息(也可以程序指定),然后获取相应的properties文件的内容。

    使用这个类,要注意的一点是,这个properties文件的名字是有规范的:一般的命名规范是: 自定义名语言代码国别代码.properties,如果是默认的,直接写为:自定义名.properties

    比如:

    myres_en_US.properties

    myres_zh_CN.properties

    myres.properties

    ResourceBundle读取方式,相对来说比较方便,但是仔细查看源码,ResourceBundle读取一次就会被系统缓存。

    对于在生产环境中,如果我们要动态修改properties的一些参数,如果使用ResourceBundle读取方式就必须要重启服务器了。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

    原文链接:http://blog.52itstyle.com/archives/879/?utm_source=tuicool&utm_medium=referral

    展开全文
  • 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:config.properties会经常存放一些系统常量,版本号,路径之类的database.properties存放数据库的连接参数log4j.properties 日志的一些基本...
  • 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:config.properties会经常存放一些系统常量,版本号,路径之类的database.properties存放数据库的连接参数log4j.properties 日志的一些基本...
  • 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:config.properties会经常存放一些系统常量,版本号,路径之类的database.properties存放数据库的连接参数log4j.properties 日志的一些基本...
  • 相信对于一名JAVA开发者开说properties文件一定再熟悉不过了,比如一下配置:config.properties会经常存放一些系统常量,版本号,路径之类的database.properties存放数据库的连接参数log4j.properties 日志的一些基本...
  • config.properties会经常存放一些系统常量,版本号,路径之类的database.properties存放数据库的连接参数log4j.properties 日志的一些基本配置redis.properties 缓存数据库的一些配置 当然前缀是根据用能自行定义...
  • SSDB支持 Redis 网络协议, 所以你可以用 Redis 的客户端来连接 SSDB 服务器. 但是, 使用 SSDB 客户端是最高效的方式。所有的 SSDB 客户端 API 都是...关于java客户端,有如下几种: 1.官方客户端 项目地址:ht...
  • Java面试笔记一

    2018-10-22 12:05:00
    以及线程池等待队列的几种实现方式?并发编程的一些常用问题?i++ 4、jdbc、myibatis、hibernate三种实现连接数据库方式? 5、springboot的返回json报文如何配置?模板有哪些? 6、redis的缓存持久化的方式? 7...

空空如也

空空如也

1 2 3 4 5
收藏数 86
精华内容 34
关键字:

java连接redis几种方式

java 订阅
redis 订阅