前面我们从数据结构开始一路走来,已经比较全面的认识了redis。这篇文章开始分享redis在我们业务当中的使用。
开始分享之前我先提两个我听到的问题:
1、哨兵模式下,我们的业务端应该连接到哪个redis服务器,既我们应该配置哪些信息?

我先吧jedis提供的JedisSentinelPool信息帖出来我们一起看一下源码就知道这个是怎么回答了。如果你对过程不感兴趣那么你可以直接读正经答案我会在那里给出解答的
JedisSentinelPool的maven坐标,请忽略版本(因为这不是重点)


redis.clients
jedis
2.9.0

对没错 它是包含在jedis里的。
接下来构建JedisSentinelPool实例。(不管田七何首乌先new出来再说)(这个过程是我阅读源码的过程)
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool();//当然这里会报错,我选择忽略,因为肯定是有一些东西我还没做。
摁住CTRL 鼠标点击JedisSentinelPool,进入JedisSentinelPool.class这个文件 这里有多个重写的构造方法,但是不要急,摁住CTRL 鼠标点击构造方法里的this在你跳转到大概第85行之前你可以一直点。那么在85行这里提供了真正意义上的 JedisSentinelPool构造过程:
HostAndPort master = initSentinels(sentinels, masterName);
initPool(master);
跟踪进initSentinels()这个方法我发现,这里的逻辑是用masterName在sentinels里找master的ip和port,一旦找到可用的master,就构建一个redis实例并返回。

正经答案:
JedisSentinelPool的构造方法要求我们传入两个参数:
1、Set<String> sentinels 这个String是这样的 ip:port,sentinels是多个哨兵所在主机的ip和哨兵运行port的集合
2、String masterName 这个masterName是这样的:任何一台redis实例的机器上(不管是master还是slave都可以) 输入info replication 这个命令都会看到 类似mymaster这样的字样 这个mymaster就是masterName
sentinel模式下是通过在客户端配置sentinel集群的信息和主节点的信息,来连接redis集群的。
想看代码么?

import java.util.HashSet;
 import java.util.Set;
 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisSentinelPool;
 Set sentinels = new HashSet();
 sentinels.add(“0.0.0.0:6379”);
 sentinels.add(“0.0.0.1:6379”);
 sentinels.add(“0.0.0.2:6379”);
 String masterName = “mymaster”;
 JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName,sentinels);
 Jedis jedis = jedisSentinelPool.getResource();
 jedis.set(“zhugegangtie”,“balabala”);
 String value = jedis.get(“zhugegangtie”);

2、集群模式下 ,为什么会有MOVED的错误?
这个问题…先说MOVED是什么意思吧;
举个板栗吧(香甜软糯的高山小板栗)
我有两个redis实例A和C:
分别对应的slot值是
A:1~10000,
C:10001~16383,
在A上调用set方法,存一条记录:{“zhugegangtie”:balabala},
经过CRC16算法的处理"zhugegangtie",得到的slot值是10001。也就是说这条记录应该存到B上。那么会报这样一个error:
(error) MOVED 10001 0.0.0.0:6379
这里10001 是"zhugegangtie"对应的slot值;
0.0.0.0:6379 这里是C的ip和port。

明白了吧!当我们存储的数据不应该在这个实例上时,才会报这样一个错误,并提醒我们应该去哪里存?

下面来分享我们可能会使用到的redis客户端
jedis:内部维护了线程池。最普通的redis客户端不多说了 ;集群模式中使用JedisCluster。
也是包含在Jedis包中的。
JedisCluster存储数据的大致过程是这样的:
先把key通过CRC16进行处理获得slot值,通过slot其对应节点的信息,构建连接并存值。
代码分享出来:

import java.util.HashSet;
 import java.util.Set;
 import redis.clients.jedis.HostAndPort;
 import redis.clients.jedis.JedisCluster;
 Set ipAndPort= new HashSet();
 ipAndPort.add(new HostAndPort(“0.0.0.1”,6379));
 ipAndPort.add(new HostAndPort(“0.0.0.2”,6379));
 ipAndPort.add(new HostAndPort(“0.0.0.3”,6379));
 JedisCluster jedisCluster = new JedisCluster(ipAndPort);
 String str=jedisCluster.set(“mic”,“testJedisCluster”);


redisson:实现了分布式环境下、可拓展、java语言编写的数据结构,他更像zookeeper里的curator客户端。 惹认识它之前我最喜欢的是jedis,现在我移情别恋了,redisson才是分布式环境下的王者。
它封装了redis的基础命令是得使用起来更加面向对象;同时他还实现了基于redis的一些常用功能,比如我最执念的分布式锁以前我是手撕的一个用起来不是很顺手,但是redisson帮我实现了这个功能;其他还有分布式队列,原子递增,全局ID等等等等等
代码分享出来:

import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RList;
import org.redisson.api.RMap;
import org.redisson.api.RSet;
import org.redisson.api.RSortedSet;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

Config config = new Config();
config.useClusterServers().addNodeAddress(
 								  "redis://192.168.152.130:6379",
 								  "redis://192.168.152.129:6379",
 								   "redis://192.168.152.128:6379"
 							);
		RedissonClient redissonClient = Redisson.create(config);
		//操作String
		RBucket<Object> rBucket=redissonClient.getBucket("mic");
		//操作Set
		RSet<Object> rSet = redissonClient.getSet("testRSet");
		//操作有序集合SortedSet
		RSortedSet<Object> rSortedSet=redissonClient.getSortedSet("testSortedSet");
		//操作Map
		RMap <String,Object> map=redissonClient.getMap("xiaoxiaohou");
		//操作List
		RList<Object> rList=redissonClient.getList("testList");
		rBucket.set("testRedisson");
		map.put("test", "testRMap");
		rSortedSet.add("sortedSet");
	}

lettuce:基于netty实现,线程安全的redis客户端(这个我没仔细研究,因为我从jedis移情到redisson以后就变得忠贞起来了)