redis 相关面试题
1. 列举redis 常用的数据类型 和项目中的实际应用
5大常用数据类型:string, list, set, zset, hash
列举:
list 可以用来实现简单的队列消息(仅限简单)
set, zset 可以用来做集合, 交集, 并集, 比如 共同关注等
hash 可以存储具体信息。比如某个用户的用户信息
以自己实际项目为准最好
2. redis 是多线程的吗/redis是线程安全的吗
redis的工作线程(执行命令的线程)是单线程的
在redis6.0版本之后, 处理网络io等, 异步删除等操作是多线程的, 这并不影响 redis的执行命令
所以外部需要我们自己去保证线程安全
所以严格意义上来说 redis 的工作线程 还是单线程进行工作的/内部是线程安全的
3. redis的缓存穿透/雪崩/击穿 等
这几个问题虽然处理方法有所不同,但是本质上都是一样的
场景: redis 作为缓存, db作为数据库, 接口压力都穿过缓存到达db
穿透: 访问一个redis中不存在的数据, 直接到达数据库
通用解决方法: 缓存空对象,并设置过期时间; 布隆过滤器;
说一下方法的缺点:
空对象会占用内存, 如果数据较多 内存浪费严重
短暂的数据不一致, 在空对象过期时间内, 数据可能会出现变化
布隆过滤器存在误判的可能性
数据不一致, 布隆过滤器无法删除数据
雪崩: 大量key在同一时间(短时间)过期
设置过期时间时,末尾加上随机数
缓存击穿: 热点key 过期的瞬时 请求压力
加锁:比如 互斥锁