Redis面试宝典12道法

Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库

1. 谈下你对 Redis 的了解?

三点:

  • 为什么要引入

一般用mysql,oracle,由于数据库持久化数据主要是面向磁盘,而磁盘的读写比较慢,一般的管理系统上,由于不存在,因此没有需要瞬间读写大量数据的要求,这时候传统数据库是没有问题的。但是如果面对一个高并发的场景,比如抢票、发红包等,或者是主页访问量瞬间比较大的时候,一瞬间会有成千上问的请求的到来高并发,需要系统在极短的时间内完成成千上万次的读写操作。这时候数据库根本承受不来,很容易造成数据库系统的瘫痪,最终导致服务器宕机。

为了解决这个问题,我们可以引入nosql技术。nosql也是一种数据库,它是基于内存的,并提供一定的持久化功能。redis和mongodb是当前使用最广泛的nosql技术。

  • 是什么?

Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人用C语言所创

redis不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久化支持

redis支持丰富的数据类型,包括string、list、set、zset、hash等多种数据结构,因此它也被称为【数据结构服务器

redis支持主从同步,即master-slave主从复制模式。数据可以从主服务器向任意数量的从服务器上同步,有效的保证数据的安全性

Redis 支持多种编程语言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言。

与SQL型数据不同,redis没有提供新建数据库的操作,因为它自带了16(0-15)个数据库(默认使用0库)。在同一个库中,key是唯一存在的、不允许重复的,它就像一把“密钥”,只能打开一把“锁”。键值存储的本质就是使用key来标识value,当想要检索value时,必须使用与value对应的key进行查找

  • redis架构

客户端和服务端可以位于同一台计算机上,也可以位于不同的计算机上。服务端是整个架构的“大脑”,能够把数据存储到内存中,并且起到管理数据的作用 .Redis 基于内存来实现数据的存储,因此其速度非常快。但是我们知道,计算机的内存是非常珍贵的资源,所以 Redis 不适合存储较大的文件或者二进制数据,否则会出现错误,Redis 适合存储较小的文本信息。理论上 Redis 的每个 key、value 的大小不超过 512 MB

2. Redis 一般都有哪些使用场景?

3. Redis 有哪些常见的功能?

  • 哨兵(sentinel)和复制(replication)
  • 事务
  • LUA脚本
  • 持久化(Persistence)
  • 集群(Cluster)

4. Redis 支持的数据类型有哪些?

  • string(字符串)
  • hash(哈希散列)
  • list(列表)
  • set(集合)
  • zset(sorted set:有序集合)
  • HyperLogLog 类型(来统计一个集合中不重复的元素个数)
  • Redis 5.0 提供的 Stream(支持消息队列)

注意:这里指的数据类型是 Value(值) 的数据类型,而非 key。

5. Redis 为什么这么快? 

  • Redis 是一款纯内存结构,避免了磁盘 I/O 等耗时操作。
  • Redis 命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。
  • 采用了 I/O 多路复用机制,大大提升了并发效率。
  • 高效的数据结构(简单动态字符串、内存重新分配、双端链表等)
  • 底层模型不同,Redis并没有使用OS提供的Swap,而是自己实现构建了VM的工作机制。

6. 什么是缓存穿透?怎么解决?

如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。

解决方式:

  • 把空对象缓存起来。当第一次从数据库中查询出来的结果为空时,我们就将这个空对象加载到缓存,并设置合理的过期时间,这样,就能够在一定程度上保障后端数据库的安全
  • 第二种解决缓存穿透问题的解决方案:就是使用布隆过滤器

7. 什么是缓存雪崩?该如何解决?

如果在某一时刻缓存集中失效,或者缓存系统出现故障,所有的并发流量就会直接到达数据库。

解决方式:

  • 保证 Redis 的高可用。
  • 使用限流降级的方式防止缓存雪崩。
  • 通过数据预热的方式将可能大量访问的数据加载到缓存,在即将发生大并发访问的时候,提前手动触发加载不同的数据到缓存中,并为数据设置不同的过期时间,让缓存失效的时间点尽量均匀,不至于在同一时刻全部失效。

8. 怎么保证缓存和数据库数据的一致性?CAP理论?

  • 双清延迟清理策略:数据变化前和后都进行缓存清理,事务完成后再次清理。也可以最后监听binlog,再把数据刷入缓存中。
  • 队列清理,mq中间件接入redis,这样做小型系统能支撑业务并发,大型系统会产生较高延迟,影响使用。

9. Redis 持久化有几种方式?

由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化:

  • RDB快照持久化:

时间间隔内将内存的数据集快照写到磁盘。恢复快,节省数据空间,但是当redis故障,仍会丢失部分数据

命令:

BGSAVE:Redis会调用fork来创建一个子进程,然后子进程负责将所有数据的快照写入硬盘,而父进程则继续处理命令请求。

save 60 10000:Redis最近一次创建快照之后开始算起,当“60秒之内有10000次写入”这个条件被满足时,Redis就会自动触发BGSAVE命令

  • AOF(append only file)持久化

AOF持久化 的实时性更好,原理是将Redis的操作日志以追加的方式写入文件,但是不加以控制的话,AOF文件的体积可能会比快照文件大好几倍,恢复慢,可以通过冗余命令(BGREWRITEAOF)来重写(rewrite)AOF文件来减小AOF文件的体积

参数:

appendonly yes 开关

appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度

appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘

appendfsync no #让操作系统决定何时进行同步

10. Redis 怎么实现分布式锁?

  • 使用MySQL,基于唯一索引。
  • 使用ZooKeeper,基于临时有序节点。
  • 使用Redis,基于setnx命令

加锁:使用setnx key value命令,如果key不存在,设置value(加锁成功)。如果已经存在lock(也就是有客户端持有锁了),则设置失败(加锁失败)。

解锁:使用del命令,通过删除键值释放锁。释放锁之后,其他客户端可以通过setnx命令进行加锁

1.防止死锁:要有个超时的机制,在设置key的值时,需要加上有效时间,如果有效时间过期了,就会自动失效,就不会出现死锁。

2.支持可重入锁:加锁成功后使用hset命令value=1,使用hincrby自增,解锁时,先判断可重复次数是否大于0,大于0则减一,否则删除键值,释放锁资源

3.加锁失败后阻塞等待,等锁释放后再次尝试加锁

11. Redis 淘汰策略有哪些?

在Redis中,允许用户设置最大使用内存大小server.maxmemory,当Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

  • volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰
  • volatile-ttr:从已设置过期的数据集中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期的数据集中任意挑选数据淘汰
  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集中任意挑选数据淘汰
  • noenviction:禁止淘汰数据

redis淘汰数据时还会同步到aof

12. Redis 常见性能问题和解决方案?

  • Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
  • 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
  • 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内,尽量避免在压力很大的主库上增加从库
  • Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
  • 为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master
  • redis并发问题可以使用分布式锁
  • redis持久化数据和缓存可以通过集群模式扩容

番外篇

混合持久化方式

Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。

redis和memcached比较

  • memcached所有的值都是简单的字符串,redis支持更多的数据类型
  • redis速度比memcached快很多
  • redis可以持久化数据
  • redis支持数据备份,即master-slave模式的数据备份

QPS和TPS

  • QPS:应用系统每秒钟最大能接受的用户访问量
  • TPS:每秒钟最大能处理的请求数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值