【redis】高级话题

事务

multi
标记一个事务的开始,多条命令会按照先后顺序放进一个队列中,总返回OK

exec
执行所有事务块的命令
事务内的所有执行语句内容,事务被打断返回nil

discard
(当事务队列内的语句写到一半不想写了)取消事务,放弃事务内的所有命令,总返回OK

当遇到语法错误时,事务就会被放弃

当语法没错,但执行会出错时,redis不会回滚,前面正确的命令会正常执行

watch key…
监视一个或多个key,如果在事务执行前这些key被其他命令所改动,那么事务将会被打断。总是返回OK

unwatch
取消watch命令对所有key的监视

比如这里我对k5这个key添加监视,然后在可视化工具里修改k5的值

可以看到事务执行失败。


持久化

单保存在内存中,若突然系统问题出现关机,会导致数据丢失,所以保存在硬盘中能保证数据安全。

RDB

Redis Database(RDB),数据快照写入磁盘。
保存数据是在单独的进程中写文件,不会影响Redis的正常使用。RDB恢复数据比其他AOF(将命令写入日志)速度快

在配置文件redis.conf中搜索SNAPSHOTTING可以看到关于RDB的配置说明。配置Redis生成快照文件的时间策略,格式如下

save <seconds> <changes>

表示在seconds秒内至少发生了changes个key的改动这一条件被满足时,就会启动生成保存

在配置文件中有如下三列默认配置

save 900 1
save 300 10
save 60 10000

另外,
dbfilename属性对应RDB的文件名,默认为dump.rdb
dir指定RDB文件的存储位置,默认为./,当前目录

缺点:会丢失未满足条件而发生保存的数据。
优点:性能高。

AOF

如果不想有丢失数据的风险,采用AOF方式
每次接收到一条改变数据的命令时,就会把该命令写到一个AOF文件中,当redis重启时,可以通过执行AOF中的所有命令恢复数据

AOF功能默认为关闭状态,需要在redis.conf文件中配置

  • appendonly:默认是no,改成yes即为开启
  • appendfilename:指定AOF文件名,默认为appendonly.aof
  • dir:指定RDB和AOF文件存放的目录
  • appendfsync:配置向aof文件写命令数据的策略
    • no:不主动进行同步,而是完全交由操作系统来做(30秒一次),比较快但是不安全
    • always:每次执行写入都会执行同步,慢一点,安全
    • everysec:每秒执行一次,比较平衡,默认为这个
  • auto-aof-rewrite-min-size:允许重写的最小AOF文件大小,默认为64M,当超过此大小时整理aof文件,去掉无用的命令(比如说重复赋值)

若因某条命令让redis关闭,重启前可以对aof文件修改,删除这条命令,重启redis会自动执行该文件中的命令恢复数据


主从复制

为了避免单点故障,需要将数据复制多份到多台不同的服务器上,当有一台服务器上的数据更新后,自动将更新的数据同步到其他的服务器上。

读写分离

将redis服务器集群分为一个主服务器和一些从服务器,主服务器复制进行写操作并把写入的数据实时同步到从服务器,从服务器负责用于读操作。

实现

复制三份配置文件,修改不同的端口号,运行redis-server时带上配置文件的参数,即可模拟多台redis服务器的环境。

配置主redis服务器(Master)
在空文件中加入下面内容

  • include 原来的配置文件路径 //表示引入之前的配置
  • daemonize yes //让redis后台启动
  • port XXXx //指定端口号
  • pidfile /var/run/redis_xxxx.pid //linux下给进程分配id
  • logfile xxxx.log //日志文件
  • dbfilename xxxxxx.rdb //rdb文件

配置从redis服务器(Slave)
加入如下内容

  • include 原来的配置文件路径 //表示引入之前的配置
  • daemonize yes //让redis后台启动
  • port XXXx //指定端口号
  • pidfile /var/run/redis_xxxx.pid //linux下给进程分配id
  • logfile xxxx.log //日志文件
  • dbfilename xxxxxx.rdb //rdb文件
  • slaveof ipaddress port //ipaddress指向主服务器的IP地址,port指定端口号

info replication命令可以查看当前的服务器的状态信息

不能在从服务器Slave上进行写操作,会提示操作失败。

容灾处理

当Master服务出现故障,需手动将slave中的一个提升为master,剩下的slave挂至新的master上

步骤

  1. 停掉故障的master服务
  2. 选一台slave升级到master,运行命令
slaveof no one
  1. 切换到其他slave服务器的客户端,运行命令
    slaveof ipaddress port

指定新的master服务地址

redis官方提供了解决问题的高可用方案

Sentinel

哨兵(多个单独运行)
它有三个主要任务

  • 监控:心跳检测主服务器是否正常工作
  • 提醒:提醒管理员
  • 自动故障转移 :转换master
  • 当检测到主redis服务器master出现故障,会在哨兵中(总共奇数个)产生一次投票,半数以上检测到故障时就会运行后面两个任务。

配置:
同样是改配置文件,ip地址什么的,大同小异


安全设置

访问Redis默认没有密码,这样不安全,可以通过修改redis.conf配置文件设置密码
requirepass对应的就是密码
设置密码后用客户端工具cli登陆

需要在后面添加
-a password
参数登陆
或者使用auth password

绑定ip
同样是配置文件
bind这项对应的就是允许访问你redis的ip地址,默认bind 127.0.0.1,只允许本机访问。若想允许多个ip地址可以用空格分隔。

修改端口
使用默认的端口比较危险,在配置文件中把
port xxxx
这行端口修改为自己可以指定的端口,范围是1024-65535

使用
./redis-cli -p xxxx
指定端口号启动