redis

261 阅读24分钟

常用五大数据类型

redis键(key)

介绍

key的数据类型都为string

常用命令

key [pattern]  如果pattern 为* 查看当前库所有key,也可以模糊皮 例如:key bbcl* 则查找以bbcl开头的所有键

exists [key] 判断某个key是否存在

type [key] 查看你的key是什么类型

del [key] 删除指定的key数据,key可以写多个

unlink [key] 根据value选择非阻塞删除,仅将 keys 从 keyspace 元数据中删除,真正的删除会在后续异步操作,因此它不会阻塞。非阻塞删除简言之,就是将删除操作放到另外一个线程(而非 Redis 主线程)去处理。

expire [key] [seconds] 为指定的key设置过期时间,单位秒。对一个键重复设置,就会更新

ttl [key] 查看还有多少秒过期 -1表示永不过期,-2表示已过期

rename [oldkey] [newkey] 重命名key的值

pttl [key] 获取key的有效毫秒数

dump [key] 导出key的值,返回序列化之后的值。

renamenx [key] [newkey] 重命名一个key,新的key名称必须是当前不存在的key,不能跟其他key冲突。

randomkey 随机返回一个key

move [key] [db]移动key到另一个数据库中


select [index] 命令切换数据库,默认第0个数据库,总共16个数据库,最大传15

dbsize 查看当前数据库的key的数量

flushdb 请客当前库

flushall 通杀全部库

字符串string

介绍

string是redis基本类型,与Memcached一模一样的类型,一个key对应一个value

string是二进制安全的,意味着redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

一个key的value最多可以是512M

常用命令

1.set [key] [value] [EX|PX] [NX|XX]
NX:当数据库的key不存在时,可以将key-value添加到数据库
XX:当数据库的key存在时,可以将key-value添加到数据库,与NX互斥。
EX:设置key的超时秒数
PX:设置key的超时毫秒数,与EX互斥
例如:set bbcl 100 ex 100 nx
此命令设置一个key为bbcl 过期时间为100秒,并且不存在才可添加。


2.get [key]
查询key的value

3.append [key][value] 
将给定的value追加到原值末尾,此命令执行结束返回的是长度

4.strlen [key]
获取值的长度

5.setnx [key] [value]
只有在key不存在时,设置key的值。是对set命令的缩写,但无法直接设置过期时间。

6.incr [key]

对key的value进行原子的加1,value必须是整数类型,否则报错(float也不行)

如果key不存在,则会创建key,并且值直接为1

所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)

在单线程中,能够单条指令中完成的操作都可以认为是原子操作,因为中断只能发生于指令之间。

在多线程中,不能被其他进行(线程)打断的操作就叫原子操作。

redis单命令的原子性主要得益于redis的单线程。


7.decr [key]
对key的value进行数值减一
注意事项类似incr命令


8.incrby [key] [increment]

对key的value进行增加自定义数字。

9.decrby [key] [increment]

对key的value进行减少自定义数字。

10.mset [key value....]
同时设置一个或多个key-value对

11.mget [key...]
同时获取一个或多个value

12.msetnx [key value....]
同时设置一个或多个k-v对,当前仅当所有给的的key都不存在。
原子性操作,有一个失败则都失败。

13.getrange [key] [start] [end]
获取指定范围内的值,类似编程语言中substring函数
0 -1表示截取全部

14.setrange [key][offset][value]
设置指定索引开始的value值,索引从0开始。

15.setex [key] [seconds] [value]
设置键值的同时,设置过期时间,单位秒

16.getset [key] [value]
以新换旧,设置了新值的同时获取旧值。

数据结构

string的数据结构为简单的动态字符串,是可以修改的字符串,采用预分配陈冗余空间的方式来减少内存的频繁分配。

image.png

如果所示,实际分配的空间capacity一般要高于实际字符串长度len,当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容一次就会多扩1M的空间。需要注意字符串最大长度为512M。

Redis列表(List)

介绍

单键多值,有序可重复

redis列表是简单地字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或者尾部。

底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

image.png

常用命令

1.lpush/rpush [key] [value....]
从左边或右边插入N个值

2.lpop/rpop [key]
从左边/右边吐出一个值

3.rpoplpush [key1][key2]
从key1列表右边取出一个值,插入到key2列表左边。

4.lrange [key] [start][stop]
按照索引下标获取元素 (0 -1表示获取所有)

5.lindex [key] [index]
按照索引下标获得元素(从左到右)

6.llen [key] 获得列表长度

7.linsert [key] [before|after] [pivot] [value]
在值为pivot的前面或后面插入值

8.lrem [key] [count] [value]

从左边删除n个value
例如:lrem bbcl-fms 2 999 表示为从左边删除2个值为99910.lset [key] [index][value]

将列表key下标为index的值替换成value


11.ltrim [key] [start][stop]
对一个列表进行裁剪,让列表只保留指定区间内的元素,不在区间的会被删除。

数据结构

List的数据结构为快速链表quickList。 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。

他将所有的元素紧挨着一起存储,分配的是一块连续的内存。

当数据了比较多的时候才改成quicklist。

应为普通的链表需要的附加指针空间太大,会比较浪费时间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。

image.png

redis将链表和zip结合起来组成了quicklist,也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除功能,又不会出现太大的时间冗余。

Redis集合(Set)

简介

单键多值,无序不可重复

redis set对外提供的功能与list类似是一个列表的功能,特殊之外在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时。set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

redis的set是string类型的无序集合,它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。

一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变。

常用命令

1.sadd [key] [value....]
将多个值添加到集合key中,已经存在的元素会被忽略

2.smembers [key]

取出该集合的所有值。

3.sismember [key] [value]
判断集合key中是否含有value 有1 没有0

4.scard [key]
返回该集合元素的个数

5.srem [key] [value....]
删除集合中的某个元素。

6.spop [key]

随机从该集合中吐出一个值

7.sranmember [key][count]
随机从该集合取出n个值,不会从集合中删除。

8.smove [source][destination][value]
把集合中的一个值从一个集合移动到另一个集合

9.sinter [key][key...] 
返回多个集合中的交集

10.sunion [key...]
返回多个集合的并集元素

11.sdiff [key][key...]
返回两个集合的差集元素,key1中的,不包含key2中的


数据结构

set数据结构是dict字典,字典使用哈希表实现的。

Redis哈希(Hash)

介绍

Redis hash是一个键值对集合。

Redis hash是一个string类型的field和value的映射表,hash特别适合用户存储对象。

类似Java的Map<string,object>

image.png

常用命令


1.hset [key] [field][value]
给key集合中,field键赋值value

2.hget [key] [field]
去除key里field字段的值

3.hmset [key] [field1][value1] [field2][value2]...
批量设置hash的值

4.hexists [key][field]
查看hash表key中,field字段是否存在

5.hkeys [key]
列出hash集合的所有field

6.hvals [key]
列出该hash集合的所有value

7.hincrby [key] [field] [increment]
为hash表key的field字段增加指定数字

8.hsetnx [key] [field][value]
将key中的filed设置为value 当且仅当field不存在时。

9.hgetall [key]
获取key的所有字段和值


10.hmget [key] [field1] [field2]
批量获取指定字段的值

11.hlen [key]
返回key的字段数量

12.hdel [key] [field...]
删除keyh的一个或多个字段

数据结构

Hash数据类型对应数据结构是两种,ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

Redis有序集合Zset

简介

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。

不同之处是有序集合的每个成员都关联一个评分,这个评分被用来按照从低分到高分的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的。

因为元素是有序的,所以你也可以很快的根据评分或者次序来获取一个范围的元素。

访问有序集合的中间元素也是非常快的,因为你能够使用有序集合作为一个没有重复成员的智能列表。

常用命令

1.zadd [key] [score1][value1]  [score2][value2]...

将一个或多个元素及其score值加入到有序集key当中。

2.zrange [key] [start][stop] [withscores]
返回有序集合key中,下标在start到stop中的元素
带withscores,可以让分数一起和值返回到结果集。

3.zrangebyscore [key] min  max [withscores] [limit offset count]

返回有序集key中,所有score值介于min和max之间(包括等于min或max的成员)。
有序集合按score值递增(从小到大)次序排列。

inf无穷大,-inf负无穷大,
zrangebyscore myset -inf +inf 显示整个有序集



4.zrevrangebyscore [key]   max min [withscores] [limit offset count]
同上,改为从大到小排列。

5.zincrby [key] [increment][value]
为source加上增量

6.zrem [key] [value..]
删除该集合下,指定的元素

7.zount [key] [min][max]
统计该集合,分数区间内的元素个数

8.zrank [key] [value]
返回改值在集合中的排名,按分数(从小到大排序)


8.zrevrank [key] [value]
返回改值在集合中的排名,按分数(从大到小排序)

数据结构

sortedset是redis提供的一个非常特别的数据结构,一方面它等价于java的数据结构Map<string,Double>,可以给每一个元素value赋值一个权重score,另一方面他又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过sscore的范围来获取元素的列表。

zset底层使用了两个数据结构

1.hash的作用是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到对应的score值。

2.跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

三种特殊数据类型

GEO地理位置

介绍

Redis中的GEO特性在Redis3.2版本中推出,这个功能可以将用户给定的地理位置信息存储起来,并对这些信息进行操作,来实现诸如附近位置,摇一摇这类依赖于地理信息的功能,geo的数据类型为zset。

GEO的数据结构总共有六个常用命令:geoadd,geopos,geodist,georadius,georadiusbymember,gethash

常用命令

1.GEOADD key longitude latitude member [longitude latitude member ...]

geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。

2.GEOPOS key member [member ...]

geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。

3.GEODIST key member1 member2 [m|km|ft|mi]
geodist 用于返回两个给定位置之间的距离。


4.georadius、georadiusbymember
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。


5.GEOHASH key member [member ...]

Redis GEO 使用 geohash 来保存地理位置的坐标。

geohash 用于获取一个或多个位置元素的 geohash 值。


Hyperloglog

介绍

在工作中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(页面访问量),可以使用redis的incr,incrby轻松实现。

但像UV(独立访客),独立IP数,搜索记录数等需要去重和技术的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。

解决基数问题有很多方案: 1.数据存储在MYSQL表中,用distinct count统计不重复个数 2.使用redis提供的hash、set、bitmaps等结构处理

以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。

能否降低一定的精度来平衡存储空间?redis退出Hyperloglog

Redis Hyperloglog是用来做基数统计的算法,HyperLoglog的优点是,在输入元素的数量或者体积非常大时,统计基数所需的空间总是固定的、并且很小的。

在redis里面,每个Hyperloglog键只需要话费12kb内存,就可以计算接近2的64次方个不同元素的基数。这和计算基数时,元素越多耗费内存越多的集合形成鲜明对比。

但是,因为Hyperlog只会根据输入元素来计算基数,而不会储存输入元素本身,所以Hyperloglog不能向集合那样,返回输入的各个元素。

什么是基数? 比如数据集{1,3,5,7,5,7,8},这个数据集的基数集为{1,3,5,7,8},基数为5。基数估计就是在误差可接受的范围内,快速计算基数。

常用命令

1.[PFADD key element [element ...]]
添加指定元素到 HyperLogLog 中。

2.PFCOUNT key [key ...] 
返回给定 HyperLogLog 的基数估算值。

3.PFMERGE destkey sourcekey [sourcekey ...] 
将多个 HyperLogLog 合并为一个 HyperLogLog

BitMap

介绍

在开发中,可能会遇到这种情况:需要统计用户的某些信息,如活跃或不活跃,登录或不登录,又如需要记录用户一年的打卡情况,打了是1,不大是0,如果使用普通的key/value存储,则要记录365条记录,如果用户量大,需要的空间也会很大,所以redis提供bitmap位图这种数据结构,bitmap就是通过操作二进制来进行记录,即为0和1,如果要记录365天的打卡情况,使用bitmap表示的形式大概如下:01010101001...,这样有什么好处呢?当然就是节约内存了,365天相当于365bit,又一个字节=8bit,所以相当于46个字节。

bitmap就是通过一个bit位来表示某个元素对应的值或者状态,其中key就是元素本身,实际上底层也是通过字符串的操作来实现。redis从2.2开始新增了setbit,getbit,bitcount等相关命令

常用命令

1.setbit [key] [offset] [value]
设置key的某一位上值value  value只能是01

2.getbit [key] [offset]
获取key的某一位置的值

3.bitcount [key] [start,end]
统计key上在指定范围内为1的个数

4.bitop operation destkey key [key …]
对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR)


Redis配置文件介绍

在自己的安装目录下找到redis.conf文件

units单位

配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit,大小写不敏感

image.png

includes包含

多实例的情况可以吧公用的配置提取出来 image.png

网络相关配置

bind

默认情况bind=127.0.0.1只能接收本机的访问请求

不写的情况下,无限制接收任何ip地址的访问

生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉。

如果开启了protected-model,name在没有设定bind ip且没有设置密码的情况下,redis只允许接受本机的响应

image.png

注释bind,保存配置,停止服务,重启启动查看进程,不再是本机访问了。

protected-model

将本机访问保护模式设置no,默认是yes

image.png

port

端口号:默认6379

image.png

tcp-backlog

设置tcp的backlog,backlog其实是一个链接队列,backlog队列总和=未完成三次握手的队列+已经完成三次握手的队列。

在高并发环境下你需要一个高backlog值来避免慢客户端链接问题。

注意:linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值(128),所以需要确认增大 /proc/sys/net/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果

image.png

timeout

一个空闲的客户端维持多少秒会关闭,0表示关闭该功能,即永不关闭

image.png

tcp-keepalive

对访问客户端的一种心跳监测,每隔N秒检测一次。 单位为秒,如果设置为0,则不会进行keeplive监测,建议设置为60

image.png

GENERAL 通用

daemonize

是否为后台进程,设置为yes

守护进程,后台启动

pidfile

存放pid文件的位置,每个实例会产生一个不同的pid文件

loglevel

指定日志记录的级别,redis总共支持四个级别:debug,verbose,notice,warning,默认是notice

image.png

logfile

日志文件名称

image.png

databases 16

设定库的数量,默认16,默认数据库为0,可以使用 select dbid 切换数据库

image.png

SECURITY 安全

设置密码

在命令中设置密码。只是临时的,重启redis服务器,密码就还原了。

config get  requirepass
config set  requirepass "123456"
auth 123456

永久设置,需要在文件中进行设置。

image.png

LIMITS 限制

maxclients

设置redis同时可以与多少个客户端进行链接。默认10000个

如果达到此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出 'max number of clients reached'以回应。

image.png

maxmemory

  • 建议必须设置,否则,将内存沾满,造成服务器宕机。

  • 设置redis可以使用的内存量,一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。

  • 如果redis无法根据移除规则来移除内存中的数据,或者设置了不允许移除,那么redis则会针对那些需要申请内存的指令返回错误信息,比如set,lpush等

  • 但是对于无内存申请的指令,仍然会正常响应,比如GET等,如果你的redis是主redis(说明你的redis有从redis),那么在设置内存上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是不移除的情况下,才不用考虑这个因素。

image.png

maxmemory-policy

  • volatile-lru:使用lru算法移除key,支队设置了过期时间的键:
  • allkeys-lru:在所有集合key中,使用lru算法移除key
  • volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
  • allkeys-random:在所有集合key中,移除随机的key
  • volatile-ttl:移除那些ttl值最小的key,即将那些最近要过期的key
  • noevction:不进行移除。针对写操作,只是返回错误信息

image.png

maxmemory-samples

-设置样本数量,lru算法和最小ttl算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中lru的那个。

-一般设置3到7的数字,数值越小样本越不准确,但性能消耗较小。

image.png

Redis持久化

Redis提供了两种不同形式的持久化方式。

  • RDB (Redis DataBase)
  • AOF (Append Of File)

RDB

介绍

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的snapshot快照,他恢复是是将快照文件直接读到内存里。

备份是如何执行的

redis会单独创建一个子进程进来进行持久化,会先将数据写入到一个临时文件中,等持久化结束之后,替换掉原来的持久化好的文件。整个进程中,主进程是不进行任何io操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那rdb方式要比aof方式更加的高效。rdb的缺点是最后一次持久化后的数据可能丢失。

Fork

  • Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量,环境变量,程序计数器等)数值和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

  • 在linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux引入写时复制技术

  • 一般情况父进程和子进程会共同用一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的 内容复制一份给子进程。

RDB持久化流程

image.png

dump.rdb文件

在redis.conf中配置文件名称,默认为 dump.rdb

image.png

配置位置

rdb文件的默认保存位置是redis启动命令所在的目录,也可以自行修改

image.png

配置文件的默认快照配置

image.png

save 和 bgsave

Redis的这两个命令都是用于创建当前数据库的备份。

因为Redis持久化选择RDB模式,所以Redis并不是实时的进行数据持久化,而是有一定的时间间隔。这个时候如果我们想要手动进行一次持久化,可以使用save或者bgsave命令

save

save直接调用rdbSave函数,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。

如果数据量小,用此命令可能感觉不出有什么区别,但是当数据量很大的时候,就需要谨慎使用这个命令。

image.png

bgsave

BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

BGSAVE方式比较适合线上的维护操作。

可以通过lastsave命令获取最后一次成功执行快照的时间

image.png

flushall命令

执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义。

SNAPSHOTTING 快照

save

格式: save 秒钟 写的操作次数

rdb是整个内存的压缩过的snapshot,rdb的数据结构,可以配置符合的快照触发条件。

默认触发条件:

  • 900秒内修改过一次
  • 300秒内修改过10次
  • 60秒内修改过10000次

如果想禁用,不设置save命令 或者改为save ""即可

stop-writes-on-bgsave-error

当dedis无法写入磁盘的话,直接关掉redis的写操作,推荐yes。

image.png

rdbcompression 压缩文件

对于存储到磁盘中的快照,可以设置是否进行压缩存储,如果是的话,redis会采用lzf算法进行压缩。

如果你不想消耗cpu来进行压缩的话,可以设置为关闭此功能。推荐yes

image.png

rdbchecksum 检查完整性

在存储快照后,还可以让redis使用crc64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到更大的性能提升,可以关闭此功能,推荐yes

rdb的备份

先通过config get dir查询rdb文件的目录

将*.rdb的文件拷贝到别的地方

rdb的恢复

  • 关闭redis
  • 先把备份的文件拷贝到工作目录下 cp dump2.rdb dump.rdp
  • 启动redis 备份数据会直接加载

优势

  • 适合大规模的数据恢复
  • 对数据完整性和一致性要求不高更适合使用
  • 节省磁盘空间
  • 恢复速度快

image.png

劣势

  • fork的时候,内存中的数据被克隆了一份,大致2倍的通胀性需要考虑
  • 虽然redis在fork是采用了写时复制技术,但数据量庞大的时候还是比较消耗性能。
  • 在一定间隔时间做一次备份,所以redis如果意外宕机,就会丢失最后一次快照后的所有修改

如何停止

动态停止: config set save ""

总结

image.png

AOF

介绍

以日志的形式来记录每个写操作(增量保存),将redis执行过得所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取改文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将指令从前到后执行一次以完成数据的恢复工作。

持久化流程

  1. 客户端的请求写命令会被append追加到AOF缓冲区内;
  2. AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中
  3. AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;
  4. redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的。

image.png

AOF默认不开启

可以在redis.conf文件中配置文件名称,默认为appendonly.aof

AOF文件的保存路径,同RDB的路径一致。

image.png

AOF和RDB同时开启,redis听谁的?

AOF和RDB同时开启,系统默认取AOF得数据(数据不会存在丢失)

AOF启动/修复/恢复

  • AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统就会加载。

  • 正常恢复

    • 修改默认的appendonly no 改为yes
    • 将有数据的aof文件复制一份到对应目录
    • 恢复: 重启redis然后重新加载
  • 异常恢复

    • 修改默认的appendonly no 改为yes
    • 如遇到AOF文件损坏,通过redis-check-aof 进行恢复
    • 备份已经修好的aof文件
    • 重启redis

AOF同步频率设置

appendfsync always

始终同步,每次redis的写入都会立刻记入日志;性能较差但数据完整性比较好

appendfsync everysec

每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。

appendfsync no

redis不主动进行同步,把同步时机交给操作系统。

优势

image.png

  • 备份机制更稳健,丢失数据概率更低。
  • 可读的日志文本,通过操作AOF稳健,可以处理误操作。

劣势

  • 比起RDB占用更多的磁盘空间。
  • 恢复备份速度要慢。
  • 每次读写都同步的话,有一定的性能压力。
  • 存在个别Bug,造成恢复不能。

aof总结

image.png

总结

用哪个好

官方推荐两个都启用。

如果对数据不敏感,可以选单独用rdb。

不建议单独用AOF,因为可能会出现BUG。

如果只是做纯内存缓存,可以都不用。