Redis
2020-10-15 16:56:19 0 举报
AI智能生成
redis高频面试题
作者其他创作
大纲/内容
Memcache
缺点
key容量:250字节
value容量:1M字节
key的有效期:30天
不支持数据持久化,以及主从同步
只支持k-v结构
底层实现
大量的hash表存储
简介
支持数据持久化
主从同步机制
Cluster
哨兵
Redis Cluster
基于服务器分片
高可用
持久化
RDB
一个紧凑的压缩(LZF算法)二进制文件,类似快照,适合做备份,全量的复制场景
无法做到持久化/秒级持久化
AOF
通过文本日志的记录方式记录每一个redis的写入或删除操作
执行过程
文件写入
命令追加
写实复制
Huge Page机制
AOF重写不复用AOF本身的日志
文本协议
文件同步
everysec
no
write
fsync
always
工作原理
事务
命令
事务开始(multi)
命令入队
事务执行EXEC
事务销毁discard
exec
watch
multi
重写机制
支持事务类型
一致性
隔离性
单线程(非阻塞的异步io),性能好
数据结构多样化(string、list、set、sorted set、hash)
Lua
使用方法
Bitmap
客户心态记录(setbit)
百万用户在线状态(BITCOUNT)
千万消费者数据去重(zset)
HyperLogLog
Geospatial
pub/sub
Popeline
致命问题
缓存雪崩
场景
大量热点key同一时间失效,全部请求到数据库
redis服务器挂了
解决方案
redis cluster
错开设置key的过期时间
缓存击穿
场景
查询同一条数据,在缓存中查不到,就大量去数据库查(过期key)
解决方案
redis分布式锁
缓存穿透
场景
查询不存在的数据,导致大量请求到数据库(比如查询不存在的id)
解决方案
缓存数据库结果空对象(解决的是一个key多次访问的问题)会导致redis很多null数据
boolean filter
应用
redis缓存穿透
去重
原理
put
通过哈希函数计算哈希值,得出哈希值
在哈希值中,将对应坐标下的值改为1
是否存在
通过该值计算出哈希值
根据给定的值计算出相同的哈希,找出对应的下标的值,如果值为1,则表示该值存在,如果有一个值不为1,则该值不存在
底层
位数组
哈希函数
缺点
误差率
无法删除
手写实现要求
子主题
数据一致性
场景
先更新数据库,在更新redis缓存(redis缓存数据不一致)
删除缓存,更新数据库
解决方案
Design Pattern
Cache aside pattern
读的时候,先读缓存,缓存没有的化,再读数据库,然后取出数据缓存,同时返回响应
更新的时候,先更新数据库,再删除缓存
Read through
Write through
Write behind caching
延迟双删
串行化(数据强一致性)
缺点:并发高了,容易阻塞,而且吞吐量大幅度降低
缓存降级
互斥锁更新
布隆过滤器
缓存
本地缓存
性能好
减少访问开销
使用场景
统计
独立的数据
分布式缓存
扩展性好
数据一致性
读写分离,高并发,高可用
多级缓存
访问频率高的热点数据使用本地缓存
其它热点数据使用分布式缓存
淘汰策略
allkeys-lur
allkeys-random
volatitle-lur
volatitle-random
volatitle-ttl
删除策略
被动删除
主动删除
达到maxmemory时删除
基础数据类型
String
实现(SDS):类似ArrayList
应用场景
缓存
计数器
共享session
List
实现
应用场景
分页查询
lrange(?,?):从第几个数-倒数第几个数
列表数据结构
消息队列
set
实现:无序自动去重
应用场景
交集
并集
差集
sortd set
实现:跳跃表
应用场景
类似set集合
排行榜
有权重的队列
score存储当前时间戳加延迟时间戳
key:内容
zadd:生产消息
zrangbyscore:取数据时比较当前时间戳
hash
实现:类似于Map;但是,存储类似Object对象,只能嵌套一层
应用场景
0 条评论
下一页