Redis 是一个开源的,内存存储的数据结构服务器,可以用作数据库、高速缓存和消息队列。它是一个高性能的 key-value 数据库,运行在内存中,但是可以持久化到磁盘。
1. 功能特点
- 速度快(内存读取)
- 支持多种数据结构(字符串、哈希、列表、集合、有序集合)
- 支持数据的备份(master-slave)
- 支持数据持久化(RDB,AOF)
- 支持高可用(Redis-Sentinel)和分布式(Redis-Cluster)
2. 应用场景
- 数据高速缓存
- 会话缓存
- 排行榜(有序集合)/计数器
- 消息队列
- 发布订阅
3. 数据结构
支持多种数据类型:字符串(string),哈希(hash),列表(list),集合(set),有序集合(sorted set)等 。
127.0.0.1:6379> SET name "ABC"OK127.0.0.1:6379> GET name"ABC"
注意,一个键最大能存储 512MB。
4. 连接
$ redis-cli -h 127.0.0.1 -p 6379 -a password 127.0.0.1:6379> AUTH password #验证密码是否正确OK127.0.0.1:6379> PINGPONG127.0.0.1:6379> SELECT index #切换到指定的数据库OK127.0.0.1:6379[index]> QUIT #关闭当前连接
5. 数据持久化
(1)RDB 持久化在指定的时间间隔内将内存中的数据集快照写入磁盘。实际操作过程是 fork 一个子进程,先将数据集写入临时文件,写入成功后再替换之前的文件,用二进制压缩存储。
RDB 是 Redis 默认的持久化方式,会在对应的目录下生成一个 dump.rdb 文件,重启服务后通过加载 dump.rdb 文件来恢复数据。
- 通过 SAVE 和 BGSAVE 命令对数据进行持久化,生成 RDB 文件。
SAVE 命令会阻塞 redis 服务进程,阻塞期间服务器不能处理客户端任何请求,直到缓存数据持久化完成。
BGSAVE 命令不会阻塞服务进程,会 fork 出一个子进程,由子进程负责数据持久化,父进程继续处理客户端请求。
- 通过配置文件
redis.conf 配置文件中的 save 配置项,让服务器每隔一段时间自动执行 BGSAVE。
save 900 1 #服务器在900秒之内,对数据库进行了至少1次修改。save 300 10 #服务器在300秒之内,对数据库进行了至少10次修改。save 60 10000 #服务器在60秒之内,对数据库进行了至少10000次修改。
(2)AOF 持久化是用日志的形式记录服务器的每个写操作,并追加到文件中,以 redis 协议格式保存。服务器重启时,会执行文件中的指令来恢复数据。
fsync策略:always、everysec和no。
Redis 还可以后台使用 bgrewriteaof 命令对 AOF 文件进行重写,使得 AOF 文件体积不至于过大。AOF 默认是不开启的,可以修改 redis.conf 配置文件来开启。
appendonly yes #开启AOF持久化appendfsync everysec #每秒钟同步一次,默认策略
选择 RDB 还是 AOF?
- RDB 非常适合大规模的数据恢复,如果业务对数据一致性要求不高,RDB 是很好的选择。
- 如果需要保证数据一致性,那么优先考虑使用 AOF 方式。
- 对于企业级的中大型应用,如果想保证数据一致性,同时又希望保持高效率,可以同时使用 RDB 和 AOF 两种方式。启动服务时会优先加载 AOF 文件。
6. 事务
127.0.0.1:6379> MULTIOK127.0.0.1:6379> 事务块127.0.0.1:6379> EXEC 或者 DISCARDOK
- MULTI 标记一个事务的开始。
- EXEC 执行所有事务块内的命令。
- DISCARD 取消执行事务块内的所有命令。
- WATCH key [key ...] 监视一个或多个key,如果在事务执行之前,key 被其他命令所改动,那么事务将被打断。
- UNWATCH 取消 WATCH 命令对所有 key 的监视。
7. 发布订阅
Redis 发布订阅是一种消息通信模式:发布者发送消息,订阅者接收消息。
127.0.0.1:6379> SUBSCRIBE channel [channel ...] #订阅频道127.0.0.1:6379> PUBLISH channel message #在频道上发布消息
8. redis-sentinel架构
redis master-slave主从复制模式下,如果 master 节点出现故障,slave 节点无法自动切换成 master,需要人工干预。redis-sentinel 是redis官方推荐的高可用性解决方案,它是一个独立运行的进程。多个 sentinel 进程协同工作,组成一套分布式的架构,用于监控 master-slave 节点和其他 sentinel 节点的健康状况。sentinel 通过订阅消息与其他 sentinel 节点进行通信。
sentinel 集群发现 master 节点故障后,多个 sentinel 对 master 节点的故障达成一致,在 sentinel 节点中选择一个作为 leader,负责故障转移,把一个 slave 节点提升为 master,并让其他 slave 节点从新的 master 复制数据,并告知客户端新的 master 的信息。