Redis面试题

目录

什么是Redis

Redis是单线程还是多线程

Redis是单线程的,为什么那么快

Redis是单线程的,如何提高多核CPU的利用率

Redis底层数据如何利用调表进行存储

怎么理解Redis的事务

Redis事务相关的命令有哪些

Redis过期时间和永久有效如何设置

Redis持久化数据和缓存怎么做扩容

为什么Redis需要把数据放在内存中

Redis如何做内存优化

什么是缓存穿透

如何解决缓存穿透

Redis集群模式有哪些

主从复制工作原理

哨兵模式工作原理

悲观锁

乐观锁

Redis持久化策略有哪些

RDB

AOF        

Redis有哪些适合的场景


什么是Redis

Redis本质是一个单线程的K-V内存数据库,定期通过异步操作把数据库数据flush到硬盘上进行储存。为应对各使用场景,提供了五种数据类型(String、List、Hash、Set、ZSet),String类型值最大容量为512M,常用于缓存结构体信息;List列表结构常用来做异步队列、秒杀抢购;Hash也可用于保存结构体信息;Set就是用在一些去重的场景里,例如每个用户只能参与一次活动、一个用户只能中奖一次等等去重场景;ZSet常用于各类热门排序场景。Redis集群模式有主从复制、哨兵模式、Cluster集群。拥有RDB和AOF两种持久化方式。

Redis是单线程还是多线程

在Redis6.0之前,Redis都是单线程进行数据处理,包括接收客户端请求;

Redis6.0开始,引入多线程模式,但多线程只针对接受客户端请求而已,底层执行命令依然是单线程排队执行。

Redis是单线程的,为什么那么快

  • 命令执行基于内存操作
  • 命令的执行是单线程操作,没有县城切换的开销
  • 使用多路 I/O 复用模型,非阻塞 IO
  • 搞笑的数据存储结构:全局Hash表以及多种高效数据结构(压缩列表、链表、跳表...)

Redis是单线程的,如何提高多核CPU的利用率

可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果你想使用多个CPU,可以考虑一下分片(shard)。

Redis底层数据如何利用调表进行存储

将有序链表改成为支持近似“折半查找”算法,可以进行快速的插、删、查。

怎么理解Redis的事务

  • 事务是一个单独的隔离性操作:事务中所有的命令都会被序列化、按顺序的执行,在执行的过程中不会被其他客户端发来的命令请求所打断
  • 事务是一个原子性操作:事务中的命令要么全部执行成功,要么全部执行失败

Redis事务相关的命令有哪些

  • MULTI
  • EXEC
  • DISCARD
  • WATCH

Redis过期时间和永久有效如何设置

EXPIPE

PERSIST

Redis持久化数据和缓存怎么做扩容

  • 被当作缓存使用
    • 使用一致性哈希实现动态扩缩容
  • 被当作持久化储存使用
    • 必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化

为什么Redis需要把数据放在内存中

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度会严重影响Redis的性能。

Redis如何做内存优化

尽可能使用散列表,散列表使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称、姓氏、邮箱、密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里。

什么是缓存穿透

通过K去查找V,当K对应的V 不存在的时候并对K发送大量的请求时,就会对后端造成巨大的压力,由于缓存不命中,每次都要去查DB,则失去了缓存的意义

如何解决缓存穿透

①存空值

缓存太多空值,占用更多空间。(优化:给个空值过期时间)

存储层更新代码了,缓存层还是空值。(优化:后台设置时主动删除空值,并缓存值进去)

②将数据库中所有的查询条件,放布隆过滤器中。当一个查询请求来临的时候,先经过布隆过滤器进行查,如果请求存在这个条件中,那么继续执行,如果不在,直接丢弃

Redis集群模式有哪些

  • 主从复制
  • 哨兵模式
  • Cluster集群

主从复制工作原理

①从服务器连接主服务器,发送sync命令,该命令用于强制将内存缓冲区中的数据立刻写入磁盘中;

②主服务器接收到sync命名后,开始执行bgsave(异步保存数据到磁盘)命令生成RDB文件并用缓存记录此后执行的写命令;

③主服务器bgsave命令执行完之后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

④从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

⑤主服务器快照发送完毕后开始向从服务器发送缓存中的写命令;

⑥从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓存的写命令。

哨兵模式工作原理

①每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他Sentinel实例发送一个PING命令;

②如果一个实例距离最后一次有效回复PING 命令的时间超过 down-after-milliseconds 选项所指定 的值, 则这个实例会被 Sentinel 标记为主观下线;

③如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率确认Master的确进入了主观下线状态;

④当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线;

⑤在一般情况下, 每个Sentinel会以每10秒一次的频率向它已知的所有Master,Slave发送INFO命令;

⑥当Master被Sentinel标记为客观下线时,Sentinel向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次;

⑦若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除,若Master重新向Sentinel的PING命令返回有效回复,Master的主观下线状态就会被移除。

悲观锁

执行操作前假设当前的操作肯定(或有很大几率)会被打断(悲观)。基于这个假设,我们在做操作前就会把相关资源锁定,不允许自己执行期间有其他操作干扰。Redis不支持悲观锁。Redis作为缓存服务器使用时,以读操作为主,很少写操作,相应的操作被打断的几率较少。不采用悲观锁是为了防止降低性能。

乐观锁

执行操作前假设当前操作不会被打断(乐观)。基于这个假设,我们在做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。

Redis持久化策略有哪些

RDB和AOF

RDB

在指定的时间间隔内对缓存数据进行快照存储。通过BGSAVE指令来创建出一个子进程创建RDB文件,不会阻塞服务器主进程。

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。 

AOF        

每收到一个写入命令都会通过write函数以增量形式追加到一个日志文件appendonly.aof中。在Redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集。有更高的数据安全性,即使出现宕机现象,也不会破坏日志文件中已经存在的内容

Redis有哪些适合的场景

  • 会话缓存
    • 最常用的一种使用 Redis 的情景是会话缓存
  • 全页缓存
    • 类似PHP本地FPC
  • 对列
    • 是提供list和set操作,这使Redis能作为一个消息队列平台来使用
  • 排行榜/计数器
    • Redis在内存中对数字进行递增或递减的操作实现的非常好,Set和ZSet也使我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫咪老师QAQ

赏一点猫粮叭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值