美文网首页
redis基本常识

redis基本常识

作者: 农民工进城 | 来源:发表于2019-07-21 22:04 被阅读0次

本章要点

  • 键值失效策略
  • redis持久化
  • 线程模型

1.键值失效策略

1.1 数据淘汰策略
  • noeviction:不删除策略,达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。
  • allkeys-lru:所有key通用;优先删除最近最少使用(less recently used ,LRU) 的 key。
  • volatile-lru:只限于设置了expire的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
  • allkeys-random:所有key通用;随机删除一部分 key。
  • volatile-random:只限于设置了expire的部分; 随机删除一部分 key。
  • volatile-ttl:只限于设置了expire的部分; 优先删除剩余时间(time to live,TTL)短的key
1.2 redis主键失效机制
  • 消极方法(passive way),在主键被访问时如果发现它已经失效,那么就删除它
  • 积极方法(active way),周期性地从设置了失效时间的主键中选择一部分失效的主键删除
  • redis维护了一个字典表,当进行expires操作时,首先在字典表中查找要设置的主键是否存在,如果存在就将这个主键和失效时间添加到 expires 这个字典表。简单地总结来说就是,设置了失效时间的主键和具体的失效时间全部都维护在 expires 这个字典表中。

2.数据持久化

redis是基础内存的数据库,为了防止数据丢失,所以要对数据进行持久化,redis的持久化有两种方式:AOF和RDB。

2.1 RDB持久化:

RDB指把当前的数据生成快照,以RDB文件(二进制压缩文件)的形式存储,redis可以通过RDB文件,还原到生成RDB文件时的数据库状态,到可以手动执行,也可以设置定期自动执行。有两个命令可生成RDB文件save(阻塞)、bgsave(非阻塞)。
-- save:阻塞模式,此时服务器不能接受其他命令
-- bgsave:非阻塞模式,主进程fork子进程,然后有子进程生成RDB文件,主进程继续接受和处理其他命令
配置是在redis.conf文件里进行配置:

save 900 1 #表示如果900秒内至少1个key发生变化(新增、修改和删除),则重写RDB文件
save 300 10 #表示如果每300秒内至少10个key发生变化(新增、修改和删除),则重写RDB文件;
save 60 10000 #表示如果每60秒内至少10000个key发生变化(新增、修改和删除),则重写RDB文件。

只要满足其一,就会进行重写RDB文件

  • serverCron
    serverCron会周期性检查保存save选项设置的条件是否满足,默认100毫秒就会执行一次。
    saveCron执行的时候会对两个参数进行更新保存:
    -- lastsave,最近执行save或bgsave命令时间戳;
    -- dirty计数器,记录执行命令次数
2.2AOF持久化:

AOF通过保存记录Redis服务器所执行的写命令来记录数据库的状态,但他并不是记录客户端发送的原始命令,而是记录转换之后的符合Redis协议的命令
AOF实现过程:
AOF持久化流程主要包括:命令追加(append),文件同步(sync),文件重写(rewrite),重启加载(load)四步骤
- 当AOF持久化功能打开时,服务器在执行完命令后,会将所有的写入命令以协议的格式append追加到aof_buf缓冲区末尾
- AOF缓冲区向硬盘做sync同步
- 随着AOF文件越来越大,需定期对AOF文件rewrite重写,达到压缩
- 当redis服务重启,可load加载AOF文件进行恢复

Redis会定期做aof重写,压缩aof文件日志大小

在redis实例重启时,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。

加载顺序.jpg

文件的载入是在redis启动时自动载入的,不需要人工干预,载入RDB时会一直阻塞,直到完全载入为止

3.Redis线程模型(reactor)

大家直到Redis是单线程的,但是具体的线程模型未必清楚。

其实Redis是一个单进程单线程且采用多路I/O复用模型,非阻塞IO技术, 使之可以同时处理多个连接请求(减少网络IO耗时), 也不需要关心锁,线程切换等资源消耗问题;

  • redis基于reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器,,file event handler。这个文件事件处理器,是单线程的,redis才叫做单线程的模型,采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器来处理这个事件。文件事件处理器的结构包含4个部分:多个socket,IO多路复用程序,文件事件分派器,事件处理器(命令请求处理器、命令回复处理器、连接应答处理器,等等)

  • 如果被监听的socket准备好执行accept、read、write、close等操作的时候,跟操作对应的文件事件就会产生,这个时候文件事件处理器就会调用之前关联好的事件处理器来处理这个事件。

  • 多个socket可能并发的产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个socket,但是会将socket放入一个队列中排队,每次从队列中取出一个socket给事件分派器,事件分派器把socket给对应的事件处理器。

  • 然后一个socket的事件处理完之后,IO多路复用程序才会将队列中的下一个socket给事件分派器。文件事件分派器会根据每个socket当前产生的事件,来选择对应的事件处理器来处理。

  • 当socket变得可读时(比如客户端对redis执行write操作,或者close操作),或者有新的可以应答的sccket出现时(客户端对redis执行connect操作),socket就会产生一个AE_READABLE事件。

  • 当socket变得可写的时候(客户端对redis执行read操作),socket会产生一个AE_WRITABLE事件。

  • IO多路复用程序可以同时监听AE_REABLE和AE_WRITABLE两种事件,要是一个socket同时产生了AE_READABLE和AE_WRITABLE两种事件,那么文件事件分派器优先处理AE_REABLE事件,然后才是AE_WRITABLE事件。

相关文章

网友评论

      本文标题:redis基本常识

      本文链接:https://www.haomeiwen.com/subject/jejdfctx.html