Redis 面试
Redis 常用的数据类型有哪些
String
描述:最基本的数据类型,可以存储字符串、整数或浮点数
使用场景:
- 缓存简单的键值对。
- 计数器,比如 (文章点赞数量)
常用命令:
set key value
:设置键值对get key
:获取键对应的值incr key
: 键的值+1(只适用于整数 , 比如计数器)decr key
:键的值 -1
Hash
描述:用于存储对象集合,key - value 结构
使用场景:
- 存储用户信息(比如 id 为将键,用户信息为 value )
常用命令:
hset key field value
:设置哈希字段的值hget key field
:获取哈希字段的值hgetall key
:获取哈希中所有的字段和值hdel key field
:删除哈希中的字符。
List
描述:有序字符串列表,支持从头部或者尾部插入和删除(可以实现栈和队列的效果)
常用场景:
- 消息队列(如任务队列)。
- 最新消息列表(如最新10条评论)。
常用命令:
LPUSH key value
:从列表头部插入元素。RPUSH key value
:从列表尾部插入元素。LPOP key
:从列表头部弹出元素。RPOP key
:从列表尾部弹出元素。LRANGE key start stop
:获取列表范围内的元素。
Set
描述:无序且唯一的字符串集合,支持交集、并集、差集等操作。
常用场景:
- 标签系统(如文章的标签)。
- 去重数据存储。
常用命令:
SADD key member
:向集合中添加元素。SREM key member
:从集合中移除元素。SMEMBERS key
:获取集合中的所有元素。SINTER key1 key2
:获取多个集合的交集。
SortedSet
描述:类似于 Set ,但是每一个元素关联一个分数(score),元素按照分数进行排序。
常用场景:
- 排行榜(如用户积分排名)。
- 带权重的任务队列。
常用命令:
ZADD key score member
:向有序集合中添加元素。ZREM key member
:从有序集合中移除元素。ZRANGE key start stop
:按分数范围获取元素。ZREVRANGE key start stop
:按分数范围逆序获取元素。
Bitmap(位图)
描述:基于 String类型的位操作,可以看做一个位数组
常用场景:
- 用户签到记录。
- 布尔统计(如用户是否在线)。
常用命令:
SETBIT key offset value
:设置位的值(0或1)。GETBIT key offset
:获取位的值。BITCOUNT key
:统计值为1的位数。
Redis 缓存问题
面试官问题:我看的项目中都使用到了Redis ,你在最近的项目中哪些场景使用了 Redis 呢?
答:我在失物认领的项目中,主要使用的 Redis 的缓存功能,比如:在该项目中有个关于物品分类的数据, 这些数据一般在项目开始的时候都会设计好,一般不会发生大的改变了,因此我将物品分类数据都进行缓存。
面试官:Redis 缓存有三大问题,你知道么?
答:知道,缓存穿透、缓存击穿、缓存雪崩。
缓存穿透:
- 场景:查询不存在的数据(如恶意攻击)。
- 解决:
- 缓存空值:短期缓存无效 Key(如 5 分钟)。
- 布隆过滤器:拦截非法请求,需注意误判率和空间占用。
缓存击穿:
- 场景:热点 Key 过期后,瞬时高并发请求直达数据库。
- 解决:
- 互斥锁:一个线程重建缓存,其他线程等待。
- 逻辑过期:key 不设计过期时间,在 value 中设置过期时间,到了过期时间,异步重建缓存。
缓存雪崩:
- 场景:大量 Key 同时过期或 Redis 宕机。
- 解决:
- 随机 TTL:为 Key 设置基础过期时间 + 随机时间。
- 集群高可用:哨兵模式自动故障转移,集群模式分散压力。
- 限流降级:通过熔断机制保护数据库。
布隆过滤器
面试官:你说到了布隆过滤器,你知道布隆过滤器怎么实现的吗?
答:嗯,布隆过滤的作用就拦截一些不存在的数据,不用再查询Redis和数据库了。布隆过滤器基于一个大型位数组和多个哈希函数。写入时,对 Key 进行多次哈希,将对应位设为 1;查询时,若所有哈希位均为 1,则 Key 可能存在(可能有误判),否则一定不存在。优点是空间效率高,缺点存在误判率。
License:
CC BY 4.0