Redis学习笔记

目录

1.数据类型

 redis线程模型:

主线程

后台线程:

Redis 持久化

1.AOF日志

RDB快照

混合持久化

过期删除

内存淘汰:


1.数据类型

 redis线程模型:

主线程

redis处理用户请求是单线程,即「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成的

在 Redis 6.0 版本之后,也采用了多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,Redis 的性能瓶颈有时会出现在网络 I/O 的处理上。但处理命令依然是单线程。 

为什么单线程可以那么快,1.Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构  2.单线程模型可以避免了多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且也不会导致死锁问题。  3. Redis 采用了 I/O 多路复用机制处理大量的客户端 Socket 请求

后台线程:

1、处理关闭文件、2、AOF 刷盘、3、异步释放 Redis 内存,也就是 lazyfree 线程。例如执行 unlink key / flushdb async / flushall async 等命令。

因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。

 后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者(BIO)不停轮询这个队列,拿出任务就去执行对应的方法即可。

Redis 持久化

1.AOF日志

定义:Redis 在执行完一条写操作命令后,就会把该命令以追加的方式写入到一个文件里,然后 Redis 重启时,会读取该文件记录的命令,然后逐一执行命令的方式来进行数据恢复。

问题:可能没来得及写入就宕机,造成丢数据;主线程写日志,会阻塞其他命令。

AOF写硬盘策略(内核缓冲区写入硬盘):可靠性和性能是冲突的。

  • Always,这个单词的意思是「总是」,所以它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;
  • Everysec,这个单词的意思是「每秒」,所以它的意思是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘;
  • No,意味着不由 Redis 控制写回硬盘的时机,转交给操作系统控制写回的时机,也就是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。

AOF日志过大时,会触发重写机制。AOF 重写机制是在重写时,读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到「新的 AOF 文件」,等到全部记录完后,就将新的 AOF 文件替换掉现有的 AOF 文件。

AOF重写使用子进程执行,不使用子线程是因为任意一方修改共享内存时会进行写时复制。于是父子进程就有了独立的数据副本,就不用加锁来保证数据安全。为了防止重写时主线程修改了数据,会设置一个AOF 重写缓冲区,重写完成后,主进程会将 AOF 重写缓冲区中的所有内容追加到新的 AOF 的文件中。

写时复制的含义:

RDB快照

定义: AOF做故障恢复时,需要全量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢。为了解决这个问题,Redis 增加了 RDB 快照。

RDB 恢复数据的效率会比 AOF 高些,因为直接将 RDB 文件读入内存就可以,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。

是全量数据快照,不要太频繁。

RDB快照同样是可以子进程进行写。同样有写时复制。如果主线程修改了共享数据,发生了写时复制后,RDB 快照保存的是原本的内存数据,而主线程刚修改的数据,是被办法在这一时间写入 RDB 文件的,只能交由下一次的 bgsave 快照。

混合持久化

RDB 优点是数据恢复速度快,但是快照的频率不好把握。频率太低,丢失的数据就会比较多,频率太高,就会影响性能。        AOF 优点是丢失数据少,但是数据恢复不快。

4.0开始混合持久化,混合持久化工作在 AOF 日志重写过程。子进程先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,即前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。

过期删除

如果对一个key设置了过期时间,Redis 会把该 key 带上过期时间存储到一个过期字典中,查询key时会先去字典中看是否过期了。

Redis 使用的过期删除策略是「惰性删除+定期删除」这两种策略配和使用。

惰性删除:即访问时发现过期,再删除。它对CPU友好而对内存不友好。

定期删除:

每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。如果这一批中过期的数据到达一定比例,则再继续循环。当然有上限时间。

Redis使用混合方式,以平衡性能与内存。

进行持久化以及恢复时,AOF、RDB都会对过期数据进行处理。AOF:写入时:如果数据被删除,则增加一条删除命令。重写时:判断是否过期,过期不写入 RDB:写入时判断,过期不写入。加载时,主服务器判断,从服务器全写。

内存淘汰:

内存满了之后,会进行内存淘汰。有八种策略,

noeviction(Redis3.0之后,默认的内存淘汰策略)不淘汰任何数据,而是不再提供服务,直接返回错误。

  • volatile-random:随机淘汰设置了过期时间的任意键值;
  • volatile-ttl:优先淘汰更早过期的键值。
  • volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;
  • volatile-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;

在所有数据范围内进行淘汰:

  • allkeys-random:随机淘汰任意键值;
  • allkeys-lru:淘汰整个键值中最久未使用的键值;
  • allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值。

一般lru使用链表实现。redis为了节约内存, 给对象结构体中添加一个额外的字段,记录最后访问时间。淘汰时随机抽数据,删除最早的一个。

LFU 算法相比于 LRU 算法的实现,多记录了「数据的访问频次」的信息。是在lru字段(24bit)的低八位进行存储。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值