浅谈Redis

Redis 2022年06月30日 00:42 3082  

什么是Redis

Redis 是一个开源的、高性能的、K-V内存数据库。它通过提供多种键值数据类型来满足不同场景下的存储需求,并借助许多高层级的接口使其可以胜任如缓存、队列系统等不同的角色。

Redis五种数据结构

  1. string 字符串:可以为整形、浮点型、字符串,统称为元素
  2. list列表:可以作为队列使用
  3. hash hash散列值:即字典,key值唯一
  4. set 集合:一个集合内,所有元素各不相同
  5. sortedSet有序集合

和集合一样,有序集合也是string类型元素的集合,且元素不允许重复。不同的是,有序集合的每个元素都会关联一个double类型的分数(score)。redis通过分数来为集合中的成员进行从小到大排序。

有序集合查找任意数据的时间复杂度是O(1),插入、操作删除操作的时间复杂度是O(logN)。

由于有序集合可以根据分数对元素进行排序,因此有序集合可以用于排行榜学生成绩排名等用途。

有序集合

出于对性能的考虑,有序集合底层有两类实现:

  1. 有序集合保存的元素数量小于128个,并所有元素长度都小于64字节时,有序集合对象使用ziplist实现
  2. 当不满足上述条件时,有序集合对象使用skiplist+字典实现

Redis持久化

RDB与AOF

RDB

缓存数据的快照
优点
RDB是一个非常紧凑的文件
RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能
与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些
缺点
数据丢失风险大(容易丢失最后一次存入的数据)
RDB需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时间,可能会导致Redis在一些毫秒级不能响应客户端需求
PS:

  • RDB是redis默认开启的 ,AOF默认不开启
  • AOF和RDB同时开启,默认读取AOF(AOF数据不会存在丢失)

AOF

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

AOF持久化流程

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

AOF同步频率设置

appendfsync always (总是)
始终同步,每次Redis的写入都会立刻记入日志;性能较差单数据完整性比较好
appendfsync everysec (每秒)
每秒同步,每秒计入日志一次,如果宕机,本秒的数据可能丢失
appendfsync no (系统同步)
redis不主动进行同步,把同步时机交给操作系统。