文章目录
一、Redis配置文件详解
redis启动的时候就是通过redis.conf配置文件启动的。
1.1、Units(单位)
- 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit
- 对 大小写 不敏感
1.2、INCLUDES(包含)
和Spring配置文件类似,可以通过includes包含,redis.conf 可以作为总文件,可以包含其他文件
1.3、Network(网络)
bind 127.0.0.1 # 绑定的ip,指定是否可以远程访问
protected-mode yes # 保护模式
port 6379 # 端口设置
1.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) 类似debug
# notice (moderately verbose, what you want in production probably) 生产环境使用
# warning (only very important / critical messages are logged)
loglevel notice
# 日志级别。可选项有:
# debug(记录大量日志信息,适用于开发、测试阶段);
# verbose(较多日志信息);
# notice(适量日志信息,使用于生产环境);
# warning(仅有部分重要、关键信息才会被记录)。
logfile "" # 日志的文件名,如果为""就是一个标准的文件名
databases 16 # 数据库的数量,默认是16个数据库
1.5、SNAPSHOTTING(快照)
持久化,在规定的时间内,执行了多少次操作,就会持久化到文件:.rdb、.aof
redis是内存数据库,如果没有持久化,那么数据断电即失
# 如果900秒内,如果至少有一个key进行了修改,我们就进行持久化操作
save 900 1
# 如果300秒内,如果至少有十个key进行了修改,我们就进行持久化操作
save 300 10
# 如果60秒内,如果至少有一万个key进行了修改,我们就进行持久化操作(高并发)
save 60 10000
# 之后学习持久化,会自己定义设置
stop-writes-on-bgsave-error yes # 持久化如果出错是否继续执行
rdbcompression yes # 是否压缩.rdb文件,需要消耗一些CPU资源
rdbchecksum yes # 保存.rdb文件的时候,是否校验.rdb文件
dir ./ # .rdb文件保存的目录
1.6、REPLICATION(主从复制)
后面再讲
1.7、SECURITY(安全)
设置密码,默认是没有密码的
requirepass 123456 # 设置密码
127.0.0.1:6379> config get requirepass # 获取redis的密码
127.0.0.1:6379> config set requirepass "123456" # 设置redis的密码
127.0.0.1:6379> auth 123456 # 登录redis
1.8、CLIENTS(限制)
maxclients 10000 # 设置能连上redis的最大客户端连接数量
maxmemory <bytes> # redis配置的最大内存容量
maxmemory-policy noeviction # maxmemory-policy 内存达到上限的处理策略
#volatile-lru:利用LRU算法移除设置过过期时间的key。
#volatile-random:随机移除设置过过期时间的key。
#volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
#allkeys-lru:利用LRU算法移除任何key。
#allkeys-random:随机移除任何key。
#noeviction:不移除任何key,只是返回一个写错误。
1.9、APPEND ONLY MODE(aof配置)
appendonly no # 是否以append only模式作为持久化方式,默认使用的是rdb方式持久化,这种
方式在许多应用中已经足够用了
appendfilename "appendonly.aof" # appendfilename AOF 文件名称
appendfsync everysec # appendfsync aof持久化策略的配置
# no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
# always表示每次写入都执行fsync,以保证数据同步到磁盘。
# everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
具体的配置在redis持久化中讲解。
二、Redis的持久化
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失,所以Redis提供了持久化功能。
9.1、RDB(Redis Database)
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话中讲的Snapshot快照,它恢复时是将快照里的文件直接读到内存里。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
整个过程中,主进程是不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是那么敏感,那RDB方式要比AOF方式更加的高效。
RDB的缺点是最后一次持久化的数据可能丢失。
默认的就是RDB,一般情况写不需要修改这个配置。
RDB保存的文件是dump.rdb,都是在配置文件中快照中进行配置
触发机制
1、save的规则满足的情况下,会自动触发rdb规则
2、执行flushall命令,也会触发rdb规则
3、退出redis,也会产生rdb文件
备份就会自动生成一个dump.rdb文件
恢复rdb文件
1、只需要将rdb文件放在redis启动目录就可以,redis启动的时候会自动检查dump.rdb恢复其中的数据
2、查看需要存在的位置
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/bin" #如果在这个目录下存在dump.rdb文件,启动就会自动恢复其中数据
优点:
1、适合大规模的数据恢复
2、对数据的完整性要求不高
缺点:
1、需要一定的时间间隔进行操作。如果redis意外宕机了,最后一次修改的数据就没有了
2、fork进程的时候,会占用一定的内存空间
9.2、AOF(Append Only File)
将我们的所有命令都记录下来,history,恢复的时候就把这个文件全部再执行一遍
默认是不开启的,需要手动进行配置。只需要将appendonly改为yes就开启了aof。
重启后redis就生效了。
如果这个aof文件有错,这时候redis是起不来的。需要修复这个aof文件
redis提供了一个工具redis-check-aof --fix
[root@localhost bin]# redis-check-aof --fix appendonly.aof
AOF analyzed: size=168, ok_up_to=168, diff=0
AOF is valid
如果文件正常,重启就可以直接恢复了。
ppendonly no # 默认是不开启aof的,默认是使用rdb持久化,在大部分情况下,rdb够用
appendfilename "appendonly.aof" # 持久化的文件名称
appendfsync always # 每次写入都执行fsync,以保证数据同步到磁盘。
appendfsync everysec # 每秒执行一次sync,可能会导致丢失这1s数据。
appendfsync no # 不执行sync,由操作系统保证数据同步到磁盘,速度最快。
No-appendfsync-on-rewrite #重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性
Auto-aof-rewrite-min-size 64mb # 设置重写的基准值
Auto-aof-rewrite-percentage 100 #设置重写的基准值
# 如果aof文件大于64m,太大了,就会fork一个新的进程来将文件重写
优点:
1、每一次修改都同步,文件的完整性会更好
2、每秒同步一次,可能会丢失一秒的数据
3、从不同步,效率是最高的
缺点:
1、相对于数据文件来说,aof远远大于rdb,修复的速度也比rdb慢
2、aof运行效率也要比rdb慢,所以redis默认的配置就是rdb持久化
扩展:
1、RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储
2、AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以Redis 协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重 写,使得AOF文件的体积不至于过大。
3、只做缓存,如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化
4、同时开启两种持久化方式
- 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF 文件保存的数据集要比RDB文件保存的数据集要完整。
- RDB 的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只使用AOF呢?作者 建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有 AOF可能潜在的Bug,留着作为一个万一的手段。
5、性能建议
- 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够 了,只保留 save 900 1 这条规则。
- 如果Enable AOF ,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自 己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite 的最后将 rewrite 过程中产 生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite 的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上,默认超过原大小100%大小重 写可以改到适当的数值。
- 如果不Enable AOF ,仅靠 Master-Slave Repllcation 实现高可用性也可以,能省掉一大笔IO,也 减少了rewrite时带来的系统波动。代价是如果Master/Slave 同时倒掉,会丢失十几分钟的数据, 启动脚本也要比较两个 Master/Slave 中的 RDB文件,载入较新的那个,微博就是这种架构。
三、Redis发布订阅
3.1、概述
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 公众号、微博、等有关注系统的!
Redis客户端可以订阅任意数量的频道。
订阅/发布消息图:
第一个:消息发送者,第二个:频道,第三个:消息订阅者
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
3.2、命令
这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。
1、psubscribe pattern [pattern...]
订阅一个或多个符合给定模式的频道
2、pubsub subcommand [argument [argument...]]
查看订阅与发布系统状态
3、publish channel message
将消息发送到指定的频道
4、punsubscribe [pattern [pattern...]]
退订所有给定模式的频道
5、subscribe channel [channel...]
订阅给定的一个或多个频道的信息
6、unsubscribe [channel [channel...]]
指退订给定的频道
测试
127.0.0.1:6379> SUBSCRIBE weixin # 订阅一个weixin频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "weixin" # 订阅weixin,监听推送信息
3) (integer) 1
# 等待读取推送的信息
1) "message" # 消息
2) "weixin" # 频道名称
3) "hello" # 内容
1) "message"
2) "weixin"
3) "hello,redis"
127.0.0.1:6379> PUBLISH weixin "hello" # 发布者,发送消息到weixin频道
(integer) 1
127.0.0.1:6379> PUBLISH weixin "hello,redis"
(integer) 1
3.3、原理
redis是用C实现的,可以在redis源码里的pubsub.c文件了解订阅发布的底层实现。
redis通过PUBLISH、SUBSCRIBE和punsubscribe 等命令实现订阅发布功能。
通过SUBSCRIBE命令订阅某频道后,redis-server里维护了一个字典,字典的键就是每个频道。而字典的值则是一个链表,链表中保存了所有订阅这个频道的客户端。SUBSCRIBE命令的关键,就是将客户端添加到给定频道的订阅链表中。
通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的频道字典中查找记录了订阅这个频道所有客户端的链表,遍历这个链表,将消息发给所有订阅者。
pub/sub从字面上理解就是发布(PUBLISH)与订阅(SUBSCRIBE),在redis中,可以是设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的聊天、群聊等功能。
使用场景:
1、实时消息系统
2、实时聊天
3、订阅关注系统都是可以的
稍微复杂的场景,就会使用消息中间件做