Redis | 青训营笔记

59 阅读4分钟

Redis简介

www.cnblogs.com/qqflying/p/…

Mysql等数据库中,其实有一大半的用户请求都是读操作,而且经常都是重复查询一个东西,浪费它很多时间去进行磁盘I/O。后来有人就琢磨,是不是可以学学CPU,于是Redis就类似于缓冲区,将经常查询的数据放到内存里快速读写。

redis是一种高级的key:value存储系统,支持的数据结构的存储:

* String * Hash * List * Set * SortedSet * Bitmap

为了防止内存无限制的增大,需要一些算法在合适的时间清理一些不必要的数据,就是[缓存过期 && 缓存淘汰]

内存淘汰策略

内存淘汰策略,提供了8种策略供应用程序选择,用于我遇到内存不足时该如何决策:

  • noeviction:返回错误,不会删除任何键值

  • allkeys-lru:使用LRU算法删除最近最少使用的键值

  • volatile-lru:使用LRU算法从设置了过期时间的键集合中删除最近最少使用的键值

  • allkeys-random:从所有key随机删除

  • volatile-random:从设置了过期时间的键的集合中随机删除

  • volatile-ttl:从设置了过期时间的键中删除剩余时间最短的键

  • volatile-lfu:从配置了过期时间的键中删除使用频率最少的键

  • allkeys-lfu:从所有键中删除使用频率最少的键 ————————————————

为了防止一些bug出现的[缓存击穿 && 缓存雪崩]使得redis的所有数据从内存消失,需要做一些持久化的事情。

Redis 持久化有两种方案

  • RDB (Redis DataBase) 是一种快照式的二进制数据存储,他会周期性的保存当前时间点 Redis 所有的数据到磁盘中。
  • AOF (Append Of File) 是一种追加式的存储方式,会实时的记录 Redis 的写操作到磁盘中。

RDB

是在一定时间内将内存中的所有数据全部写入到磁盘中

img

  在 redis.conf 文件中配置 N 秒内数据集至少有 M 个改动时自动触发一次 RDB 持久化,Redis 会将数据集的快照 dump 到 dump.rdb 文件中。

 也可以通过配置文件来修改Redis 服务器 dump 快照的频率,在打开 6379.conf 文件之后,搜索 save,可以看到下面的配置信息:

  60 秒内至少有 10000 个键被修改

  save 60 10000 # 在60秒(1分钟)之后,如果至少有10000个key发生变化,dump 内存快照。

  save 900 1 # 在900秒(15分钟)之后,如果至少有1个key发生变化,dump 内存快照。

  save 300 10# 在300秒(5分钟)之后,如果至少有10000个key发生变化,dump 内存快照。

 注:关闭 RDB 方式持久化只需要将所有 save 保存策略注释掉即可。

优缺点:

恢复速度快

备份时,CPU 资源占用过大,内存资源占用过多,数据的完整性和一致性不高间隔时间大并且丢失数据较多,

AOF:

 由于 RDB 快照方式的缺点,如果redis由于某些原因导致机器故障时,则会丢失最近几分钟写入的数据,而 AOF 持久化方式,则通过追加的方式将操作命令添加到 appendonly.aof 文件中,存储的文件是RESP协议指令文件。

也就是说,AOF是将执行数据的命令存储起来,像mysql一种,比如delete xxx1,update xxx2 ....

这样到一定时间文件也会曾丹,于是引入重写机制:

AOF 的工作原理时将写操作追加到文件中,文件的冗余内容会越来越多,Redis新增了重写机制,当 AOF 文件的大小超过所设定的阈值时,Redis就会对 AOF 文件的内容压缩。Redis 会 fork 出一条新进程,读取内存中的数据,并重新写了一个临时文件中。并没有读取旧文件。最后替换旧的aof文件。AOF文件重写是把 Redis 进程内的数据转化为写命令同步到新 AOF 文件的过程。

这是我参与「第五届青训营 」笔记创作活动的第14天.