七.redis.conf配置文件
启动redis的时候就是通过配置文件来启动
Redis 的配置文件位于 Redis 安装目录下,文件名为redis.conf。
我的配置文件在/usr/local/bin/xconfig/目录下。
下面将redis.conf中的配置一一分析:
1.单位
- 配置文件unit单位对大小写不敏感
2.INCLUDES 包含
- 类似于Spring中的import注解和jsp中的include,可以将其它配置文件包含进来
3.NETWORK 网络
bind 127.0.0.1 -::1 # 可以访问redis的ip,默认是本地,我们可以修改ip来达到远程访问
protected-mode yes #保护模式,一般是开启,保证安全性
port 6379 #端口设置
4.GENERAL 通用配置
daemonize yes # 以后台守护进程的方式运行,默认是no,我们需要自己开启为yes
pidfile /var/run/redis_6379.pid # 如果以后台的方式运行,我们就需要指定一个pid文件
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice # 日志等级
logfile "" # 日志的文件位置名
databases 16 # 数据库的数量,默认是16个数据库
always-show-logo no # 是否总是显示redis的LOGO,默认否
5.SNAPSHOTTING 快照
进行持久化操作,在规定时间内,执行了多少次操作,则会持久化到文件中 (.rdb、.aof)。
redis是内存数据库,如果不做持久化操作,那么数据断电即失。
# 在900s内,如果至少有1个key进行了修改,将进行持久化操作
save 900 1
# 在300s内,如果至少有10个key进行了修改,将进行持久化操作
save 300 10
# 在60s内,如果至少有10000个key进行了修改,将进行持久化操作
save 60 100000
# 持久化如果出错,是否还需要继续工作
stop-writes-on-bgsave-error yes
# 是否压缩rdb文件,需要消耗一些cpu资源
rdbcompression yes
# 保存rdb文件的时候,进行错误的检查校验
rdbchecksum yes
# rdb文件保存的目录
dir ./
6.SECURITY 权限
我们可以在配置文件中设置密码,也可以通过命令设置密码
127.0.0.1:6379> config get requirepass # 获取Redis密码
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass "123456" # 设置Redis密码
OK
CONFIG 是Redis用来修改配置文件的参数,使用config命令可以在不重启Redis的情况下重新设置某些配置
重新登录redis时,需要验证密码
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456 # 使用密码登录
OK
127.0.0.1:6379> ping
PONG
7.CLIENTS 客户端
maxclients 10000 # 设置能连接上redis的最大客户端数量
8.MEMORY MANAGEMENT 内存相关
maxmemory <bytes> # redis配置最大的内存容量
maxmemory-policy noeviction # 内存到达上限之后的处理策略
# 六种策略
# 1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)
# 2、allkeys-lru : 删除lru算法的key
# 3、volatile-random:随机删除即将过期key
# 4、allkeys-random:随机删除
# 5、volatile-ttl : 删除即将过期的
# 6、noeviction : 永不过期,返回错误,默认的
9.APPEND ONLY MODE (aof配置)
# 默认是不开启aof模式的,默认是使用rdb方式持久化,在大部分情况下,rdb完全够用
appendonly no
# aof文件的名字
appendfilename "appendonly.aof"
appendfsync always #每次修改都会sync,速度慢,消耗性能
appendfsync everysec # 每秒执行一次sync,可能会丢失1s的数据,默认的
appendfsync no #不执行sync,这个时候操作系统自己会同步数据,速度最快
八.Redis持久化
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一定服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能
1.RDB(Redis Database)
简述:
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
默认情况下,Redis将数据库快照保存在名字为dump.rdb的二进制文件中。
可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。也可以通过调用 SAVE或者 BGSAVE 命令, 手动让 Redis 进行数据集保存操作。
这里测试一下自动存储
先将目录中的dump.rdb文件删除
[root@localhost bin]# rm -rfv dump.rdb
已删除"dump.rdb"
进行3次set操作,之后shutdown模拟服务器断电
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> shutdown
not connected>
再次查看会发现dump.rdb文件出现了。
查看一下dump.rdb文件中的内容。
[root@localhost bin] ls
dump.rdb redis-check-aof redis-cli redis-server
redis-benchmark redis-check-rdb redis-sentinel xconfig
[root@localhost bin] cat dump.rdb
REDIS0009 redis-ver6.2.1
redis-bitseÉjused-mem¸O
𮤭preamble~v2k5v5k4v4k3v3k1v1þe
ÿ9Ӊ
z[root@localhost bin] XshellXshellXshell
除了这种情况,还有一种情况也能满足我们设置的条件。
#删除dump.rdb文件
[root@localhost bin]# rm -rf dump.rdb
[root@localhost bin]# ls
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server xconfig
127.0.0.1:6379> FLUSHALL # 清除所有数据库的key
OK
127.0.0.1:6379> shutdown # 关闭redis
not connected>
[root@localhost bin]# ls 查看文件
dump.rdb redis-check-aof redis-cli redis-server
redis-benchmark redis-check-rdb redis-sentinel xconfig
触发机制:
- save的规则满足的情况下,会自动触发rdb规则
- 执行flushall命令,也会触发我们的rdb规则
- 退出redis,也会产生rdb文件
恢复rdb文件
- 只需要将rdb文件放在redis启动目录就可以,redis启动的时候会自动检查dump.rdb恢复其中的数据
- 查看需要存放的位置
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/bin" # 如果这个目录下存在dump.rdb文件,启动就会自动恢复其中的数据
RDB的工作流程
当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:
- Redis 调用forks. 同时拥有父进程和子进程。并且子父进程共享内存
- 子进程将数据集写入到一个临时 RDB 文件中。
- 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
整个过程中,主进程不进行任何IO操作。
这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。
RDB的优点:
- rdb是一个紧凑的文件,适合大规模的数据恢复
- rdb恢复大数据集时比aof要快
- rdb通过fork一个子进程来工作,而父进程不需要做任何IO操作,最大化redis的性能
RDB的缺点:
- 需要一定的时间间隔进行操作。如果在不满足时间间隔的条件下,redis意外宕机,那么在最后一次进行持久化之后的数据都消失了。
- fork进程的时候,当数据集比较大的时候,fork的过程会非常耗时。
2.AOF(Append Only File)
简述:
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
简单来说就是aof将我们所有的命令都记录下来,有点类似于游览器的历史记录。
AOF工作流程:
- aof是以日志的形式记录每个操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复。
aof保存的是appendonly.aof文件
aof默认是不开启的,需要手动配置。之后重启redis就可以生效了。
appendonly yes
使用AOF方式持久化:
# 重启redis
[root@localhost bin]# redis-server xconfig/redis.conf
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
# 设置三个数据
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
再Xshell里再开一个连接,使用vim查看appendonly.aof文件
[root@localhost bin]# vim appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$2
k1
$2
v1
*3
$3
set
$2
k2
$2
v2
*3
$3
set
$2
k3
$2
v3
*3
$3
set
$2
k4
$2
v4
*2
$6
SELECT
$1
0
*3
$3
set
$2
k1
$2
v1
*3
$3
set
$2
k2
$2
v2
*3
$3
set
$2
k3
$2
v3
如果此文件被损坏,这时候redis是启动不了的,需要修复此文件才能启动。
我们在这个aof文件里随便输入一些数值。
[root@localhost bin]# redis-server xconfig/redis.conf
[root@localhost bin]# redis-cli -p 6379
Could not connect to Redis at 127.0.0.1:6379: Connection refused
这时,我们再想重启redis,进入命令行界面就会报错。
使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复:
redis-check-aof –fix appendonly.aof
重启成功,文件被恢复了。
AOF的优点:
- 每一次修改同步,文件的完整性会更好
- 每秒同步一次,可能会丢失一秒的数据
- 从不同步,效率最高的
AOF的缺点:
- 相对于数据的文件来说,aof远远大于rdb,修复的速度也比rdb慢
- aof运行效率也比rdb慢,所以我们redis默认的配置是rdb持久化
AOF重写规则说明:
如果AOF文件大于64mb,fork一个新的进程来将文件进行重写:
重写后的新AOF文件里面包含了恢复当前数据库中的数据的最少命令。在Redis创建新AOF文件完成前,还是会把命令追加到旧AOF文件里,并且会把这一部分命令保存到内存缓存中,一旦新AOF文件创建完成,就会把内存缓存中的命令追加到新AOF文件末尾,并且替换掉旧AOF文件。之后所有的命令追加到新AOF文件末尾。
九.Redis订阅发布
概述:
Redis发布订阅(pub/sub)是一种消息通信模式:发送者发送消息到频道,订阅者从频道中接收消息。
订阅/发布消息图:
发布者不需要管是什么人订阅了,只需将消息发送到频道里;
订阅者也不需要知道什么人发布的,只需订阅感兴趣的频道,接收感兴趣的消息。
频道就像当于一个消息队列,每当发布者将数据发送到队列里,订阅者就会从队列中一一获取到数据。
发布订阅相关命令:
命令 | 描述 |
---|---|
pubsub subcommand | 查看订阅与发布系统状态 |
publish channel message | 将消息发送到给定的频道 |
subscribe channel | 订阅给定的一个或多个频道的信息 |
unsubscribe channel | 退订给定的频道 |
psubscribe pattern | 订阅一个或多个符合给定模式的频道 |
punsubscribe pattern | 订阅一个或多个符合给定模式的频道 |
测试:
为了模拟发送者与订阅者,我们需要开启两个redis-cli客户端。
订阅端:
[root@localhost bin]# redis-cli -p 6379
# 订阅了一个张三的频道
127.0.0.1:6379> SUBSCRIBE zhangsan
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "zhangsan"
3) (integer) 1
发送端:
[root@localhost bin]# redis-cli -p 6379
# 发送端将消息发送到频道zhangsan中去
127.0.0.1:6379> PUBLISH zhangsan "hello world"
(integer) 1
结果:
使用PUBSUB CHANNELS可以查看当前有多少频道被订阅
原理:
- 1.通过SUBSCRIBE命令订阅某频道后,redis-server里维护了一个字典,字典的键就是一个个频道,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。SUBSCRIBE命令的关键,就是将客户端添加给定channel的订阅链表中。
- 2.通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。
- 3.Pub/Sub从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到想应的消息。
使用场景:
- 实时消息系统
- 实时聊天(频道相当于聊天室,所有人订阅这个频道,将消息回显给所有人)
- 订阅、关系系统