你们好,我是redis学习的新人,今天写这篇文章,但愿记录一下最近的学习 其实到如今我也不不知道redis具体能作什么,大概是缓存,这个暂时无论,先实现我想要的结果。 这边如何启动redis不讲了,请参考:http://www.runoob.com/redis/redis-tutorial.html redis是支持集群的,因此须要配置redis集群,总的来讲,将下载的redis文件复制多份, 修改一下配置就能够实现集群,我本身的总结: 我把个人实例打了个包,但愿对你们有帮助html
主从配置: 主服务器中的设置: 1:修改bind参数:绑定的服务器地址 (本地:127.0.0.1) 从服务器配置 1. 修改bing参数:绑定服务器地址 (注:不必定与主服务器在一块儿) 2. 修改port参数:端口号 (注:若是在同一个服务器上,端口号不一样来区分) 3. slaveof参数: 设置主服务器的地址以及端口号(设置master的Host以及Port) [注意: 须要顶格写,不能有空格] ] 4. 若是主服务器设置了密码,从服务器须要修改masterauth参数
配置好了主从服务器(从服务器只读),尝试一下,确实能够实现值的同步git
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); JedisShardInfo shard1 = new JedisShardInfo("127.0.0.1", "6379"); JedisShardInfo shard2 = new JedisShardInfo("127.0.0.1", "6380"); shards.add(shard1); shards.add(shard2); JedisPoolConfig jpc = new JedisPoolConfig(); jpc.setMaxIdle(10); jpc.setMaxTotal(30); jpc.setMaxWaitMillis(3*1000); ShardedJedisPool sjPool = new ShardedJedisPool(jpc, shards); ShardedJedis jedis = sjPool.getResource(); jedis.set("temp", "heeloworld"); System.out.println("----"+jedis.get("temp")+"-----");
可是这样还不够,毕竟集群真正做用是一个服务器挂了,其余的能够接着用 网上又看到“哨兵”(Redis-Sentinel),详情请见:http://www.javashuo.com/article/p-vguqgocn-gw.html 所以本身作了一些尝试,确实能够实现该功能。redis
1.以前已经准备好了主从服务器多个,每一个里面添加一个sentinel.conf的文件 2.文件的内容是 ####master sentinel.conf ##sentinel实例之间的通信端口 default 26379 port 36379 ####sentinel须要监控的master信息:<mastername> <masterIP> <masterPort> <quorum>. ####<quorum>应该小于集群中slave的个数,只有当至少<quorum>个sentinel实例提交"master失效" 才会认为master为ODWON("客观"失效) . sentinel myid 45e995cdd93d2db1e48d563c8b3a4f69caf03274 ##**如下地址是主服务器地址,特别留意:主从切换后,此处的地址会改变哟** sentinel monitor mymaster 127.0.0.1 6379 1 sentinel down-after-milliseconds mymaster 1000 sentinel config-epoch mymaster 10
接下来就展现一下个人例子segmentfault
下两张图展现的是两个服务器,一个是6379端口一个是6380端口, 经过info replication命令,能够从role看出服务器的角色:master(主服务器),slave(从服务器) 再下面两张是启动sentinel监听的画面,所占用的端口能够修改sentinel.conf的port属性
主从服务器都启动,读写数据都没有问题
这个时候,将主服务器关闭
这个时候注意从服务器的role从slave变成了master
最后读取数据也没有问题,并且获取数据的服务器地址从6379,变成了6380, 说明咱们的功能实现了,主从切换,客户端请求也切换到获取最新的主服务数据
注意:想必你们也注意到个人代码中的问题,前面我是用的ShardedJedisPool对象请求数据, 可是到后来,代码里使用的JedisSentinelPool,为何会有这样一个变化, 是由于ShardedJedisPool对象在主从服务器切换以后,就没法请求到数据了, 可是JedisSentinelPool就能够,具体原理我也不清楚。
最后,这是个人一点点见解,有不对的地方但愿你们能够提示我,毕竟我了解的很少, 在这里但愿大牛能够给我些指导,在项目中如何使用redis,有没有实例能够给我学习学习,谢谢你们!