一.介绍
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
启动后如图:
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
③执行后端启动命令
[root@linux02 bin]#./redis-server redis.conf
后端启动关闭方式:
强制关闭(不推荐):
[root@localhost-0723 bin]#kill -9 5528
正常关闭:
[root@localhost-0723 bin]# ./redis-cli shutdown
三.Redis集群搭建
3.1 架构图
架构细节:
(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投票:容错
(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.conf文件
1、修改port为7001
2、修改daemonize为yes
3、修改cluster-enable为yes
③将这份修改好的redis单机版另外复制5份, 端口分别为7002-7006:
④启动所有的redis实例
一个一个启动太麻烦, 可以编辑一个启动脚本start-all.sh, 放在redis-cluster目录下:
查看是否启动成功:
ps aux | grep redis
⑤创建集群:
执行以下命令:
./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
执行后效果如下:
至此,集群创建成功!!!
注意:
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();
}