Redis常见面试题
1. 什么是Redis?
Redis就是一个基于C语言开发的NoSQL数据库,redis的数据是存储在内存之中的速度极快,常用作缓存
什么是NoSQL数据库呢?
简单说就是:不严格遵循传统关系型数据库,没有固定表结构
2. 为什么Redis速度极快?
妙计:单线程内存 的 数据 用 多路IO 协议
基于内存, 速度极其快,内存是纳秒级别,而普通的磁盘只是微秒级别!
单线程无锁竞争,没有线程创建销毁的开销,没有锁的竞争,没有线程阻塞的情况,单线程串行执行,无需处理并发安全问题,只需要接受命令、解析、执行、返回
高效的数据结构,提供多种数据结构,查询能维持 O(1) 复杂度
IO多路复用,为了高并发场景,解决了高并发连接的接入效率,能让单线程能处理上万请求
自研的RESP序列化通信协议,格式简单,解析成本低,带宽占用少,总的来说:降低了CPU的解析开销,减少了网络传输开销
注意!Redis 6.0 + 的多线程,仅用于网络 IO 的请求解析、响应发送环节,核心
3. 为什么要用 Redis?
妙计:功高快
高并发(IO多路复用) 功能丰富(特别多的数据结构) 速度极其快(基于内存)
Redis速度极快
Redis能承受高并发场景: 内存存储提供硬件基础,单线程模型释放 CPU 算力,IO 多路复用承接海量连接,高效数据结构压缩命令耗时,RESP 协议降低全链路开销,五大因素协同,最终实现了极致的高并发吞吐量。
Redis功能丰富: 有各种丰富的数据结构可以实现分布式锁、限流、消息队列、阻塞队列、延迟队列等
说一下redis的丰富应用以及怎么实现的 -^-^
分布式锁: 可以使用 Redis 的 SETNX 命令实现,这个命令的特点是 “不存在才创建”,和锁的互斥特征一致;生产环境推荐直接使用 Redisson 分布式锁。
注意!要使用lua脚本保证原子性操作 创建锁:加锁+锁过期,删除锁:判断是不是自己锁+删锁
阻塞队列/延迟队列: 可以直接使用Redisson封装好的
消费队列: 使用Redis中的Stream类型数据结构
限流: 使用lua脚本+Redis实现限流,或者直接使用Redisson的RRateLimiter
4.为什么使用Redis不使用本地缓存
妙计:久一中立国(g功能)
| Redis | 本地缓存 |
|---|---|
| 持久化的 | 宕机重启直接丢失数据 |
| 独立部署,内存空间更大 | 受限于单台服务器内存 |
| 集中管理 | 分散存储不能共享难以管理 |
| 功能丰富 | 功能有限 |
| 数据一致性有保障 | 多机数据不一致 |
5.那本地缓存有用吗,既然redis这么强大?
降级 热点缓存
本地缓存并不是没用的,本地缓存更多时候是搭配redis实现的,常常用作二级缓存,热点数据缓存允许短暂数据不一致的情况 ,还可以用作本地兜底,雪崩或宕机的时候还可以降级走本地缓存
6.常见的缓存读写策略
1.Cache Aside Pattern(旁路缓存模式):
这种模式是最常用的,适合于读多写少的情况,Redis相当于挂载在数据库上的,读操作先走redis,没有再读数据库重建缓存,而写操作呢是直接操作数据库的
这个写操作对数据库和Redis还是有顺序的:
1.更新数据库
2.删除缓存(如果有的话)
读操作的循序是这样的:
1.查询redis是否有缓存 有缓存直接返回
2.没有缓存读取数据库 重建缓存
你肯定有疑问了为啥"先更新 DB,后删除 Cache,不能反过来吗",这就得从并发角度看了:
1.A线程来写数据 先删除了缓存
2.此刻B线程来了 发现查不到缓存 于是读db重建缓存
3.然后A线程重写完缓存进行更新db
4.更新完毕Db后,此刻数据就不一致了!
可以依靠下图理解:

那么一定靠谱吗先更新DB然后删除缓存?
不是的先更新DB然后删除缓存也会出现并发问题 
如图就在线程一在重建缓存的时候被偷家了!
按时真实情况很少 因为这个db到重建缓存超级短,发生概率很低很低
2.读写穿透模式:
读写穿透就是,完全把redis当成中间代理层了 任何事先redis干然后DB干 注意此处DB已经完全隐藏 任何都是redis在干

3.异步写入模式:
和读写穿透很想 读写穿透是redis同时同步更新Db
异步读写是异步来更新Db

7.Redis数据类型
五种基础类型+四种特殊类型
基本数据类型:
String,set,list,hash,zset
特殊类型:
bitmap, hyperloglog, geopatial,stream
各自的引用场景?
1.String:最常用的数据结构,缓存对象,计数的,分布式锁,共享session
2.list:消息队列
3.hash:存储对象、购物车,存键值对等
4.set:能聚合运算,唯一的String,共同关注,点赞,连续签到
5.zset:有序的set,用作排行榜等
6.GEO:计算经纬之间距离的
7.BitMap:二进制,用于连续签到
8.Stream:消息队列,比list多:自动生成全局唯一消息ID,致辞Group消费
9.hyperloglog:百万级计数统统计,UV统计
各数据结构的使用:
TODO:二次复习时会做