文章目录
Redis
1. NoSql概述
1.1 什么是Nosql
随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。)
1.2 为什么要使用Nosql
l 传统的数据库遇到的瓶颈
传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。
到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。
- 高并发读写
Web2.0网站,数据库并发负载非常高,往往达到每秒上万次的读写请求
- 高容量存储和高效存储
Web2.0网站通常需要在后台数据库中存储海量数据,如何存储海量数据并进行高效的查询往往是一个挑战
1024T=1PB…
- 高扩展性和高可用性
随着系统的用户量和访问量与日俱增,需要数据库能够很方便的进行扩展、维护
1.3 NoSql数据库的优势
- 易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
- 大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
- 灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。
- 高可用
NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。
高可用(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
1.4 RDBMS vs NOSQL
RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
1.5 常见的Nosql产品
redis,solor,mongodb等
2. Redis概述
2.1 什么是Redis
全称:**R**Emote **D**Ictionary **S**erver(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BCD协议。**是一个高性能的key/value)分布式内存数据库**,
基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。Redis的上一代产品 *Memcached* !!!
Redis 与其他 key - value 缓存产品有以下三个特点
i)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用!!!
ii)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
iii)Redis支持数据的备份,即master-slave(主从)模式的数据备份,也可以集群!!!
2.2 Redis优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe(发布订阅), 通知, key 过期等等特性
2.3 Redis应用场景
2.3 Redis下载
3 Redis的环境和安装
3.1 环境准备
- 虚拟机
- Linux系统
- SSH客户端
3.2 Redis的安装
3.2.1 Redis的编译环境
Redis是C语言开发的,安装redis需要先去官网下载源码进行编译,编译需要依赖于GCC编译环境,如果CentOS上没有安装gcc编译环境,需要提前安装,安装命令如下:
[root@bruce1 ~]# yum install gcc-c++
如果提示是否安装,选择: y
3.2.2 Redis的安装
l 使用filezilla上传Redis安装文件到Linux目录
l 上传Redis安装文件
l 解压redis文件
[root@bruce1 myapps]# tar -zxvf redis-3.0.0.tar.gz
l 编译Redis(编译,将.c文件编译为.o文件)
进入解压文件夹,cd redis-3.0.0/
执行 make
编译成功!如果编译过程中出错,先删除安装文件目录,后解压重新编译。
l 安装
[root@szl redis-3.0.0]# make PREFIX=/root/myapps/redis install
l 安装之后的bin目录
l Copy文件
Redis启动需要一个配置文件,可以修改端口号信息。
[root@bruce1 redis-3.0.0]# cp redis.conf /root/myapps/redis
3.3 Redis的启动
3.3.1 Redis的前端模式启动
前台启动:界面停住,不能进行别的操作!!
下面是启动界面
使用ctrl+c退出前端启动。
3.3.2 Redis的后端启动
l 修改redis.conf配置文件,daemonize yes以后端模式启动
[root@szl redis]# vi redis.conf
l 启动时,制定配置文件
[root@szl redis]# ./redis-server ./redis.conf
这里只需要指定redis-server的位置和配置文件的位置就行了,并不一定要按照我的命令来
l 查看进程
可以看到已经启动成功了。
3.3.3 Redis的停止
l 强制结束程序。强制终止Redis进程可能会导致redis持久化数据丢失。
l 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为(关闭默认的端口)
[root@bruce1 redis]# ./bin/redis-cli shutdown
3.4 Redis的连接
3.4.1 连接客户端
3.4.2 向Redis服务器发送命令
l Ping,测试客户端与Redis的连接是否正常,如果连接正常,回收到pong
4. Redis的数据结构
4.1 Redis的数据结构介绍
Redis简单理解就是个一个Map结构 key–value 根据key操作value!
4.2 存储String
4.2.1 常用命令
赋值
取值
取值的同时赋值
删除
数值的增减
4.2.2 扩展的命令
4.3 存储Hash
4.3.1 常用命令
- 赋值和取值
2 删除
-
增加数字
4.3.2 扩展的命令
hexists key field
hlen key:
hkeys key
4.4 存储List
!
4.4.1常用命令
两端添加
lpush key values[…]
rpush key values[…]
查看列表
lrange key [start,end]
两端弹出
获取元素的个数
4.4.2 扩展的命令
4.5. Keys通用操作
5. Redis的多数据库
切换至0数据库下面
将newkey移动到1号数据库
6 Redis的常见服务器命令
7 Redis集群
7.1. Redis的主从复制
7.1.1 什么是主从复制
持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:
说明:
-
主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
-
主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
-
只有一个主redis,可以有多个从redis。
-
主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求
7.1.2 主从配置
-
主节点的配置
无需特殊配置,保持和之前的单机配置方式。
-
从redis配置
- 第一步:复制出一个从机
[root@bruce1 myapps]# cp redis/ redis1 -r [root@bruce1 myapps]# ll 总用量 40 drwxr-xr-x. 3 root root 4096 7月 1 09:26 redis drwxr-xr-x. 3 root root 4096 7月 1 09:27 redis1 drwxr-xr-x. 9 root root 4096 6月 28 23:26 tomcat
- 第二步:修改从机的redis.conf
语法:slaveof
第三步:修改从机的port地址为6380
在从机redis.conf中修改
第四步:清除从机中的持久化文件
[root@bruce1 bin]# rm -rf appendonly.aof dump.rdb
[root@bruce1 bin]# ll
总用量 15440
-rwxr-xr-x. 1 root root 4588902 7月 1 09:27 redis-benchmark
-rwxr-xr-x. 1 root root 22225 7月 1 09:27 redis-check-aof
-rwxr-xr-x. 1 root root 45443 7月 1 09:27 redis-check-dump
-rwxr-xr-x. 1 root root 4691809 7月 1 09:27 redis-cli
lrwxrwxrwx. 1 root root 12 7月 1 09:27 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 6450337 7月 1 09:27 redis-server
第五步:启动从机
[root@bruce1 redis1]# ./bin/redis-server ./redis.conf
第六步:启动6380的客户端
[root@bruce1 redis1]# ./bin/redis-cli -p 6380
127.0.0.1:6380> keys *
1) "mylist"
2) "num"
3) "bookCate1"
4) "newbook"
5) "company"
127.0.0.1:6380>
注意:
- 主机一旦发生增删改操作,那么从机会将数据同步到从机中
- 从机不能执行写操作
127.0.0.1:6380> get username
"hehe"
127.0.0.1:6380> set username haha
(error) READONLY You can't write against a read only slave.
7.2 Redis集群搭建
7.2.1 redis-cluster架构图
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot槽上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点!
示例如下:
7.2.2 redis-cluster投票:容错
(1) 集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过(cluster-node-timeout),认为该master节点挂掉.
(2) 什么时候整个集群不可用(cluster_state:fail)?
**如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态**。**也可以理解成集群的[0-16383]slot映射不完全时进入fail状态。**
**如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。**
7.2.3 搭建Rubby环境
集群管理工具(redis-trib.rb)是使用ruby脚本语言编写的。
第一步: 安装ruby
[root@redis1 bin]# yum install ruby
[root@redis1 bin]# yum install rubygems
第二步:将以下文件上传到linux系统
![1543319088135](/1543319088135.png)
第三步:安装ruby和redis接口
-rw-r--r--. 1 root root 22301 8月 18 2016 dangdang.sql
drwxr-xr-x. 3 root root 4096 7月 1 10:00 redis
drwxr-xr-x. 3 root root 4096 7月 1 09:54 redis1
drwxrwxr-x. 6 root root 4096 4月 1 2015 redis-3.0.0
-rw-r--r--. 1 root root 57856 7月 1 10:03 redis-3.0.0.gem
drwxr-xr-x. 9 root root 4096 6月 28 23:26 tomcat
[root@bruce1 myapps]# gem install redis-3.0.0.gem
第四步:将redis-3.0.0包下src目录中的以下文件拷贝到redis-cluster/
[root@bruce1 myapps]# mkdir redis-cluster
[root@bruce1 myapps]# cd redis-3.0.0/src/
[root@bruce1 src]# cp redis-trib.rb ~/myapps/redis-cluster/
[root@bruce1 src]# ll ~/myapps/redis-cluster/
总用量 48
-rwxr-xr-x. 1 root root 48141 7月 1 10:20 redis-trib.rb
7.2.4 集群的搭建过程(单机)
搭建集群最少也得需要3台主机,如果每台主机再配置一台从机的话,则最少需要6台机器。
设计端口如下:创建6个redis实例,需要端口号7001~7006
第一步:复制出一个7001实例
[root@bruce1 myapps]# cp redis/ redis-cluster/7001 -r
[root@bruce1 myapps]# cd redis-cluster/7001
[root@bruce1 7001]# ll
总用量 52
drwxr-xr-x. 2 root root 4096 7月 1 10:22 bin
-rw-r--r--. 1 root root 3446 7月 1 10:22 dump.rdb
-rw-r--r--. 1 root root 41404 7月 1 10:22 redis.conf
第二步:如果存在持久化文件,则删除
[root@bruce1 bin]# rm -rf appendonly.aof dump.rdb
第三步:修改redis.conf配置文件,打开cluster-enable yes
第四步:修改端口
第五步:复制出7002-7006机器
[root@bruce1 redis-cluster]# cp 7001/ 7002 -r
[root@bruce1 redis-cluster]# cp 7001/ 7003 -r
[root@bruce1 redis-cluster]# cp 7001/ 7004 -r
[root@bruce1 redis-cluster]# cp 7001/ 7005 -r
[root@bruce1 redis-cluster]# cp 7001/ 7006 –r
第六步:修改7002-7006机器的端口
第七步:启动7001-7006这六台机器,写一个启动脚本
cd 7001
./bin/redis-server ./redis.conf
cd ..
cd 7002
./bin/redis-server ./redis.conf
cd ..
cd 7003
./bin/redis-server ./redis.conf
cd ..
cd 7004
./bin/redis-server ./redis.conf
cd ..
cd 7005
./bin/redis-server ./redis.conf
cd ..
cd 7006
./bin/redis-server ./redis.conf
cd ..
第八步:修改start-all.sh文件的权限
[root@bruce1 redis-cluster]# chmod u+xstart-all.sh
第九步:启动所有的实例
[root@bruce1 redis-cluster]# ./start-all.sh
第十步:创建集群
[root@bruce1 redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.221.128:7001 192.168.221.128:7002 192.168.221.128:7003 192.168.221.128:7004 192.168.221.128:7005 192.168.221.128:7006
>>> Creating cluster
Connecting to node 192.168.221.128:7001: OK
Connecting to node 192.168.221.128:7002: OK
Connecting to node 192.168.221.128:7003: OK
Connecting to node 192.168.221.128:7004: OK
Connecting to node 192.168.221.128:7005: OK
Connecting to node 192.168.221.128:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.221.128:7001
192.168.221.128:7002
192.168.221.128:7003
Adding replica 192.168.221.128:7004 to 192.168.221.128:7001
Adding replica 192.168.221.128:7005 to 192.168.221.128:7002
Adding replica 192.168.221.128:7006 to 192.168.221.128:7003
M: e7fb45e74f828b53ccd8b335f3ed587aa115b903 192.168.221.128:7001
slots:0-5460 (5461 slots) master
M: 4a312b6fc90bfee187d43588ead99d83b407c892 192.168.221.128:7002
slots:5461-10922 (5462 slots) master
M: 713218b88321e5067fd8ad25c3bf7db88c878ccf 192.168.221.128:7003
slots:10923-16383 (5461 slots) master
S: 4f8c7455574e2f0aab1e2bb341eae319ac065039 192.168.221.128:7004
replicates e7fb45e74f828b53ccd8b335f3ed587aa115b903
S: 8879c2ed9c141de70cb7d5fcb7d690ed8a200792 192.168.221.128:7005
replicates 4a312b6fc90bfee187d43588ead99d83b407c892
S: b1183545245b3a710a95d669d7bbcbb5e09896a0 192.168.221.128:7006
replicates 713218b88321e5067fd8ad25c3bf7db88c878ccf
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.221.128:7001)
M: e7fb45e74f828b53ccd8b335f3ed587aa115b903 192.168.221.128:7001
slots:0-5460 (5461 slots) master
M: 4a312b6fc90bfee187d43588ead99d83b407c892 192.168.221.128:7002
slots:5461-10922 (5462 slots) master
M: 713218b88321e5067fd8ad25c3bf7db88c878ccf 192.168.221.128:7003
slots:10923-16383 (5461 slots) master
M: 4f8c7455574e2f0aab1e2bb341eae319ac065039 192.168.221.128:7004
slots: (0 slots) master
replicates e7fb45e74f828b53ccd8b335f3ed587aa115b903
M: 8879c2ed9c141de70cb7d5fcb7d690ed8a200792 192.168.221.128:7005
slots: (0 slots) master
replicates 4a312b6fc90bfee187d43588ead99d83b407c892
M: b1183545245b3a710a95d669d7bbcbb5e09896a0 192.168.221.128:7006
slots: (0 slots) master
replicates 713218b88321e5067fd8ad25c3bf7db88c878ccf
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
7.2.5 集群的搭建过程(多台服务器)
搭建rubby环境
第一步: 安装ruby
[root@redis1 bin]# yum install ruby
[root@redis1 bin]# yum install rubygems
第二步:将以下文件上传到linux系统
我们有六台机器,可以通过scp命令来进行拷贝
scp -r [本机的文件路径] 对方用户@[对方ip]:对方保存地址
-r 表示递归文件
scp -r /home/mysoft/redis-3.0.0.gem root@192.168.159.139:/home/mysoft/
输入密码后会传输,在139服务器上的指定位置就可以看到该文件
第三步:安装ruby和redis接口
[root@bruce1 myapps]# gem install redis-3.0.0.gem
第四步:将redis-3.0.0包下src目录中的redis-trib.rb拷贝到redis-cluster/
集群环境搭建:
第一步
我们需要准备好六台服务器,并且分别为其配置好ip和安装好redis
第二步
删除redis中的持久化文件
第三步:修改redis.conf配置文件,打开cluster-enable yes
第四步:启动这六台机器,我们可以通过xshell的以下功能
通过勾选全部会话来为所有连接统一执行启动命令
第五步:创建集群
./redis-trib.rb create --replicas 1 192.168.159.131:6379 192.168.159.135:6379 192.168.159.136:6379 192.168.159.137:6379 192.168.159.138:6379 192.168.159.139:6379
>>> Creating cluster
Connecting to node 192.168.159.131:6379: OK
Connecting to node 192.168.159.135:6379: OK
Connecting to node 192.168.159.136:6379: OK
Connecting to node 192.168.159.137:6379: OK
Connecting to node 192.168.159.138:6379: OK
Connecting to node 192.168.159.139:6379: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.159.139:6379
192.168.159.138:6379
192.168.159.137:6379
Adding replica 192.168.159.136:6379 to 192.168.159.139:6379
Adding replica 192.168.159.135:6379 to 192.168.159.138:6379
Adding replica 192.168.159.131:6379 to 192.168.159.137:6379
S: 30a30868e0b227f4dc8b5394a19fce50e00d8df7 192.168.159.131:6379
replicates b87164c67e325df80444c654be485494d5387892
S: 3a2f71ae76e845e2119ddf5f2fc26e05b013e05d 192.168.159.135:6379
replicates 66fef89d846ec69298eb700c9397563f054cc485
S: 3108303270af663892168b90765abdda9f599d8d 192.168.159.136:6379
replicates 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3
M: b87164c67e325df80444c654be485494d5387892 192.168.159.137:6379
slots:10923-16383 (5461 slots) master
M: 66fef89d846ec69298eb700c9397563f054cc485 192.168.159.138:6379
slots:5461-10922 (5462 slots) master
M: 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3 192.168.159.139:6379
slots:0-5460 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join......
>>> Performing Cluster Check (using node 192.168.159.131:6379)
M: 30a30868e0b227f4dc8b5394a19fce50e00d8df7 192.168.159.131:6379
slots: (0 slots) master
replicates b87164c67e325df80444c654be485494d5387892
M: 3a2f71ae76e845e2119ddf5f2fc26e05b013e05d 192.168.159.135:6379
slots: (0 slots) master
replicates 66fef89d846ec69298eb700c9397563f054cc485
M: 3108303270af663892168b90765abdda9f599d8d 192.168.159.136:6379
slots: (0 slots) master
replicates 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3
M: b87164c67e325df80444c654be485494d5387892 192.168.159.137:6379
slots:10923-16383 (5461 slots) master
M: 66fef89d846ec69298eb700c9397563f054cc485 192.168.159.138:6379
slots:5461-10922 (5462 slots) master
M: 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3 192.168.159.139:6379
slots:0-5460 (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
通过以上返回的结果信息我们可以看出系统随机分配的主从关系
可以看出
131是137的从
135是138的从
136是139的从
7.2.6 连接集群
命令: ./redis-cli -h 192.168.159.137 -p 6379 -c
-c :指定是集群连接
./redis-cli -h 192.168.159.137 -p 6379 -c
192.168.159.137:6379> set username 12345
-> Redirected to slot [14315] located at 192.168.159.137:6379
OK
7.2.7 查看集群中节点信息
8 Jedis使用
8.1 Jedis介绍
8.2 Java连接Redis
8.2.1 导入maven依赖
<!--redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
8.2.2 单实例连接
@Test
public void testJedisSingle() {
// 1.设置IP地址和端口
Jedis jedis = new Jedis("192.168.221.128", 6379);
// 2.设置数据
jedis.set("name", "szl");
// 3.获得数据
String name = jedis.get("name");
System.out.println("name=" + name);
jedis.close();
}
如果连接不上,需要事先把服务器端端口在防火墙中打开。
也可以选择关闭防火墙测试。service iptables stop
8.2.3 连接池的连接方式
@Test
public void testJedisPool() {
// 1.获取连接池配置对象,设置配置项
JedisPoolConfig config = new JedisPoolConfig();
// 1.1最大的连接数
config.setMaxTotal(30);
// 1.2最大的空闲
config.setMaxIdle(10);
// 2.获取连接池
JedisPool jedisPool = new JedisPool(config, "192.168.221.128", 6379);
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
// 4.设置数据e
jedis.set("name", "bruceLiu");
String name = jedis.get("name");
System.out.println("name=" + name);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
// 虚拟机关闭的时候,释放资源
if (jedisPool != null) {
jedisPool.close();
}
}
}
8.3 Java连接Redis集群
8.3.1 代码实现
/*
* 01-测试向集群中新增数据
*/
@Test
public void testJedisCluster() throws Exception {
// 创建一连接,JedisCluster对象,在系统中是单例存在
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.159.131", 6379));
nodes.add(new HostAndPort("192.168.159.135", 6379));
nodes.add(new HostAndPort("192.168.159.136", 6379));
nodes.add(new HostAndPort("192.168.159.137", 6379));
nodes.add(new HostAndPort("192.168.159.138", 6379));
nodes.add(new HostAndPort("192.168.159.139", 6379));
JedisCluster cluster = new JedisCluster(nodes);
// 执行JedisCluster对象中的方法,方法和redis一一对应。
cluster.set("cluster-test", "This is my jedis cluster test!!");
// String result = cluster.get("cluster-test");
// System.out.println(result);
// 程序结束时需要关闭JedisCluster对象
cluster.close();
System.out.println("集群测试成功!");
}
/*
* 02-测试获取集群中的数据
*/
@Test
public void testJedisGet() {
// 创建一连接,JedisCluster对象,在系统中是单例存在
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.221.128", 7001));
nodes.add(new HostAndPort("192.168.221.128", 7002));
nodes.add(new HostAndPort("192.168.221.128", 7003));
nodes.add(new HostAndPort("192.168.221.128", 7004));
nodes.add(new HostAndPort("192.168.221.128", 7005));
nodes.add(new HostAndPort("192.168.221.128", 7006));
JedisCluster cluster = new JedisCluster(nodes);
String result = cluster.get("cluster-test");
System.out.println(result);
// 程序结束时需要关闭JedisCluster对象
cluster.close();
System.out.println("集群测试成功!");
}
9 Redis哨兵解决方案
9.1 环境准备
准备两台虚拟机服务器,安装好Redis
这是我的环境目录
redis:Master的启动目录---->redis.conf配置文件
send1,send2:从机的启动目录---->sentinel1.conf sentinel2.conf
sendServer:Sentinel的启动目录---->sentinel.conf csentinel.conf
9.2 启动主机redis
./redis/redis-server ./redis.conf
配置从机,如果使用配置文件启动从机需要将配置文件中的slaveof打开
并填上主机的ip和端口号
启动从机1 从机2
./sen1/redis-server ./sentinel1.conf
./sen2/redis-server ./sentinel2.conf
此时,我们可以看到6379,6380,6381都已经启动,然后以同样的方式去配置服务器2
配置成功后,接下来配置哨兵设置
9.3 哨兵配置
服务器一,我们配置两个哨兵,服务器二配置一个哨兵,与上面的架构图相吻合
创建哨兵配置文件
vi sentinel.conf
#配置端口
port 26379
#配置监听服务器1
sentinel monitor s2 192.168.159.139 6379 2
#配置监听服务器2
sentinel monitor s1 192.168.159.138 6379 2
port :指定启动服务的端口号;
Sentinel monitor
name :redis主服务名称,可以自行命名,但是在一个sentinel网络中,一个redis主服务只能有一个名称;
本次在两个服务器分别有一个master,分别命名为s1,s2。
ip和port :redis主服务的IP地址和端口号;
quorum :表示要将这个主服务器判断为失效并下线至少需要2个sentinel同意;
本次使用了三个sentinel来构成sentinel网络,所以在这里设置为2,一般要启动奇数个sentinel,以保证不会出现正反方投票数相等的情况。
protected-mode :关闭保护模式(默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和sentinel的protected-mode修改为no,若只修改redis node,从远程连接sentinel后,依然是无法正常使用的,且sentinel的配置文件中没有protected-mode配置项,需要手工添加。依据redis文档的说明,若protected-mode设置为no后,需要增加密码证或是IP限制等保护机制,否则是极度危险的。)
以同样的方法在两个服务器中分别新建三个sentinel的配置文件。
服务器1的端口号分别为26379,26380 服务器2的端口为26379
分别启动三个服务
服务器一启动监听器1:
新开一个连接窗口,服务器一启动监听器2:
启动服务器二的监听器1:
9.4 模拟主机宕机
此时,我们通过杀掉master进程,来观察哨兵选出新master的过程:
我们已经将主机1的6379Master进程强制去掉了,此时看控制台,哨兵经过评选,选用138:6381作为新Master
此时,简单的哨兵机制搭建完毕