欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis面试题总结

程序员文章站 2024-03-21 21:43:28
...

Redis

首先Redis是基于内存的高效Key-value的数据库,他把所有操作放进内存中,动态异步通过flush到磁盘上,因为在内存中IO读写操作非常快速,所以他美妙能执行10万次的IO。非常高效。

redis优点

  1. 内存高效。
  2. 支持多种数据类型:String,list,set,sortedset,hash。可以通过list做一个FIFO的消息队列。
  3. 单个value是1GB 而memcache是1mb
  4. 可以持久化到磁盘上,
  5. 可以设置过期时间
  6. 支持事务

设置过期时间

  1. Expire 设置过期时间的秒数
  2. Pexpire 设计毫秒数
  3. ExpireAt 设置一个timestap时间,是utix类型,通过在线转换 秒数
  4. PexpireAt 毫秒数

redisDB结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典
PERSIST命令可以移除一个键的过期时间:(移除成功返回0)
ttl命令查找

过期策略
因为可以设置过期时间那么他就有三种过期策略

  1. **定时过期策略:**在设计过期时间的时候给key添加一个计时器,当计时器要达到过期时间的时候就进行Key的删除。 如果同一时间要删除多个Key,那么cpu要执行的时间就非常长。创建很多定时器是耗时的。

  2. 惰性删除策略:Key过期的时候不删除,每次从redisDB中获取Key的时候效验过期不过期,如果过期就删除。如果大量的Key过期了没有删除,很久都没有人来获取,那么就会造成大量无用垃圾占用内存。

  3. 定期删除策略:每隔一段时间删除一次,在redis.conf中hz配置,如果配置的是1则1秒删除一次,如果配置的数越大,那么删除的越频繁。
    配置方式有两中:1.redis.conf: hz 2.设置最大redis.conf-Maxmemory最大值,触发回收策略

    redis是采用定期和惰性删除。
    

回收策略

  1. Volatile-lru:从设置过期时间中,找到最近最少使用的
  2. Volatile-ttl:从设置过期时间中,找到将要过期的。
  3. Volatile-random:从设置过期时间中,随机
  4. allkeys-lru:从所有数据中找到最近最少使用的。
  5. allkeys-random:从所有数据中随机找
  6. no-enviction:不回收。

redis持久化。
1.RDB
save 900 10 每900秒内有10条记录修改则出发RDB
持久化方式也分为两中:SAVE和BGSAVE
SAVE是阻塞式的RDB持久化,当执行这个命令时redis的主进程把内存里的数据库状态写入到RDB文件(即上面的dump.rdb)中,直到该文件创建完毕的这段时间内redis将不能处理任何命令请求。
bgSAVE属于非阻塞式的持久化,它会创建一个子进程专门去把内存中的数据库状态写入RDB文件里,同时主进程还可以处理来自客户端的命令请求。但子进程基本是复制的父进程,这等于两个相同大小的redis进程在系统上运行,会造成内存使用率的大幅增加。

2.持久化之增量写入:AOF
AOF是通过保存对redis服务端的写命令(如set、sadd、rpush)来记录数据库状态的,即保存你对redis数据库的写操作
Aof持久化是通过命令追加、文件写入和文件同步三个步骤实现的
当reids开启AOF后,服务端每执行一次写操作(如set、sadd、rpush)就会把该条命令追加到一个单独的AOF缓冲区的末尾,这就是命令追加;然后把AOF缓冲区的内容写入AOF文件里。看上去第二步就已经完成AOF持久化了那第三步是干什么的呢?这就需要从系统的文件写入机制说起:一般我们现在所使用的操作系统,为了提高文件的写入效率,都会有一个写入策略,即当你往硬盘写入数据时,操作系统不是实时的将数据写入硬盘,而是先把数据暂时的保存在一个内存缓冲区里,等到这个内存缓冲区的空间被填满或者是超过了设定的时限后才会真正的把缓冲区内的数据写入硬盘中。也就是说当redis进行到第二步文件写入的时候,从用户的角度看是已经把AOF缓冲区里的数据写入到AOF文件了,但对系统而言只不过是把AOF缓冲区的内容放到了另一个内存缓冲区里而已,之后redis还需要进行文件同步把该内存缓冲区里的数据真正写入硬盘上才算是完成了一次持久化。而何时进行文件同步则是根据配置的appendfsync来进行

appendfsync有三个选项:
everysec:每一秒执行一次。
always:每执行一个事件就写入一次。
no:文件从缓存同步导内存中由系统决定。

RDB对Key过期机制

  • 从内存数据库持久化数据到RDB文件
    持久化key之前,会检查是否过期,过期的key不进入RDB文件
  • 从RDB文件恢复数据到内存数据库
    数据载入数据库之前,会对key先进行过期检查,如果过期,不导入数据库(主库情况)

AOF对Key过期机制

从内存数据库持久化数据到AOF文件:

  • 当key过期后,还没有被删除,此时进行执行持久化操作(该key是不会进入aof文件的,因为没有发生修改命令)
  • 当key过期后,在发生删除操作时,程序会向aof文件追加一条del命令(在将来的以aof文件恢复数据的时候该过期的键就会被删掉)
  • AOF重写
    重写时,会先判断key是否过期,已过期的key不会重写到aof文件

aof的重写机制。

相关标签: redis