redis
redis的安装一
安装的准备
首先得买一个服务器(我买的阿里云ecs轻量级);
再下载远程客户端(我用的Xshell,Xftp);
打开Xftp将下载好得redis压缩包传输Xftp中,在进入Xshell中Linux命令安装;
rides安装
下载地址:https://redis.io/
安装:
1,Linux进入redis所在目录;
2,执行命令:tar -zxvf redis-3.2.10.tar.gz //个人建议将软件安装在/usr/local目录下,执行命令:tar -zxvf redis-3.2.10.tar.gz -C /usr/local/redis,当然解压完了move也可以;
3,进入解压后的目录进行编译,cd redis-3.2.10. 执行命令:make ,make命令后可能报错,如果报错,解决如下:
报错一:那可能是没有gcc (linux下的一个编译器,是c,c++程序的编译器)
使用命令yum进行安装,yum -y install gcc
报错二:error:jemalloc/jemalloc.h:No such file or disectoty //可能找不到c语言中的头文件
执行 make MALLOC = libc
4,安装完gcc之后,make distclean 清理下上次make后产生的文件,再make
redis启动:
方式一:前端启动模式,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,而且当前命令窗口处于一种阻塞状态,想要执行其它命令需要重新开启一个新命令窗口
执行命令:cd /usr/local/redis/redis-3.2.10/bin
再执行命令:./redis-server
//ps -f | grep redis 查看进程 kill pid(进程号) 杀掉进程
方式二:后台启动模式,./redis-server & //建议后台启动
后台启动并输出日志到 nohup.out 文件:nohup /usr/local/redis-3.2.10/src/-server &
再回车确定
ls查看文件会发现出现一个nohup.out文件
cat nohup.out 就会将日志打在此文件中
redis关闭:./redis -cli shutdown
redis的安装二
https://www.jb51.net/article/146751.htm
redis客户端
redis命令行客户端:redis -cli (./redis -cli -h 127.0.0.1 -p 6379) //redis自带基于命令行得redis客户端
Redis Desktop Manager(远程客户端): //要下载
远程连接redis需要修改redis主目录下的redis.conf配置文件:
1,bind ip 绑定ip注释掉
2,protected-mode yes 保护模式改为no;
可以进入目录配置文件改,也可以命令改,命令如下:
进入目录:cd /usr /local /redis-3.2.10 /
进入文件:vim redis.conf 回车确定
注释bind ip;protected-mode yes 保护模式改为no;回车确定
ps -ef | grep redis //查看进程
kill pid //杀掉当前进程再重启
nohup /usr/local/redis-3.2.10/src/redis - server /usr/local/redis-3.2.10/redis.conf & //重启进程并打出日志文件
进入下载好的远程客户端:
Connection 连接自己的远程服务器地址; //这里一定要填自己的远程ip,不能填本地
ok
phpRedisAdmin(远程客户端):
需要安装php运行环境
php开发自行下载xampp
redis编程客户端:
redis的Java客户端:
jedis:
jedis源码:https://github.com/xetorhio/jedis
api文档:http://xetorthio.geihub.io/jedis/
redis的使用
基础命令:
1, ./redis -cli //启动
输入ping,redis会返回PONG表示服务运行正常
2,redis默认16个库,但是可以再redis.conf中修改。 //可进文件改,也可命令改
进入文件:vim redis.conf 回车确定
找到databases 16 //可改
3,redis默认使用0号库,select db //切换库 例:select 2
4,删除
删除所有库数据 : flushall
删除当前库数据 : flushdb
5,获取redis的所有配置 :config get *
6,退出连接:exit / quit
7,查看当前数据库中key的数目:dbsize
8,查看redis服务器的统计信息:info
命令与使用文档:
命令:
key命令
字符串类型 :string
哈希类型 :hash
列表类型 :list
集合类型 :set
有序集合类型 :zset(sorted set)
文档:
中文:https://redis.io/commands
英文:https://redisdoc.com/
redis常用命令 :
keys * //列出所有key
exists key //检查某个key是否存在
set key value //存入key值 例:set k1 v1
move key db //将当前的key移动到给定的库db中,例:move k1 2
expire key seconds //设置key值过期时间 例:expire k1 8
ttl key (time to live) //查看是否过期,-1永不过期,-2 已过期或key不存在
type key //查看key所存储值得类型
del key //删除key
redis更多使用方法请移步菜鸟教程:https://www.runoob.com/redis/redis-install.html
redis5中数据类型命令
字符串类型 String(可以存储任何形式的字符串)
set key value 将字符串值value设置到key中
get key 获取key中的value
incr key 将key中存储的数字加一,若key不存在,key得值先被初始化为0,再执行incr操作(只对存储的数字有用)
decr key 将key中存储的数字减一,若key不存在,key得值先被初始化为0,再执行incr操作(只对存储的数字有用)
setex key seconds value 设置key值及过期时间(set expire)
setnx key value 给无值或者不存在的key给值,有值则不设置值
getset key value 给key设置新值并返回旧值
strlen key 返回key所存储字符串长度
append key value 若key存在且为字符串,则追加(跟jquery一样);key不存在将追加的设为新值
incrby key increment 将key所存储的值加上增质量(自定义量),若key不存在,则key的值初始化为0,再执行incrby
decrby key increment 将key所存储的值减去增质量(自定义量),若key不存在,则key的值初始化为0,再执行incrby
getrange key start end 截取key中字符串值,从star开始,end结束(类似subString)
setrang key offset value 从字符串指定位置替换value,例:k1值为helloworld,执行setrang k1 5(第五个位置) redis 则输出:helloredis
mset key1 value key2 value2 ... 同时设置多个key-value
mget key1 key2 keyn ... 同时获取多个key-value
msetnx key1 value key2 value2 ... 同时设置多个key-value,当且仅当所有给定key都不存在时才能设置成功,有一个key存在值都不行
哈希类型hash(String类型的映射,适合存储对象)
hset key field value 将哈希表key中的域field的值设置为value 例:hset k1 id 1001
hget key field 取值 例:hget k1 id
hmset key1 field value ... 同时设置多个值 例:hmset k2 id 1002 name likauhua age 10 pwd 123 ...
hmget key field ... 同时取多个值 例:hmget k2 id name age
hgetall key 查询哈希表key里所有值
hdel key 删除哈希表key中一个或多个指定值field
hkeys key 查看哈希表key中所有field域(查询所有字段)
hvals key 查看哈希表key中所有域的值(字段所对应的值)
type key 查案key存储的数据类型
hlen key 查看哈希表key中域field的个数(字段个数)
hexists key 查看哈希表key中,给定域field是否存在(字段是否存在还)例:hexists k1 id
hincrby key field increment 为哈希表key中的域的值加上增量 例:hincrby k1 id 5
hincrbyfloat key field increment 为哈希表key中的域的值加浮点数上增量
hsetnx key field value 将哈希表key中的域field的值设为value,当且仅当field不存在时才设置,否则不设置 例:hsetnx k1 age(这个字段不存在时才能设置) 18
列表类型list(简单的字符串列表,按照插入排序,元素可重复)
lpush key value1 value2 value3 将一个或多个值value插入到列表key的表头(最左边) 例:lpush k1 1 2 3 4 5
rpush key value1 value2 value3 将一个或多个值value插入到列表key的表尾(最右边) 例:lpush k1 7 8 9 10 11
lrange key start stop 获取表key中指定区间内元素,0为第一元素,-1为倒数第一元素。 例:lrange key 0 -1 (区间所有元素)
lpop key 从左边获取列表key的第一个元素,并将该元素移除
rpop key 从右边获取列表key的第一个元素,并将该元素移除
lindex key index 获取列表key中下标为指定index元素 例:lindex key 3
llen key 获取列表key的长度
lrem key count value 从左至右删除列表中指定个数与指定value值相等的value 例:lrem k1 1 4 4这个元素被删除了
ltrim key start stop 删除指定区域外的元素
rpoplpush source destination 将列表source中的尾元素插入到列表destination中,作为头元素 例:rpoplpush k1 k2 (将本列表尾元素放另一个列表当头元素)
lset key index value 将列表key下标为index的元素设为value 例:lset k1 0 222(将0下标下的元素替换成22)
linsert key before|after pivot value 将值插入到指定值之前或之后 例:linsert k1 before 5 100(将k1域内值5前插入100,元素非下标)
集合类型 set(redis的Set时String类型的无序集合,成员唯一,集合中不重复)
sadd key member member ... 将一个或多个member元素加入集合key中,已存在集合的member元素不加入 例:sadd k1 1 2 3 4
smembers key 获取聚合key中所有元素
sismember key member 判断member是否是集合key的成员 例:sismember k1 1
scard key 获取聚合中元素个数
srem key member 删除聚合中一个或多个元素(指定删除某个元素) 例:srem k1 2
srandmemner key [count] 随机返回集合中一个或多个元素 count 是返回的个数
spop key 随机删除集合中的一个元素
smove source destination member 将member元素从一个集合移到另一个集合 例:smove k1 k2 2(将元素2从k1 移到k2)
有序聚合zset(sorted set):跟set差不多,不同的是zset得每个元素都会关联一个分数(分数可重复),redis通过分数来为集合中的成员进行排序
zadd key score member 将一个或多个member元素及其score值加入到有序集合 例:zadd k1 100 likaihua 90 likaihua2
zrange key start stop 获取有序集合key中,指定区间的成员,按score大小排序 例:zrange k1 0 -1
zrevrange key start stop 获取有序集合key中,指定区间的成员,按score小大排序 例:zrange k1 0 -1
zrem key member 删除有序集合key中得一个或多个成员 例:zrem k1 likaihua
zcard key 获取集合个数
zrank key member 获取有序集合key中,成员member排名,有序集成员按score值从小到大排列 例:zrank k1 likaihua
zrevrank key member 获取有序集合key中,成员member排名,有序集成员按score值从大到小排列
zrangebyscore key start stop 获取有序集合key中,所有score值介于min和max之间的成员 例:zrange k1 100 90
zrevrangebyscore key start stop 获取有序集合key中,所有score值介于max和min之间的成员
zcount key min max 获取有序集合key中,所有score值介于min和max之间的成员个数 例:zcount k1 10 100
score(分数)
Table键 补全命令
官方命令文档:redisdoc.com
redis的发布和订阅
发布订阅:redis发布订阅(pub/sub)是一种消息通信模式;也称为生产者模式,实现消息队列的一种方式
消息队列三要素:1,生产者(producer)2,消费者(consumer)3,消息服务(broker)
三者关系:1 (producer)——>3 (redis在次充当consumer)——>2(consumer)
一个消息发布者,多个消息订阅者
命令实现:1,开启4个redis客户端,三个作为消息订阅者,一个作为消息发布者:./redis-cli
2,消息订阅者:subscribe channel
// 如果是订阅匹配模式:psubscribe chan * 表示匹配以chan开头的频道主题都能拿到
3,消息发布者:publish channel message
//就跟扶贫一样,国家把钱给政府干部,干部(干部===消息发布者)发钱,带有精准扶贫这个标识人就可以凭此去拿钱(贫困户==消息订阅者)
jedis编程实现:
订阅者:
public void onMessage(String channel, String message){ //封装的回调函数
System.out.println("频道"+channel+"发布了消息"+message);
}
public static void main (String [ ] arg){
Jedis jedis = new Jedis ("192.168.0.1" ,6379); //连接redis
Sub sub = new Sub(); //创建订阅者对象
jedis.subscribe(sub, "channel");
}
发布者:
public static void main (String [ ] arg){
Jedis jedis = new Jedis ("192.168.0.1" ,6379); //连接redis
jedis.publish("channel", "hello world"); //发布消息
jedis.close();
}
redis事务(redis中的事务是一组命令集合,至少两条以上命令,redis事务保证这些命令被执行时不会被其他操作打断)
正常流程:1,MULTI:该命令告诉redis接下来的命令暂不执行,将其暂存(开启事务)
2,SADD "user1" 第一天命令进入等待队列
3,SADD "user2"第二条命令进入等待队列
4,EXEC 告知redis执行暂存的命令(提交事务) //放弃事务:DISCARD,不执行,事务放弃
//就跟坐客车(事务 == 大客车)一样,单个不走,包车不准。等人多了,包圆儿了一块走。
命令示例:
MULTI
set k2(key) v2(value)
set k3(key) v3(value)
EXEC
也存在异常和例外情况:1,语法错误,事务回滚不执行
2,语法正常,逻辑错误,例如incr给一个字符加1,或者不给值,能够入队,但提交事务后会显示该语句存在错误
锁:
悲观锁:当有人读取数据时会被认为要更改数据,因此每次在读取数据时会先上锁,直到这个线程拿到锁为止。(本线程结束后其他线程才能进来读取数据。就跟上厕所似的,进去先锁门,自己拉完了别人才能进来拉)
乐观锁:当有人读取数据时不会被认为更改数据,不上锁。但在更新时会判断在此期间是否有人更改数据,一般用版本号机制进行判断。
悲观锁的判断机制:大多数基于数据版本号机制实现。版本号?:即为数据增加一个版本标识。
一般通过为数据库表添加“version”字段来实现读取数据时,也将此版本一同读出。之后来读取数据的人提交数据更新时,会对此版本号加1。
此时提交数据的版本号与数据库表对应记录的当前版本号对比,若提交数据版本号大于数据库表当前版本号,则准予更新(数据库当前版本号只会更新一次)
示例:
1,A操作员将用户数据读取(version=1),进行修改操作。
2,B操作员将用户数据读取(version=1),进行修改操作。
3,A完成操作,提交数据时(version +1 =2),提交更新。此时提交数据版本号大于数据库记录的当前版本号,准许提交。
4,B完成操作,提交数据时(version +1 =2),提交更新。但是此时的数据库记录的版本号已经被A提交数据后更新为2了,所以B提交的版本号不大于数据库记录的当前版本号,则不准予提交数据更新。
因为数据库记录的版本号只更新一次,谁快先更新了,版本号就变了,必须等上一个线程完成后再进去操作。(就争媳妇似的的,谁下手快生了娃,谁就稳了)
redis的watch机制实现乐观锁(监视一个或多个key,如果在事务exec执行之前这个key被其他命令更改,那么该事务将会被打断)
命令如下:
set k1 1 //设k1为1
watch k1 //监视k1
set k1 2 //k1值在被监视时被更改为2,另外人开客户端更改也一样
multi //开始事务
set k1 3 //将k1值改为3
exec //提交事务
输出null,事务被放弃。检测到k1也被更改为2,不再是1了。
(就像本来你跟你女朋友快要结婚了,但是结婚前一天在你爸妈的眼皮子底下决定跟别人私奔,你爹妈知道了不想让你背锅,在你们结婚时强行拆散,唉,真惨。)
redis的持久化机制
持久化概述:持久化==存储,就一直存着可以。
redis持久化:redis数据存储在内存中,内存是瞬时的,如果发生宕机或者系列糟糕情况,内存会丢失。redis提供两者持久化机制
//就跟男人一样,要持久,持之以恒,坚定不移。
RDB方式:在指定的时间间隔内将内存中的数据快照写入磁盘,数据恢复时将快照文件直接再读到内存
步骤:在redis.conf文件中配置
配置格式:save
save 900 1 //900秒内一次数据更改会保存一次
save 3000 10
save 6000 20
配置文件redis.conf中搜索SNAPSHTTING:dbfilename:设置RDB文件名。默认文件名为dump.rdb //就是可以修改保存文件的名字
dir:指定RDB和AOF的文件目录 //修改保存文件的指定目录
//修改redis.conf文件后要重启一下redis
AOF方式:redis每收到一条修改命令时,它将命令写道一个AOF文件中(不记录读命令),当redis重启时,再通过AOF中的所有命令在恢复
步骤:rdis.conf文件中搜索APPEND ONLY MODE
1,将append only改为yes,默认no;
AOF相关设置: 1,appengfilename:AOF文件名,可改,默认:appendonly.aof
////查看aop文件存储的命令:1,ll *.aop;2,cat appendonly .aof
2,appendfsync:配置向aof文件写命令数据策略:
1,append fsync always 每次执行写入都会执行同步,慢且安全
2,append fsync everysec 每秒执行一次同步操作
3,append fsync no 不主动进行同步操作,交给系统来做,30秒一次,快但不且不安全
3,auto-aof-rewrite-percentage(例如:100):设置当目前aof文件大小超过上一次重写时aof文件大小的百分之多少时,将再次进行重写;若之前未进行重写,则以启动时最小aof文件大小为依据;
//进行文件优化,例:set k1 1 后再执行 set k1 2,那么set k1 1则不被记录,只记录有用的命令
4,auto-aof-rewtite-min-size(例如:64mb):设置允许重写的最小aof文件大小
总结:可以同时使用两种方式,默认优先加载aof
redis集群
主从复制
主从复制(master/slave):
简介:redis做集群,为保证单点故障,就将数据复制多芬岛多台不同服务器,即使其中一台出现故障,其他服务仍可运行。
实现:部署多台redis,并在配置文件中指定之间的主从关系。主负责写,同时将写入数据实时同步到从机器,即主从复制。master/slave,redis默认master用于写,slave用于读。
配置方式一:修改配置文件,启动时,服务器读取配置文件,自动成为指定服务器的从服务器,构成主从复制关系。
主服务器(master)
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
从服务器(slave)
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6381
pidfile /var/run/redis6380.pid
logtile 6381.log
dbfilename dump6381.rdb
slaveof 127.0.0.1 6380
示例:(由于只有一台服务器,因此在一个redis中启三个实例,一个master两个slave)方便观看就开4个客户端窗口。
以下为客户端窗口 1。
bin目录下
cp redis.conf redis6380.conf //复制原来redis6379.conf配置文件,并生成新的redis6380.conf配置文件
ll //出现redis6380.conf文件
>redis6380.conf //滞空redis6380.conf文件
vim redis6380.conf //进入redis6380.conf文件,添加主服务的配置
配置master
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
:wq //如果无法保存退出,就按下esc键再,:wq a.txt
配置从slave
cp redis6380.conf redis6381.conf //复制redis6380.conf文件
vim redis6381.conf //进配置文件配置从
include /usr/local/redis-5.0.3/redis.conf
daemonize yes //表示后台启动
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
slaveof 127.0.0.1 6380 //设置是6380的从服务器
:wq //如果无法保存退出,就按下esc键再,:wq a.txt
cp redis6380.conf redis6382.conf //复制redis6380.conf文件
vim redis6381.conf //进配置文件配置从
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
slaveof 127.0.0.1 6380 //设置是6380的从服务器
:wq //如果无法保存退出,就按下esc键再,:wq a.txt
客户端窗口2
./redis-server ../redis6380.conf //后台启动master
./redis-server ../redis6381.conf //后台启动slave
./redis-server ../redis6382.conf //后台启动slave
ps -ef | grep redis //查看这三个进程是否启动
如果已经有三个进程的了,也可以检查各个端口所处角色
./redis -cli -p 6380 //开启6381客户端
info replication //插看服务器角色命令
查看的信息:
role:master(主) //角色master
connected_slaves:2 //两个从,端口号分别为
slave0:port:6381
slave1:port:6382
客户端窗口3
./redis -cli -p 6381 //开启6381客户端
info replication //插看服务器角色命令
查看的信息:
role:slave(从) //角色slave
master_host:127.0.0.1 //主是本地的
master_port:6380 //端口号为6380
master_link_status:up //开启状态
客户端窗口4
./redis -cli -p 6382 //开启6381客户端
info replication //插看服务器角色命令
查看信息与3一样
配置完成可测试
1,回到master所在客户端窗口
set k1 v1
set k2 v2 //设置两个值,在从服务器去取,看是否能读取值
2,回到任意一个slave所在客户端窗口
get k1
get k2
3,看能否读到值,读到即配置成功
get k3 //读master为设置的值看是否能读到
输出null,未读到;
4,回到master所在客户端窗口
set k3 v3 //设置k3,再去slave读,看是否能读取
5,回到任意一个slave所在客户端窗口
get k3
输出:v3 //读取成功
主从关系配置完成
如果现在出现问题了,master服务器宕机了,关闭了,主没了,只有从了,怎么办?
引入新的处理方式
容灾处理(冷处理):当master服务出现故障后,需要手动将slave中的一个提升为master,将剩下的slave重新挂至新的master上;
命令如下:
slaveof no one :将一台slave服务器提升为master
slaveof 127.0.0.1 6381(新提上slave端口号):将slave挂至新的master上
操作示例:
1,在master所在服务器客户端
shutdown //关闭master,模拟master出故障
ps -ef | grep redis //查看redis6380.conf进程是否被关闭
2,在任意一个slave所在服务器客户端
slaveof no one //提升为主
info replication //查看所处角色即从服务
显示信息
role:master //角色为主
connected_slaves:0 //没有从服务器
3,在另外slave中的任意一个slave所在服务器客户端
slaveof 127.0.0.1 6381 //将本slave挂至新的master上去
info replication //查看角色及主服务
显示信息
role:slave
master_host:127.0.0.1
master_port:6381 //挂在了新的master上了
4,假如现在原来的master6380服务器修好
./redis-server ../redis6380.conf //后台启动
ps -ef | grep redis //查看进程是否被启动
./redis-cli -p 6380 //进入redis
info replication //查看角色
显示信息
role:master //角色为master
connected_slaves:0 //slaves为0
原来master重启后,默认角色为master现在将它挂至新的6381master上去
slaveof 127.0.0.1 6381 //将本slave挂至新的master上去
总结:
1,使用到的相关命令:
./redis-cli -p 6380 进入指定客户端端口
info replication 查看redis服务器所处角色
如果不配置启动,默认为master
2,master下线,写请求无法执行;slave下线,读请求处理性能下降
3,master故障,需要手动提升一个slave为master。其他的slave要重新挂至新的master上去
4,主从复制模式的故障转移需要手动操作,需要实现自动化处理,就再次引入Sentine哨兵,实现故障自动转移
哨兵模式(热处理)
作用:Sentine哨兵可以来监控多个redis服务实例运行情况
Sentinel配置:
1,复制三份文件:sentinel26380.conf,sentinel26381.conf,sentinel26382.conf;
2,修改每个配置文件
port 26380;port 26381;port 26382;
sentinel monitor mymaster 127.0.0.1 6380 2
Sentinel会根据master的配置自动发现master和slave,Sentinel默认端口是26379
3,启动三个实例
./redis-sentinel ../sentinel26380.conf
./redis-sentinel ../sentinel26380.conf
./redis-sentinel ../sentinel26380.conf
启动三个实例后,会创建三个监视master服务的Sentinel实例
4,哨兵模式已启动;
操作示例:
redis6379客户端窗口
1, cd usr/local/redis-5.0.3/bin //进入bin文件夹
2,ll //会看到一个
// redis-sentinel 哨兵可执行文件,读取配置文件,站岗
// sentinel.conf 哨兵配置文件
3,复制三个sentinel.conf配置文件
cp sentinel.conf sentinel26380.conf //复制sentinel26379配置文件生成新的sentinel26380文件
cp sentinel.conf sentinel26381.conf
cp sentinel.conf sentinel26382.conf
4,逐个修改sentinel.conf文件
vim sentinel26380.conf
port 26380 (进哪个端口改那个)
sentinel monitor mymaster 127.0.0.1 6381 2
// 2 投票数:这个投票数就是哨兵的投票数。检测master的这个哨兵发现这个master挂了,但它不能直接确定,
//会让其他的哨兵也来检测这个master,认为挂了的哨兵就投一票,等票数过半了,就确定真挂了。
:wq //保存退出
vim sentinel26381.conf
port 26381 (进哪个端口改那个)
sentinel monitor mymaster(可修改文件名) 127.0.0.1 6381(主服务端口号,上面新提升的slave) 2(投票数)
:wq //保存退出
vim sentinel26382.conf
port 26382 (进哪个端口改那个)
sentinel monitor mymaster(可修改文件名) 127.0.0.1 6381(主服务端口号,上面新提升的slave) 2(投票数)
:wq //保存退出
/*
解析:
sentinel monitor mymaster(文件名可修改) 127.0.0.1(本地地址) 6381(master,主服务端口号) 2(投票数)
2 投票数:这个投票数就是哨兵的投票数。检测master的这个哨兵发现这个master挂了,但它不能直接确定master挂了,
会让其他的哨兵也来检测这个master,认为挂了的哨兵就投一票,等票数过半了,就确定真挂了。
*/
5,ls //查看文件会看到三个sentinel.conf文件
./redis-sentinel ../sentinel26380.conf //启动文件
6,在新建两个客户端窗口方便启动,1窗口,2,窗口
1窗口
./redis-sentinel ../sentinel26381.conf
2窗口
./redis-sentinel ../sentinel26382.conf
7,回到之前的master客户端窗口,关闭master,演示故障转移
shutdown
ps -ef | gerp redis //查看进程,redis6381是否被关闭
8,看1,2窗口,是否打印的日志信息
...
# + failover-end master mymaster 127.0.0.1 6381 //6381进程end
# + switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380 //master6381替换成6380
9,回到6380客户端窗口查看角色
info replication
信息显示
role:slave //角色slave
master-port:6380 //它的master是6380
10,回到6381(被停掉的master服务器),重启服务看看
./redis-server ../redis6381.conf //重启服务
./redis -cli -p 6381 //进入redis客户端
info replication
显示信息
role:slave //角色slave
master-port:6380 //它的master是6380
示例完成;
总结:哨兵模式你补了容灾处理需要手动处理的缺陷。哨兵监控master主服务,当它发现master挂了的时候会自动进行古故障转移。
自动将其中的slave与挂了的master进行角色交换,而后就算挂了的master服务重启后也不再是master,而是自动修改成新master服务的slave服务。
redis相关安全
redis设置密码:redis.conf文件配置中 requirepass 123456
操作示例:
cd usr/local/redis-5.0.3
vim redis.conf //进入配置修改
找到requirepass去掉注释,后面加上密码 123456
:wq
kill 6379 //杀掉进程重启
./redis-server ../redis.conf & //启动后台
./redis -cli -p 6379 //启动6379客户端
AUTH 123456
在jedis连接客户端时也要密码
jedis.auth("123456");
绑定ip:#bin 127.0.0.1 去点注释,127.0.0.1换成你允许连接的ip.表示只允许这个ip进行访问;
命令禁止和重命名(也是在redis.conf配置中进行):
rename-command FLUSHALL del 重命名flushall命令为del
注意:这里重命名前提是appendonly.aof文件中没有flushall命令,否则服务器无法启动
//因为redis.conf配置里改名了,appendonly.aof文件中还存在flushall命令,那会冲突,无法识别del新命令
rename-command FLUSHALL "" 禁用flushall //flushall 清空本库所有信息
rename-command FLUSHDB "" 禁用flushdb //flushdb 清空所有库所有信息
rename-command CONFIG JIJJMKXW 重命名config命令
rename-command CONFIG "" 禁用config命令 //config查看所有配置 config get *
redis特点:
简单稳定;支持丰富的内存结构;读写速度快;有持久化支持;支持部分事务操作;
总结:纸上得来尚觉浅,绝知此事要躬行;
set k1 "加油!"
https://www.bilibili.com/video/BV1Q4411N7u4/?p=28