系列(三)—Redis

1、用于查找所有符合给定模式 pattern 的 key

KEYS PATTERN(比如KEYS runoob*)

Redis Keys 命令

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函数在文件描述符非常多的时候性能非常差。】

Redis 是属于多线程还是单线程?

三、持久化

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文件

Redis-只追加日志AOF重写原理

15、Redis的持久化开启了RDB和AOF下重启服务是如何加载的?

优先AOF,AOF没找到的话再找RDB,因为AOF文件的数据要全于RDB。

彻底搞懂Redis持久化之RDB原理

彻底搞懂Redis持久化之AOF原理

Redis持久化之RDB与AOF对比总结

四、应用

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存储,并快速检索任意时间窗内的活跃用户

Redis的bitmap从基础到业务

17、微信微博点赞、收藏、标签、关注(使用HashMap数据结构

  • 用户某篇文章的点赞数:HashMap中的keyarticleIdvalueSetSet中的值为用户ID,即HashMap<String, Set<String>>
  • 用户总的点赞数:HashMap中的keyuserIdvalueString记录总的点赞数
  • 用户点赞、收藏的文章HashMap中的keyuserIdvalueSetSet中的值为文章ID,即HashMap<String, Set<String>>
  • 标签、关注功能HashMap中的keyuserIdvalueSetSet中的值为标签,即HashMap<String, Set<String>>

Redis实现点赞功能模块

五、Redis分布式

15、Redis分布式锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值