Redis 入门
一、Redis 能干什么
- 性能极高-Redis能读的速度是110000次/秒,写的速度是81000次/秒
- Redis数据类型丰富,不仅仅支持简单的key-value类型的数据同时还提供list,set,zset,hash等数据结构的存储
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
- Redis支持数据的备份,即master-slave模式的数据备份
二、Redis安装
1 Linux
# 安装gcc、c++、 和make
sudo yum install -y gcc-c++
# 下载
wget https://download.redis.io/releases/redis-7.0.0.tar.gz
# 解压
tar -zxvf redis-7.0.0.tar.gz
# 进入目录
cd redis-7.0.0
# 安装 redi
make && make install
# copy redis.conf到自定义目录
cp redis.conf /data/redis/redis.conf
# 修改新配置文件中的内容
# daemonize no ===>yes
# protected-mode yes ===> no
# bind 127.0.0.1 ===> 注释掉 #bind 127.0.0.1。打开外部访问
# requiredpass ===> 设置自己的密码
# 启动
redis-server /data/redis/redis.conf
# 客户端连接
redis-cli -p 6379
# auth password 登录
2 Docker
# 下载镜像
docker pull redis:7.0.13
# 下载redis配置文件
mkdir -p /data/docker/redis
# 去github上找redis对应版本的配置文件
# https://github.com/redis/redis/blob/7.0.13/redis.conf
touch redis.conf
vim redis.conf
# 修改配置
# bind 127.0.0.1 ===> 注释掉 #bind 127.0.0.1。打开外部访问
# requirepass ===> 设置自己的密码
# 启动
docker run -d -p 6379:6379 --name myredis \
-v /home/docker/redis/redis.conf:/etc/redis/redis.conf \
-v /home/docker/redis/data:/data \
redis redis-server /etc/redis/redis.conf
三、Redis 的数据类型
1 字符串
- string是redis最基本的类型,一个key对应一个value
- string类型是二进制安全的,意思是redis的string可以包含任何数据,比如ipg图片或者序列化的对象
- string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
2 列表 List
- Redis列表是简单的字符串列表,按照插入顺序排序。
- 它的底层实际是个双端链表,最多可以包含 2^32-1 个元素(4294967295,每个列表超过40亿个元素)
3 哈希表 Hash
- Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
- Redis 中每个 hash 可以存储 2^32-1 键值对(40多亿)
4 集合 Set
- Redis 的 Set 是 String 类型的无序集合,集合成员是唯一的。这就意味着集合中不能出现重复的数据,集合成员合对象的编码可以是 intset 或者是hashtable唯一的,
- Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 集合中最大的成员数为 2^32-1(4294967295,个集合可存储40多亿个成员)
5 有序集合 Zset
- Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
- zset的成员是唯一的,但分数(score)却可以重复。
- zset集合是通过哈希表实现的,所以添加,删除,査找的复杂度都是 O(1)。 集合中最大的成员数为 2^32-1
6 地理空间 GEO
- Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作
- 包括添加地理位置的坐标。
- 获取地理位置的坐标。
- 计算两个位置之间的距离。
- 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
7 基数统计 HyperLogLog
- HyperLogLog 是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常HyperLog时,计算基数所需的空间总是固定且是很小的。
- 在 Redis 里面,每个 HyperLogLog键只需要花费12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
- 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
8 位图 Bitmap
- 由0和1表现的二进制位的bit数组
- 只能存储0和1两个值
9 位域 Bitfield
- 通过bitfield命令可以一次性操作多个比特拉域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。说白了就是通过bitfield命令可以一次性对多个比特位域进行操作。
10 流 Stream
- Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。
- 简单来说发布订阅(pub/sub)可以分发消息,但无记录历史消息。
- 而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记主每一个客户端的访问位置,还能保证消息不丢失
四、常见命令
1 String
1.1 常用命令
EX seconds
以秒为单位设置过期时间PX milliseconds
以毫秒为单位设置过期时间EXAT timestamp
设置以秒为单位的UNIX时间戳所对应的时间为过期时间PXAT milliseconds-timestamp
设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间NX
键不存在的时候设置键值XX
键存在的时候设置键值KEEPTTL
保留设置前指定键的生存时间GET
返回指定键原本的值,若键不存在时返回ni1
1.2 同时设置多个值
MSET key value [key value ....]
MGET key [key....]
MSET/MGET/MSETNX
(多个操作同时成功或者都失败)
1.3 获取指定区间范围内的值
GETRANGE
GETRANGE k1 0 2(类似于java的substring操作)SETRANGE
SETRANGE k1 1 xx (从第一位开始覆盖值)
1.4 数值增减
值必须为数字类型才能操作
INCR key
递增1INCR key [increment]
地址指定整数DECR key
递减1DECR key [decrement]
递减指定整数
1.5 获取字符串长度和追加内容
STRLEN key
APPEND key value
1.6 SETNX
SETNX key value
常用于分布式锁,如果key不存在则创建,key存在则忽略,返回false
1.7 GETSET
GETSET key value
先get返回值,在设置值
2 List
lpush/rpush/lrange
lpush key 1 2 3 4 5 rpush key 1 2 3 4 5 lrange key 0 -1 # 5 4 3 2 1 1 2 3 4 5
lpop/rpop
lindex
按照索引下标获取元素llen
获取列表中元素个数lrem key num value
删除num个值等于value的元素lpush key 1 1 1 2 2 3 3 3 3 # 删除3个值等于3的元素 lrem key 3 3
ltrim key s_index e_index
截取指定范围的值后再赋值给keyrpoppush
lpush list1 1 2 3 4 5 6 # 将list1 的元素弹出到list2 RPOPLPUSH list1 list2 lrange list1 0 -1 # 2 3 4 5 6 lrange list2 0 -1 # 1
lset key index value
指定下标赋值linsert key before/after
已有值,插入新值lpush listkey java mysql redis # redis mysql java linsert listkey before mysql oracle # redis oracle mysql java
3 Hash
hset/hget
hset user:01 id 01 name zhangsan age 22 hget user:01 id # 01 hget user:01 name # zhangsan hget user:01 age # 22
hlen
hlen user:01 # 3
hexists key
hexists user:01 id # 1 存在 hexists user:01 gender # 0 不存在
hkeys/hvals
hkeys user:01 # id name age hvals user:01 # 01 zhangsan 22
hincrby/hincrbyfloat
hincrby user:01 age 1 # 给age增加1 hincrbyfloat同理,只是变为小数
hsetnx
hsetnx user:01 score 100 # 没有score 设置成功 hsetnx user:01 age 30 # 失败,已存在age
4 Set
SADD key val [val ...]
添加元素SADD set1 1 1 2 3 3 3
SMEMBERS key
遍历集合SMEMBERS set1 # 1 2 3
SISMEMBER key val
判断元素是否在集合中SREM key member
删除元素scard key
获取集合内元素个数SRANDMEMBER key num
从集合中随机选择num个元素,元素不删除SPOP key num
从集合中随机选择num个元素,元素删除smove key1 key2 val
从key1中将val转移到key2中集合运算
SADD set1 a b c SADD set2 b c d SDIFF set1 set2 # 差集,在set1中set2没有的元素 a SUNION set1 set2 # 并集,a、b、c、d SINTER set1 set2 # 交集,set1、set2共有的元素 b、c SINTERCARD set1 set2 # 交集的个数
5 Zset
在Set的基础上,每个val值前加上了一个score值
ZADD
zadd zset1 100 zhangsan 90 wangwu 80 lisi
ZRANGE
zrange zset1 0 -1 #lisi wangwu zhangsan
ZREVRANGE
zrevrange zset1 0 -1 #zhangsan wangwu lisi
ZRANGESCORE
# withscores 不包含,没有这个关键字表示包含 ZRANGEBYSCORE zet1 95 100 withscores
ZSCORE
ZSCORE zset1 zhangsan # 获取元素的分数
ZREM
ZREM zset1 zhangsan # 删除张三元素
ZINCRBY
ZINCRBY zset1 wangwu 10 # 给王五分数加10
ZCOUNT
zcount zset1 0 100 # 0到100分数之间元素的个数
ZMPOP
从键名列表中的第一个非空排序集合中弹出一个或多个元素ZMPOP 1 zset1 min count 1
ZRANK key value
获取下标值zrank zset1 zhangsan
ZREVRANKE key value
逆序获取下标值zrevrank zset1 zhangsan
6 bitmap
bitmap偏移量从0开始计算,超过8位后自己按照8位一组进行扩容
setbit key offset val
给指定key的值的第offset赋值valsetbit bitkey 0 1 setbit bitkey 1 1 setbit bitkey 4 1
getbit keyoffset
获取key的第offset位的值setbit bitkey 0 # 1 setbit bitkey 1 # 1 setbit bitkey 2 # 0 setbit bitkey 3 # 0 setbit bitkey 4 # 1
bitcount key start end
返回指定key中[start,end]中为1的数量bitcount bitkey 0 10 # 3
bitop operation destkey key
对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR),类似于二进制位的与或非运算setbit bitkey1 0 1 setbit bitkey1 1 1 setbit bitkey1 2 1 setbit bitkey2 0 1 setbit bitkey2 1 1 setbit bitkey2 3 1 bitop and reskey bitkey1 bitkey2 bitcount reskey
7 HyperLogLog
PFADD
添加指定元素到HyperLogLog中PFCOUNT
返回给定的HyperLogLog的基数估算值PFMERGE
多个HyperLogLog合并为一个HyperLogLog
PFADD hykey1 1 3 4 5 6 7
PFCOUNT hykey1 # 6
PFADD hykey2 1 2 2 2 3 4 5 5 5 5
PFCOUNT hykey2 # 5
PFMERGE hyres hykey1 kykey2
PFCOUNT hyres # 6
8 GEO
GEOADD
多个经度(longitude)、纬度(laitude)、位置名称(member)添加到指定的 key 中# geoadd key lon lat member geoadd cqcity 116.12345 26.12345 "xxx村" 120.12345 20.12345 "xxx乡"
GEOPOS
从键里面返回所有给定位置元素的位置(经度和纬度)geopos cqcity xxx村
GEODIST
返回两个给定位置之间的距离geodist cqcity xxx村 xxx乡 km
GEORADIUS
以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素,# WITHDIST:在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。 # WITHCOORD:将位置元素的经度和维度也一并返回。 # WITHHASH:以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试,实际中的作用并不大 # COUNT 限定返回的记录数。 GEORADIUS cqcity 120.12345 20.12346 10 km withdist withcoord withhash count 10
GEORADIUSBYMEMBER
跟GEORADIUS类GEOHASH
返回一个或多个位置元素的geohash 标识
9 Stram流
XADD 添加消息到队列末尾
- 消息ID必须要比上一个ID大
- 默认用
*
标识自动生成id,用于XADD命令中,让系统自动生成id - 消息id格式为时间戳-n
XADD mystream * k1 v1 k2 v2 k3 v3
XRANGE 用于获取消息列表(可以指定范围)
- start 表示开始值,
-
代表最小值 - end 表示结束值,
+
代表最大值 - count 表示最多获取多少个值
XRANGE mystream - + XRANGE mystream - + 1
- start 表示开始值,
XREVRANGE 反转,与XRANGE类似
XDEL 删除消息
XDEL mystream id
XLEN
XLEN mystream
XTRIM 用于对Stream的长度进行截取,如超长会进行截取
- MAXLEN 运行的最大长度,对流进行修剪限制长度
- MINID 允许的最小id,从某个值开始比该值小的将会被抛弃
XTRIM mystream maxlen 1 XTRIM mystream minid 1733126959389-0
XREAD 用于获取消息(阻塞/非阻塞),只会返回大于指定ID的消息
非阻塞
# $代表特殊ID,表示以当前Stream已经存储的最大的ID作为最后一个ID,当前stream中不存在大于当前最大ID的消息,因此此时返回nil XREAD count 2 streams mystream $ # 0-0代表从最小的ID开始获取Stream中的消息,当不指定count,将会返回stream中的所有消息,注意也可以使用0(00/000也都是可以的 XREAD count 2 streams mystream 0-0
阻塞
XREAD count 1 block 0 streams mystream $ # 重新开一个客户端,进行插入操作 XADD mystream * k1 v1 k2 v2 k3 v3
XGROUP 分组消费
XGEOUP CREATE 用于创建消费者组
# $ 表示从Stream尾部开始消费 XGROUP CREATE mystream groupX $ # 0 表示从Stream头部开始消费 XGROUP CREATE mystream groupY 0
XREADGROUP GROUP
>
表示从第一条尚未被消费的消息开始读取XREADGROUP GROUP groupX comsumer1 STREAMS mystream >
XREADGROUP GROUP groupZ comsumer1 COUNT 1 STREAMS mystream > XREADGROUP GROUP groupZ comsumer2 COUNT 1 STREAMS mystream >
XPENDING
# 查询每个消费组内所有消费者「已读取、但尚未确认」的消息 XPENDING mystream groupX - + 10 # 查看某个消费者具体读取了哪些数据 XPENDING mystream groupX - + 10 consumer1
XACK 消息签收
XACK mystream groupX id
五、Redis 键操作
keys *
看当前库所有的keyexists key
判断某个key是否存在type key
查看你的key是什么类型del key
删除指定的key数据unlink key
非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续的异步中操作ttl key
查看还有多少秒过期,-1表示永不过期,-2表示已过期expire key 过期时间
为给定的key设置过期时间move key dbindex【0-15】
将当前数据库的key移动到给定的数据库select dbindex
切换数据库【0-15】,默认为0dbsize
查看当前数据库key的数量flushdb
清空当前库flushall
通杀全部库
六、持久化
1 RDB
指定的时间间隔执行数据集的时间点快照
实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。这个快照文件就称为RDB文件(dump.rdb),其中,RDB就是Redis DataBase的缩写
redis默认开启RDB
1.1 自动触发
配置文件
# 修改文件存储路径
dir /data/redis/data
# 修改文件名称
dbfilename redis6379.rdb
# 设置触发条件 5秒 2次操作则执行快照
save 5 2
1.2 手动触发
Redis提供了两个命令来生成RDB文件:分别是save和bgsave
SAVE
在主程序中执行会阳塞当前redis服务器,直到持久化工作完成执行save命令期间,Redis不能处理其他命令,BGSAVE
(默认) Redis会在后台异步进行快照操作,不阻寒快照同时还可以响应客户端请求,该触发方式会fork一个子进程由子进程复制持久化过程LASTSAVE 获取上一次快照的时间戳
1.3 优势
- RDB 是 Redis 数据的一个非常紧凑的单文件时间点表示。RDB 文件非常适合备份。例如,您可能希望在最近的 24 小时内每小时归档一次 RDB 文件,并在 30 天内每天保存一个 RDB 快照。这使您可以在发生灾难时轻松恢复不同版本的数据集。
- RDB 非常适合灾难恢复,它是一个可以传输到远程数据中心或 Amazon S3(可能已加密)的压缩文件。
- RDB 最大限度地提高了 Redis 的性能,因为 Redis 父进程为了持久化而需要做的唯一工作就是派生一个将完成所有其余工作的子进程。父进程永远不会执行磁盘 0 或类似操作。
- AOF 相比,RDB 允许使用大数据集更快地重启。
- 在副本上,RDB 支持重启和故障转移后的部分重新同步
- 适合大规模的数据恢复
- 按照业务定时备份
- 对数据完整性和一致性要求不高
- RDB 文件在内存中的加载速度要比AOF 快得多
1.4 劣势
- 如果您需要在 Redis 停止工作时(例如断电后)将数据丢失的可能性降到最低,那么 RDB 并不好。您可以配置生成 RDB 的不同保存点(例如,在对数据集至少5分钟和 100 次写入之后,您可以有多个保存点。但是,您通常会每五分钟或更长时间创建一次 RDB 快照,因此,如果 Redis 由于任何原因在没有正确关闭的情况下停止工作,您应该准好丢失最新分钟的数据。
- RDB 需要经常 fork() 以便使用子进程在磁盘上持久化。如果数据集很大,fork() 可能会很耗时,并且如果数据集很大并且 CPU 性能不是很好,可能会导致 Redis 停止为客户端服务几毫秒甚至一秒钟。AOF 也需要 fork() 但频率较低,您可以调整要重写日志的频率,而不需要对持久性进行任何权衡。
- 在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失从当前至最近一次快照期间的数据,
- 内存数据的全量同步,如果数据量太大会导致I/0严重影响服务器性能
- RDB依赖于主进程的fork,在更大的数据集中,这可能会导致服务请求的瞬间延迟fork的时候内存中的数据被克隆了一份,大致2倍的膨胀性,需要考虑
1.5 RDB 数据恢复命令简介
redis-check-rdb /data/redis/bak/dump.rdb
1.6 哪些情况会触发RDB快照
- 配置文件中默认的快照配置
- 手动save/bgsave命令执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
- 执行shutdown且没有设置开启AOF
- 持久化主从复制时,主节点自动触发
1.7 如何禁用快照
# redis.conf 配置文件 save空串
save ""
1.8 RDB 优化项
stop-writes-on-bgsave-error
默认yes如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制这种不一致,那么在快照写入失败时也能确保redis继续接受新的写请求
rdbcompressionrdb
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能
checksum
在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
rdb-del-sync-files
在没有持久性的情况下删除复制中使用的RDB文件启用。默认情况下no,此选项是禁用的。
2 AOF
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录)
只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
默认情况下,redis是没有开启AOF(append only file)的。开启AOF功能需要设置配置:appendonly yes
AOF保存的文件默认是 appendonly.aof
2.1 AOF工作流程
- Client作为命令的来源,会有多个源头以及源源不断的请求命令。
- 在这些命令到达Redis Server 以后并不是直接写入AOF文件,会将其这些命令先放入AOF缓存中进行保存。这里的AOF缓冲区实际上是内存中的一片区域,存在的目的是当这些命令达到一定量以后再写入磁盘,避免频繁的磁盘IO操作。
- AOF缓冲会根据AOF缓冲区将命令写入盘上的AOF文件。
- 随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称),从而起到AOF文件压缩的目的。
- 当Redis Server 服务器重启的时候会从AOF文件载入数据。
2.2 AOF三种写回策略
Always
同步写回,每个写命令执行完立刻同步地将日志写回磁盘
everysec
(默认)每秒写回。每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1秒把缓冲区中的内容写入磁盘
no
操作系统控制的写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘

2.3 开启AOF
appendonly yes
2.4 AOF文件

- base 基本文件
- incr 增量文件
- manifest 清单文件
2.5 AOF 恢复
正常恢复,开启AOF后,当Redis重启时,会自动通过备份文件恢复
异常恢复,Redis突然宕机,incr每秒写入还没完成,导致incr增量文件出现错误,Redis启动失败
# 修复命令 redis-check-aof --fix appendonly.aof.1.incr.aof
2.6 AOF 优势
更好的保护数据不丢失、性能高、可做紧急恢复
- 使用 AOF Redis 更加持久:您可以有不同的 fsync 策略:根本不fsync、每秒 fsync、每次查询时 fsync。使用每秒 fsync 的默认策略,写入性能仍然很棒。fsync 是使用后台线程执行的,当没有 fsync 正在进行时,主线程将努力执行写入,因此您只能丢失一秒钟的写入。
- AOF 日志是一个仅附加日志,因此不会出现寻道问题,也不会在断电时出现损坏问题。即使由于某种原因(磁盘已满或其他原因)日志以写一半的命令结尾,redis-check-aof 工具也能够轻松修复
- 当 AOF 变得太大时,Redis 能够在后台自动重写 AOF。重写是完全安全的,因为当 Redis 继续附加到旧文件时,会使用创建当前数据集所需的最少操作集生成一个全新的文件,一旦第二个文件准备就绪,Redis就会切换两者并开始附加到新的那一个
- AOF 以易于理解和解析的格式依次包含所有操作的日志。您甚至可以轻松导出 AOF 文件。例如,即使您不小心使用该FLUSHALL命令刷新了所有内容,只要在此期间没有执行日志重写,您仍然可以通过停止服务器、删除最新命令并重新启动 Redis 来保存您的数据集
2.7 AOF 劣势
- AOF 文件通常比相同数据集的等效 RDB 文件大
- 根据确切的 fsync 策略,AOF 可能比 RDB 慢。一般来说,将 fsync 设置为每秒性能仍然非常高,并且在禁用 fsync 的情况下,即使在高负载下它也应该与 RDB 一样快。即使在巨大的写入负载的情况下,RDB 仍然能够提供关于最大延迟的更多保证
2.8 AOF 重写机制
- 由于AOF持久化是Redis不断将写命令记录到 AOF文件中,随着Redis不断的进行,AOF的文件会越来越大。文件越大,占用服务器内存越大以及 AOF 恢复要求时问越长。
- 为了解决这个问题,Redis新增了,当AOF文件的大小超过所设定的峰值时,Redis就会自动启动AOF文件的内容压缩只保留可以恢复数据的最小指令集,或者可以手动使用命令 bgrewriteaof 来重写。
默认重写配置
# 根据上次重写后的aof大小,判断当前aof大小是不是增长了1倍
auto-aof-rewrite-percentage 100
# 重写时满足的文件大小
auto-aof-rewrite-min-size 64mb
# 同时满足以上两个条件,才会触发
2.9 APPEND ONLY MODE 配置
配置指令 | 配置含义 | 配置示例 |
---|---|---|
appendonly | 是否开启aof | appendonly yes |
appendfilename | aof文件名称 | |
appendfsync | 同步方式 | everysec/always/no |
no-appendfsync-on-rewrite | aof重写期间是否同步 | no-appendfsync-rewrite no |
auto-aof-rewrite-percentage | 当前aof大小是不是增长了多少 | auto-aof-rewrite-percentage 100 |
auto-aof-rewrite-min-size | aof重写时满足的文件大小 | auto-aof-rewrite-min-size 64mb |
3 RDB和AOF混合持久化
3.1 开启混合方式设置
aof-use-rdb-preamble的值为yes表示开启,设置为no表示禁用
3.2 RDB+AOF的混合方式
。先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。简单来说:混合持久化方式产生:的文件一部分总RDB格式,一部分是AOF格式。---->AOF包插了RDB头部+AOF混特
4 纯缓存模式(关闭持久化)
配置文件禁用的情况下,仍然可以通过BGSAVE和bgrewriteaof 命令生成RDB文件和AOF文件
# 禁用RDB
save ""
# 禁用AOF
appendobly no
七、Redis事务
可以一次执行多个命令,本质是一组命令的集合。
1 简介
单独的隔离操作
事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所Redis的事务仅仅是保i有指令前是不可能再去司时执行其他客户端的请求的
没有隔离级别的概念
因为事务提交前任何指令都不会被实际执行,也就不存在"事务内的查询要看至事务里的更新,在事务外查询不能看到"这种问题了
不保证原子性
Redis的事务,也就是不保证所有指令同时成功或同时失败,
排它性
Redis会保证一个事务的命令依次执行,而不会被其它命令插入
2 Redis事务命令
命令 | 含义 |
---|---|
DISCARD | 取消事务 |
EXEC | 执行所有事务块内的命令 |
MULTI | 标记一个事务的开始 |
UNWATCH | 取消WATCH命令对所有key的监视 |
WATCH | 监视一个或多个key,如果在事务执行之前这些key被其他命令所改动,那么事务将被打断 |
2.1 正常执行
MULTI
set k1 v1
set k2 v2
set k3 v3
EXEC

2.2 放弃事务
MULTI
set k1 v1
set k2 v2
set k3 v3
DISCARD

2.3 命令错误,整体取消

2.4 执行EXEC后,出现错误
set name zhangsan
MULTI
set k1 v1
INCR name
set k2 v2
EXEC
get k2

2.5 WATCH
Watch命令是一种乐观锁的实现,Redis在修改的时候会检测数据是否被更改,如果更改了,则执行失败
set name zhangsan
set balance 100
WATCH balance
MULTI
set name lisi
set balance 200
# 在EXEC前,打开另一个客户端,修改balance的值
EXEC
