1. 概述
Redis是一个C语言编写、开源、可持久化、高性能的非关系型(NOSQL)键值对数据库。
Redis的Key只能是String类型,但是Value支持5种数据类型,字符串、List、Hash、Set、Zset。
1.1 Redis的优缺点
优点:
(1). 读写性能高,读可达到11w/s,写可达到8.1w/s。
(2). 支持持久化,支持AOF、RDB俩种持久化方式。
(3). 支持事务。
(4). 拥有多种数据结构。
缺点:
(1). 不具备自动容错和恢复功能,当节点宕机,必须手动重启。
(2). 当master节点宕机,宕机前可能会存在部分数据未同步到slave中, 此时 slave转为master节点,会出现数据不一致问题。
2. 数据类型及应用场景
Redis有5种数据类,分别为String、Hash、List、Set、Zset
数据类型 | 可存储的值 | 操作 | 应用场景 |
---|---|---|---|
String | 字符串、整数、浮点数 | 对整个字符串或字符串其中一部分执行操作,对整数和浮点数执行自增或自减操作 | 做简单的键值对缓存 |
List | 列表 | 从俩端压入或弹出元素,对单个或多个元素进行修剪,只保留一定范围内的元素 | 存储一些列表型的数据结构,类似粉丝列表、文章评论列表之类的数据 |
Set | 无序集合 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交、并、差集;从集合里面随机获取元素 | 交集、并集、差集的操作,比如交集,可以把俩个人的粉丝列表整一个交集 |
Hash | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对;检查某个键是否存在 | 结构化的数据,比如一个对象 |
Zset | 有序集合 | 添加、获取、删除元素;根据分值范围或者成员来获取元素;计算一个键的排名 | 去重并可以排序,如获取排名前几名的用户 |
3.Redis常用命令参考
命令语法请参考官网手册:点击
4. Redis俩种持久化机制
4.1. 为什么要持久化
Redis数据都在内存中,内存中的数据并不持久,在服务器宕机或重启时都会丢失。因此Redis想要永久存储数据,必须将数据持久化到磁盘中。
4.2. RDB持久化机制
RDB: 是Redis DataBase的缩写,快照
RDB持久化机制是Redis默认开启的,它每隔一段时间就会将内存中的全量数据以快照的形式,保存到磁盘中,对应产生的文件是dump.rdb。通过配置文件中save参数来定义快照的周期。
4.2.1. RDB持久化触发时机
(1). save命令
save命令不会fork子进程,直接使用主进程进行数据的持久化,此时主进程不会处理任何客户端的请求,因此该命令在生产环境中一般不会使用。save命令执行原理如下图
save 命令基本语法如下:
redis 127.0.0.1:6379> save
(2). bgsave命令
Redis主进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后子进程结束。主进程阻塞只发生在执行fork操作时,一般时间很短。基本上Redis内部所有的RDB操作都是采用bgsave命令。bgsave命令原理如下图:
bgsave 命令基本语法如下:
redis 127.0.0.1:6379> bgsave
(3). 自动触发
自动触发的时机是在配置文件中配置的,自动触发时机到达后使用bgsave命令进行持久化。在redis.conf配置信息如下图:
4.2.2. RDB持久化机制的优缺点
优点:
(1). rdb文件相对于aof小,数据恢复快。
缺点:
(1). 数据的安全性低。RDB是间隔一段时间持久化数据,如果持久化过程中服务器宕机或重启,此时没有写入磁盘的数据都将丢失,所以该方式适用于对数据完整性和一致性要求不高的场景。
4.3 AOF持久化机制
AOF(Append-only file)持久化,则是将Redis执行的每次写命令记录到日志文件中,当Redis重启时,从日志文件中恢复数据。
当RDB与AOF同时开启时,优先选择从AOF中恢复数据,因为AOF中数据相比于RDB更加完整。
4.3.1. AOF持久化流程
(1). 所有的写命令都会追加到aof_buf(缓存区)中。
(2). AOF缓存区根据对应的策略向硬盘中做同步操作。
(3). 随着AOF文件的增大,需要定期对AOF文件进行重写,达到压缩的目的。
(4). 当Redis服务器重启的时候,可以加载AOF文件进行数据恢复。
4.3.2. AOF持久化触发时机
AOF持久化默认是不开启的,需要修改配置文件的配置开启,同时还可以配置持久化的触发时机,配置说明如下:
appendonly yes #开启aof
appendfilename "appendonly.aof" #aof日志文件名称
#持久化触发时机
# appendfsync always #每次写命令都触发一次持久化
appendfsync everysec #每秒触发一次持久化
# appendfsync no #不触发持久化
#配置重写触发机制
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1g
#解释:当AOF文件大小是上次rewrite后大小的一倍且文件大于1G时触发一次重写。
4.3.3 AOF持久化的优缺点
优点:
(1). 数据安全性高,一般AOF会每秒,通过一个后台线程执行一次同步操作,最多丢失一秒的数据。
缺点:
(1). AOF的日志文件比RDB文件大,因此数据恢复慢。
(2). AOF同步的频率比RDB高很多,因此会降低Redis的QPS。
5. Redis事务
5.1. Redis事务概念
Redis事务就是一组命令的集合,它是一个工作单元。事务中所有命令都会被序列化,按照顺序执行,在执行过程中不会有其他命令插入。
Redis事务从执行的角度说,它具有是原子性,要不全部执行,要么全部不执行。从执行过程看,它又不具有原子性,在执行过程中任意命令执行失败,不会影响命令的继续执行,出现命令执行失败时,不会进行回滚。
5.2. Redis事务的三个阶段
(1). 开始事务
(2). 命令入队
(3). 执行事务
5.3. Redis相关命令
(1). multi:标记一个事务的开启。
(2). exec:执行事务中的命令(一旦exec之后,事务中被加的监控锁就会被取消掉)。
(3). discard:取消事务,放弃事务中的所有命令
(4). watch:监视一个或多个key,如果在事务执行前,被监控的key被其他命令改动,那么事务就被打断。
(5). unwatch: 取消watch命令对所有key的监视。
5.4. Redis事务使用案例
5.4.1. 正常执行
5.4.2. 放弃事务
5.4.3. 事务队列中存在语法错误,则执行exec命令时,所有命令不执行
5.4.3. 事务队列中存在运行时错误,则执行exec命令时,其他正确命令执行,错误命令抛出异常。
5.4.3. 使用watch,事务未执行时,修改watch监控的key,所有命令不执行。
第一个redis客户端,开启事务,并将监控的key加入事务的队列中。执行事务,发现事务中所有的命令未执行。
第二个redis客户端在第一个redis客户端未执行exec命令之前,修改被监控key的值。