一.介绍

Redis是使用C语句编写的高性能的键值对非关系型数据库。Redis只能作为关系型数据库的一种良好补充,它代替不了关系型数据库。

Redis中的数据都是通过key-value结构进行存储。

Redis中有五种数据类型:
String 字符串 key — value
Hash 散列(map) key —- field-value
List 队列
Set 集合
Zset 有序集合

Redis中的数据类型是针对key-value结构中的value进行定义的。

Redis中的key永远都是string。

Redis是运行在内存中的,所以它很重要的一个使用场景就是作为缓存服务器来使用。专门的缓存服务器由Memcache\OSCache\EHCache

二.Redis安装

2.1Redis安装

① 在Linux下安装gcc环境

 由于redis是用C写的, 所以要有gcc环境

[root@linux02 redis-3.0.0]#yum –y install gcc-c++
② 将Redis源码包redis-3.0.0.tar.gz上传至Linux, 并解压缩
[root@linux02 ~]#tar -zxf redis-3.0.0.tar.gz
③编译redis源码

 进入redis-3.0.0目录, 执行以下命令:

[root@linux02 redis-3.0.0]#make
④安装redis

 进入redis-3.0.0目录, 执行以下命令:

[root@linux02 redis-3.0.0]#make install PREFIX=/usr/local/redis

2.2Redis启动

2.2.1前端启动

 进入/usr/local/redis/bin, 执行以下命令:

[root@linux02 bin]#./redis-server

关闭命令:

ctrl+c

启动后如图:

redis集群中myself_数据库

2.2.2后台启动(推荐)
①将redis源码包中的redis.conf配置文件复制到/usr/local/redis/bin/下
[root@linux02 /]#cp /root/redis-3.0.0/redis.conf /usr/local/redis/bin/
②修改redis.conf,将daemonize由no改为yes
[root@redis01 bin]#vim redis.conf

redis集群中myself_Redis_02

③执行后端启动命令
[root@linux02 bin]#./redis-server redis.conf

后端启动关闭方式:
强制关闭(不推荐):

[root@localhost-0723 bin]#kill -9 5528

正常关闭:

[root@localhost-0723 bin]# ./redis-cli shutdown

三.Redis集群搭建

3.1 架构图

redis集群中myself_数据库_03


架构细节:

 (1)所有redis节点彼此互联(PING-PONG机制), 内部使用二进制协议优化传输速度和带宽.

 (2)节点失效是通过集群中超过半数的节点与此节点检测失效才为失效.

 (3)客户端与redis直接连接, 不需要代理. 客户端不需要连接集群中的所有节点, 连接任意一个即可.

 (4)Redis-cluster把所有物理节点映射到[0-16383]slot哈希槽上.

注:

 Redis集群中内置了16384个哈希槽. 当需要向集群中放置一个key-value数据是, redis首先对key值使用crc16算法得到一个结果, 然后将结果与16384求余, 这样每个key都会得到一个0-16383之间的哈希槽, redis会根据节点数量将哈希槽平均分配.

3.2Redis-cluster投票:容错

redis集群中myself_redis_04


(1)集群中所有master参与投票, 如果半数以上master节点与其中一个节点通信超时(cluster-node-timeout), 则认为该节点挂掉.

(2)什么时候整个集群不可用?(cluster-state: fail)

 ① 如果任意master挂掉, 且当前master没有slave, 则集群进入fail状态. 也可理解为[0-16383]哈希槽不连续则集群挂掉.

 ② 如果集群中超过半数的master挂掉, 不管是否有slave, 集群进入fail状态.

3.3Ruby环境搭建

 Redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境。
①安装ruby

[root@redis01 bin]# yum install ruby
[root@redis01 bin]# yum install rubygems

②上传ruby和redis的接口工程redis-3.0.0.gem到Linux
③安装ruby和redis的接口程序

[root@linux02 local]# gem install redis-3.0.0.gem

④将Redis集群管理工具redis-trib.rb复制到/usr/local/redis-cluster(需创建)目录下

[root@redis01 src]# cp /root/redis-3.0.0/src/redis-trib.rb /usr/local/redis-cluster/

3.4集群搭建

思路:
 将单机版redis(/usr/local/redis/bin/*)复制5份, 修改配置文件(端口等).
注:
 Redis集群最少3台机器(因为节点投票机制), 为了实现高可用, 每台master主机还要配置一台slave丛机, 所以一共需要6台redis服务器.
在此用不同端口模拟6台服务器, 规定为: 7001-7006

①进入单机版redis的bin目录下, 若有, 删除redis实例(..rdb.aof\nodes.conf 和dump.rdb文件 )

redis集群中myself_Redis_05

②修改redis.conf文件

 1、修改port为7001

 2、修改daemonize为yes

 3、修改cluster-enable为yes

redis集群中myself_集群_06

redis集群中myself_数据库_07

③将这份修改好的redis单机版另外复制5份, 端口分别为7002-7006:

redis集群中myself_redis_08

④启动所有的redis实例

 一个一个启动太麻烦, 可以编辑一个启动脚本start-all.sh, 放在redis-cluster目录下:

redis集群中myself_Redis_09


redis集群中myself_redis集群中myself_10

查看是否启动成功:

ps aux | grep redis

redis集群中myself_redis集群中myself_11

⑤创建集群:

 执行以下命令:

./redis-trib.rb create --replicas 1 192.168.242.128:7001 192.168.242.128:7002 192.168.242.128:7003 192.168.242.128:7004 192.168.242.128:7005  192.168.242.128:7006

注:

 –replicas两个横线: replicas 1表示每个紧跟一个副本(slave), 如果是0, 则都是master

执行后效果如下:

redis集群中myself_redis_12


redis集群中myself_数据库_13


至此,集群创建成功!!!

注意:
1、以后重启redis-cluster,只需要执行start-all.sh脚本启动redis服务即可。Redis-trib.rb命令只需要在最开始的时候,执行一次即可。
2、集群创建时,redis单机版中必须不能有.rdb.aof\nodes.conf文件(redis实例)

3.5连接集群

命令: ./redis-cli –h 127.0.0.1 –p 7001 –c(表示 连接的是cluster 集群)

[root@localhost-0723 redis]#./redis-cli -p 7006 -c
127.0.0.1:7006> set key1 123
-> Redirected to slot [9189] located at 127.0.0.1:7002
OK
127.0.0.1:7002>

四.Redis客户端Jedis的使用

4.1单实例连接

@Test
    public void testJedis() {
        //创建一个Jedis的连接(“IP”,”Redis端口”)
        Jedis jedis = new Jedis("192.168.242.128", 6379);
        //执行redis命令
        jedis.set("mytest", "hello world, this is jedis client!");
        //从redis中取值
        String result = jedis.get("mytest");
        //打印结果
        System.out.println(result);
        //关闭连接
        jedis.close();

    }

4.2连接池连接

@Test
    public void testJedisPool() {
        //创建一连接池对象(“IP”,”Redis端口”)
        JedisPool jedisPool = new JedisPool("192.168.242.128", 6379);
        //从连接池中获得连接
        Jedis jedis = jedisPool.getResource();
        String result = jedis.get("mytest");
        System.out.println(result);
        //关闭连接
        jedis.close();

        //关闭连接池
        jedisPool.close();
    }

4.3集群连接

@Test
public void testJedisCluster() throws Exception {
    //创建一连接,JedisCluster对象,在系统中是单例存在
    Set<HostAndPort> nodes = new HashSet<>();
    nodes.add(new HostAndPort("192.168.242.128", 7001));
    nodes.add(new HostAndPort("192.168.242.128", 7002));
    nodes.add(new HostAndPort("192.168.242.128", 7003));
    nodes.add(new HostAndPort("192.168.242.128", 7004));
    nodes.add(new HostAndPort("192.168.242.128", 7005));
    nodes.add(new HostAndPort("192.168.242.128", 7006));
    JedisCluster cluster = new JedisCluster(nodes);
    //执行JedisCluster对象中的方法,方法和redis一一对应。
    cluster.set("cluster-test", "my jedis cluster test");
    String result = cluster.get("cluster-test");
    System.out.println(result);
    //程序结束时需要关闭JedisCluster对象
    cluster.close();
}