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