13.Redis的配置文件: 在redis艮目录下提供redis.conf配置文件
可以配置一些redis服务端运行时的一些参数,
如果不使用配置文件,那么redis会安装默认的参数运行,
如果使用配置文件,在启动redis服务时,必须指定所使用的配置文件
a). redis配置文件中关于网络的配置:
port:指定redis服务所使用的端口,默认使用6379
bind:配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上的任何一个ip
一般情况下,都会配置一个ip,而且通常是一个真实的ip
-->如果配置了port和bind,则客户端连接redis服务时,必须指定端口和ip
eg:redis-cli -h 192.168.43.133 -p 6380 【启动】
redis-cli -h 192.168.43.133-p 6380 shutdown 【关闭】
tcp-keepalive:连接保活策略,服务器端多长时间向客户端发送一次ACK请求,判断客户端是否在使用。
长时间不使用的客户端会被断开,对在使用的客户端进行连接维护
b).常规配置:
loglevel: 配置日志级别,开发阶段可以设置成debug,生产阶段通常设置为notice或者warning
logfile: 指定日志文件。redis在运行过程中会输出一些日志信息,
默认情况下,这些信息会输出到控制台,我们可以使用logfile配置日志文件。
databases:指定redis服务默认创建的数据库实例个数,默认值是16
c).安全配置:
requirepass:设置访问redis服务时所使用的密码,默认不使用。
此参数必须在protected-mode=yes时才起作用。--->启动redis的安全模式
一旦设置了密码验证,客户端连接redis服务时,必须使用密码连接:redis-cli -h ip port -a pwd
===========================================================================================
14.redis的持久化:【redis的数据放在内存中的,这样在加快读取速度的同时也对数据的安全性产生了新的问题,即当redis所在
服务器发生荡机(或者关机),数据库里的所有数据将会全部丢失。为了解决这个问题redis提供了持久化功能--RDB和AOF】
-->redis提供持久化策略,在适当的时机采用适当的手段把内存中的数据持久化到内存磁盘中,每次redis服务启动时,都把磁盘上的数据再次加载内存中使用。
a). RDB策略【RDB策略是redis默认的持久化策略,很容易把最后几条数据没有保存】:在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作。
save <seconds><changes>:配置持久化策略
默认的策略:如果要禁用RDB策略,将save全部注释掉
1分钟内改变了1万次
或者5分钟内该改变了10次
或者15分钟内改变了1次
dbfilename:Redis RDB持久化数据生成的文件名,默认是dump.rdb,也可以自己配置
dir:Redis持久化数据生成文件保存的目录,默认是 ./ --->redis启动目录,也可以自己配置
b).AOF策略【会使效率大大折扣】:采用操作日志来记录进行每一次写操作,每次redis服务启动时,都会重新执行一遍操作日志中的操作。【把写命令记录下来】
---->效率低下,redis默认不开启
appendonly:配置是否开启AOF策略
appendfilename:配置操作日志文件
小结:根据数据的特点决定开启哪种持久化策略,一般情况下,开启RDB足够了。
===================================================================================================================
15.redis的事务:
事务: 把一组数据库命令放在一起执行,保证操作原子性【强调事务的一致性】,要么同时成功,要么同时失败。
Redis的事务: 允许在把一组redis命令放在一起执行,把命令进行序列化【按照放入的顺序】,然后一起执行,保证部分原子性。
1).multi:用来标记一个事务的开始。
multi
set k1 v1
set k2 v2
exec
2).exec:用来执行事务队列中所有的命令
3).redis的事务只能保证部分原子性:
a).如果一组命令中,有在压入事务队列过程中发生错误的命令,则本事务中所有的命令都不执行,能够保证事物的原子性。
multi
set k3 v3
seta kk vv--->命令错误
set k4 v4
exec--------->报错,对没有执行
b).如果一组命令中,在压入队列过程中正常,但是在执行事务队列命令时发生了错误,则只会影响发生错误的命令,不会影响其它命令的执行,不能保证事物的原子性。
multi
set k3 v3
incr k1------>不执行,语法没有错误
set k4 v4
exec
4).discard: 清除所有已经压入队列中的命令,并且结束整个事务
multi
set k5 v5
set k6 v6
discard
5).watch:监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行;否则,正常执行
watch key
【举例:比如一个客户端想decrby balance 50,要先判断version有没有被改变作为一个判断条件,决定要不要修改balance[并且修改balance的同时也会修改version]
在此客户端修改balance时,另一个客户端也想改变balance,也要判断version有没有被修改,假设前一个客户端先修改了balance,并且使version要发生了改变,
则发现此时version的值不相同了,则修改失败】---跟乐观锁类似
"update table set balance=balance-dept,version=version+1
where id=xxxx and version=100"
set balance 100
set balance2 1000
set version 1
watch version
multi
decrby balance 50
incrby balance2 50
exec
6).unwatch:放弃是监控所有的键
unwatch key
watch version
unwatch key
multi
decrby balance 50
incrby balance2 50
exec
==============================================================================================================
16.redis消息的发布与订阅:
redis客户端可以订阅某个频道,消息的发布者(也是客户端)往频道上发布消息,所有订阅此频道的客户端都能接受到消息。
1).subscribe:订阅一个或多个频道的消息
subscribe ch1 ch2 ch3
2).pushlish:将消息发布到指定频道
pushlish ch1 hello
3).psubscribe:订阅一个或多个频道的消息,频道名支持通配符
psubscribe news*
===================================================================================
17.redis的主从复制:主多从少,主写从读,读写分离,主写同步复制到从
主机数据更新后根据配置和策略,自动同步到从机的master/slave机制,Master以写为主,Slave以读为主
搭建一主二从集群:
1).搭建三台redis服务:使用一台redis模拟三台redis服务
提供三分redis配置文件:redis6379.conf、redis6380.conf、redis6381.conf
cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf
修改端口号:redis6379.conf-->
port:6379
pidfile /var/run/redis_6379.pid
logfile "6379.log"
dbfilename dump6379.rdb
redis6380.conf-->
port:6380
pidfile /var/run/redis_6380.pid
logfile "6380.log"
dbfilename dump6380.rdb
redis6381.conf-->
port:6381
pidfile /var/run/redis_6381.pi
logfile "6381.log"
dbfilename dump6381.rdb
分使用三个redis配置文件,启动三个redis服务:
redis-server redis6379.conf &
redis-server redis6380.conf &
redis-server redis6381.conf &
2).通过redis客户端分别连接三台redis服务:
redis-cli -h 127.0.0.1 -p 6379
redis-cli -h 127.0.0.1 -p 6380
redis-cli -h 127.0.0.1 -p 6381
3).查看三台redis服务在集群中的主从角色
info relication ---> role:master
默认情况下,所有的redis服务都是主机,即都能写和读,但是都还没有从机。
4).先在6379进行写操作:--->测试三台服务是否独立
set k1 v1
三台redis服务互相独立,互不影响。
5).设置主从关系:设从不设主【设置6379为主机】
在6380上执行:slaveof 127.0.0.1 6379
在6380上执行:info relication-->role:slave
在6381上执行:slaveof 127.0.0.1 6379
在6381上执行:info relication-->role:slave
在6379上执行:info relication-->查看是否连接
6).全量复制:一旦主从关系确定,会自动把主机上已有的数据同步复制到从库。
在6380和6381上执行:keys *--->发现都有 k1 v1
7).增量复制:主库写数据会自动同步到从库
在6379上添加数据:
set k2 v2
在6380和6381上执行:keys *--->发现都有 k2 v2
8).主写从读,读写分离:
在6380和6381上执行:set k3 v3--->报错,从库只能读,不能写
9).主机菪机:从机原地待命(从机可以读)
关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown
查看6380和6381服务的从机角色:info relication
10).主机恢复:一切恢复正常
重启6379服务:redis-server redis6379.conf &
客户端6380连接6379:redis-cli -h 127.0.0.1 -p 6379
客户端6381连接6379:redis-cli -h 127.0.0.1 -p 6379
11).从机宕机:主机少一个从机、其它从机不变
关闭6380服务:redis-cli -h 127.0.0.1 -p 6380 shutdown
查看6379服务的从机角色:info relication
查看6380和6381服务的从机角色:info relication
12).从机恢复:需要重新设置主从关系
重启6380服务:redis-server redis6380.conf &
客户端6380连接6379:redis-cli -h 127.0.0.1 -p 6379
在6380上执行:slaveof 127.0.0.1 6379
13).从机上位:
a).主机宕机:从机原地待命(从机可以读)
关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown
查看6380和6381服务的从机角色:info relication
b).从机断开原来的主从关系:
在6380上执行:slaveof no one
查看6380服务的从机角色:info relication
c).重新设置主从关系:
在6381上执行:slaveof 127.0.0.1 6380
在6380上执行:info relication-->role:slave
在6381上执行:info relication-->role:slave
d).之前的主机恢复:变成孤家寡人,没有从机了
重启6379服务:redis-server redis6379.conf &
客户端连接6379:redis-cli -h 127.0.0.1 -p 6379
e).天堂变地狱
在6379上执行:slaveof 127.0.0.1 6381 --->6381从属于6380,6379从属于6381
在6381上执行:info replication-->即是主机又是从机,只要是从机都不能写数据
小结:一台主机可以配置多台从机,一台从机也可以配置多台从机,从而形成一个庞大的集群
减轻了一台主机的压力,但是增加了服务间的延迟时间。
=============================================================================
18.redis哨兵模式:从机宕机,从机上位的自动版
1).搭建三台redis服务:使用一台redis模拟三台redis服务
搭建一主二从的集群框架(17里的前5步)
2).提供一个哨兵的配置文件:【默认提供了sentinel.conf-->里面有很多我们用不到的参数】
在redis安装目录下创建配置文件: redis_sentinel.conf
添加:sentinel monitor dc-redis 127.0.0.1 6379 1
【指定监控主机的ip地址,port端口,得到哨兵的投票数(当哨兵投票数大于或等于此数(1)时切换主从关系)】
-->一般性能好的,票数多
3).启动哨兵服务:
redis-sentinel redis_sentinel.conf[这里用的是相对路径,可以设置为绝对路径]
4).主机宕机:
关闭6380服务:redis-cli -h 127.0.0.1 -p 6380 shutdown
5).之前的主机恢复:
重启6379服务:redis-server redis6379.conf &
客户端连接6379:redis-cli -h 127.0.0.1 -p 6379
---->6379从属于新的主机