1、用于查找所有符合给定模式 pattern 的 key
KEYS PATTERN(比如KEYS runoob*)
2、如果Redis有1亿个key,使用keys命令是否会影响线上服务?
执行keys命令,redis会锁定,如果数据庞大的话可能需要几秒或更长,对于生产服务器上锁定几秒这绝对是灾难了
考察Keys命令性能问题:关于redis的keys命令的性能问题
一、多线程or单线程问题
5、redis是多线程还是单线程?
redis中io多路复用器模块是单线程执行,事件处理器也是单线程执行,两个线程不一样。所以实际redis应该是单进程多线程,只是不同的模块都用的单线程实现。(redis4.0以前所有模块是单线程的,4.0以后是异步删除模块和6.0的I/O读写是多线程的)
两个维度来举例:
1)若是client发送命令到server的话,server处理命令是单线程逐条进行的。
2)server内部可以是多线程的,比如aof持久化,假设策略每秒,那就是再单独开启一个线程去执行aof文件持久化操作,这就是多线程了。
6、Redis主线程既然是单线程,为什么还这么快?
基于内存操作、数据结构简单、多路复用和非阻塞IO、避免上下文切换
7、Redis6.0的多线程?
Redis4.0引入了多线程,但4.0的多线程只支持大数量的异步删除。6.0中引入的多线程用于提高IO的读写能力,主要实现思路是将主线程的IO读写任务拆分给一组独立的线程去执行,这样就可以使用多个socket的读写并行化了,但Redis的命令依然是主线程串行执行的
8、Redis的多路复用是什么?
socket的读写方法默认是阻塞的,Redis的非阻塞IO是指IO的读写流程不再是阻塞的,读写方法都是瞬间完成并且返回的,也就是它会采用能读多少就读多少、能写多少就写多少的策略来执行IO操作。
非阻塞的IO也面临一个问题,那就是当执行读写操作时,有可能只读写了一部分数据,那么生效的数据何时写就成了一个问题。而IO的多路复用就是解决上面的这个问题的,使用IO多路复用最简单的方式就是使用select函数,此函数是操作系统提供给用户程序的API接口,用于监控多个文件描述符的可读和可写情况的,这样就可以监控到文件描述符的读写事件了。当监控到相应的时间之后就可以通知线程处理相应的业务了,这样就保证了Redis读写功能的正常执行。
【不过现在的操作系统已经基本上不适用select函数了,改为调用epoll函数(Linux)了,macOS则是使用Kqueue(继承与Unix),因为select函数在文件描述符非常多的时候性能非常差。】
三、持久化
11、为什么需要持久化
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据
12、Redis持久化方式有哪几种?具体怎么实现?优缺点是什么?
Redis的持久化方式有追加日志持久化aof和快照持久化rdb两种。rdb是指定时将内存中的数据快照写入磁盘,写入成功后替换之前的快照文件。aof是指以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录
13、Redis两种持久化方式的优缺点
rdb备份文件只有一个,转移方便,启动效率更高。但如果数据集比较大,备份时可能耗时比较长,且安全性比较低(比如下备份前宕机)
aof文件比较大,且持久化过程比较耗时,但安全性更高,达到不丢失1s的数据
14、aof的追加日志和备份文件(重写),底层实现原理的话知道么?
重写时不会读旧的aof文件,而是执行bgrewriteaof命令时主进程会fork一个子进程,将整个内存中的数据库内容用命令的方式重写了一个新的临时aof文件,这点和快照有点类似。同时如果主进程接收新的读写命令会继续写入旧的aof文件,且同时会写入缓存。当临时aof文件写完后,子进程会通知主进程,主进程将缓存中的命令写入新的aof文件,并且替换原有的aof文件
15、Redis的持久化开启了RDB和AOF下重启服务是如何加载的?
优先AOF,AOF没找到的话再找RDB,因为AOF文件的数据要全于RDB。
四、应用
16、10万用户一年365的登陆情况如何用redis存储,并快速检索任何时间窗内的活跃用户
使用bitmap数据结构。以日期为key,userId为偏移量,执行命令setbit day useId 1
例如:小梅(userId= 1992)和小明(userId=9877)在 2020-10-01日登录;
setbit '2020-10-01' 1992 1
setbit '2020-10-01' 9877 1
10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户
17、微信微博点赞、收藏、标签、关注(使用HashMap
数据结构)
- 用户某篇文章的点赞数:
HashMap
中的key
为articleId
,value
为Set
,Set
中的值为用户ID
,即HashMap<String, Set<String>>
- 用户总的点赞数:
HashMap
中的key
为userId
,value
为String
记录总的点赞数 - 用户点赞、收藏的文章:
HashMap
中的key
为userId
,value
为Set
,Set
中的值为文章ID
,即HashMap<String, Set<String>>
标签、关注功能
:HashMap
中的key
为userId
,value
为Set
,Set
中的值为标签,即HashMap<String, Set<String>>
五、Redis分布式
15、Redis分布式锁