Redis,
- Redis
- 准备工作
- 概述
- 配置
- Linux上安装Redis
- Redis客户端
- Redis的5中数据类型
- Redis的持久化方案
- Redis集群
- Redis集群架构图
- 节点机制
- Redis集群节点和槽的关系
- Redis集群的搭建
- Redis客户端连接Redis集群
- Java代码连接Redis
- 单机版
- 单机版使用连接池
- 集群版
- Redis和Spring整合
Redis
准备工作
下载redis
概述
Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据,Redis一般用来做缓存,减轻数据库压力,提高查询速度,redis有16个数据库,默认用的0号数据库。
配置
详细配置可参见菜鸟教程
Linux上安装Redis
Redis客户端
./redis-cli -h ip -p port
连接redis:./redis-cli -h 192.168.13.3 -p 6379
Redis的5中数据类型
hincrby:
1. 该命令用于为哈希表中的字段值加上指定增量值。
2. 增量也可以为负数,相当于对指定字段进行减法操作
3. 如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令
4. 如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0
Redis的持久化方案
Redis的所有数据都是保存到内存中的,有可能会丢失数据。
Redis集群
Redis集群架构图
节点机制
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis集群节点和槽的关系
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
Redis集群的搭建
Redis集群节点之间采用投票机制确定节点是否正常工作,必须有一半以上的节点投票才能确定一个已经坏掉的节点,因此redis集群最少必须有3个节点,为了实现高可用,每个节点又必须最少有一个备份节点,所以一个高可用的redis集群,最少需要6个节点,即6个redis实例。
Redis客户端连接Redis集群
./redis-cli -h ip -p port -c
Java代码连接Redis
单机版
@Test
public void testJedisSingle() throws Exception {
Jedis jedis = new Jedis("192.168.13.3", 6379);
jedis.set("mytest", "1000");
String result = jedis.get("mytest");
System.out.println(result);
jedis.close();
}
单机版使用连接池
@Test
public void testJedisPool() throws Exception {
//创建一个连接池对象
JedisPool jedisPool = new JedisPool("192.168.13.3", 6379);
//从连接池获得连接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("mytest");
System.out.println(result);
//每次jedis使用完毕后需要关闭,连接池回收资源。
jedis.close();
//系统结束前关闭连接池
jedisPool.close();
}
集群版
@Test
public void testJedisCluster() throws Exception {
//连接集群使用JedisCluster对象
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.13.3", 7001));
nodes.add(new HostAndPort("192.168.13.3", 7002));
nodes.add(new HostAndPort("192.168.13.3", 7003));
nodes.add(new HostAndPort("192.168.13.3", 7004));
nodes.add(new HostAndPort("192.168.13.3", 7005));
nodes.add(new HostAndPort("192.168.13.3", 7006));
//系统中可以是单例
JedisCluster jedisCluster = new JedisCluster(nodes);
jedisCluster.set("jediscluster", "123456");
String result = jedisCluster.get("jediscluster");
System.out.println(result);
//系统结束前关闭JedisCluster
jedisCluster.close();
}
Redis和Spring整合
单机版连接池配置
<!-- 单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.13.3"/>
<constructor-arg name="port" value="6379"/>
</bean>
<bean id="jedisClientPool" class="com.mydeertrip.jedis.JedisClientPool"/>
集群版配置
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.13.3"/>
<constructor-arg name="port" value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.13.3"/>
<constructor-arg name="port" value="7002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.13.3"/>
<constructor-arg name="port" value="7003"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.13.3"/>
<constructor-arg name="port" value="7004"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.13.3"/>
<constructor-arg name="port" value="7005"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.13.3"/>
<constructor-arg name="port" value="7006"/>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.mydeertrip.content.jedis.JedisClientCluster"/>