Redis内存key-value缓存数据库
2021-11-21 16:33:24 14 举报
AI智能生成
Redis面试知识点
作者其他创作
大纲/内容
消息队列
发布订阅
订阅者存放在一个链表中,发布者发布消息后,根据频道的key推送给该频道的订阅者
和memcache相比
memcache
多线程,非阻塞IO
支持的数据类型只有String
依靠客户端分片写入数据实现集群
支持value: 1MB
redis
单线程多路IO复用
持久性
支持value: 512MB
和jedis,redission相比
jedis
原生redis命令,springboot3 已弃用
redission
命令更抽象,让程序员专注于业务逻辑
支持的数据类型更多
数据库
数据结构
String
存储简单字符串,json对象,计数器,session共享
int
empstr
raw
List
有序可重复,是个双端队列,可做消息队列,分页查询
linkedlist
ziplist
Set
无序不重复,可左交并差集,用在共同关注,网站uv
dict
intset
ZSet
用score排序,可做排行榜
ziplist
dict
skip
Hash
value为<key,value>,存对象,适合一key多value
ziplist
dict
Geo
和地理位置相关,用于计算距离,共享位置
Hyperloglog
基数,用于求不重复的元素个数,可用作
BitMap
存01二值,可用于统计打卡
事务
原子性
事务不保证原子性
一条命令执行错误,其他命令正常执行
一条命令在编译时出错,所有命令都不执行
命令原子性
muli开启事务,将命令放入队列,exec执行所有命令,discard放弃事务
怎么保证原子性
分布式锁
setnx expeir
内存
内存的好处
读写快速
内存放不下怎么办
设置过期时间
setex key seconds value
删除
定期删除
每隔默认100s随机检查设置了过期时间的key,若已过期则删除
惰性删除
访问key时才检查是否过期,过期则删除更新
出现的问题:会有过期了的key一直存在,不保证一定能删除缓存,导致内存越来越高
内存淘汰机制
volatile-LRU
Least Recently used 在设置过期时间的key中,删除最近最少使用
volatile-TTL
Time To Live 在设置过期时间的key中,删除剩余存活时间最短的key
volatile-random
allkeys-random
allkeys-LRU
在所有key中LRU
allkeys-TTL
在所有key中TTL
no-enviction
不做删除操作,新写入操作报错
冷热数据分离
热数据经常访问,放在内存中,冷数据写入磁盘
用VM实现
内存断电即失
持久化
RDB
redis database,fork一个子进程,从父进程中同步复制数据,保存快照,持久化结束后,将快炸保存成dump.rdb文件,释放内存
多长时间内至多操作多少次就会保存,可能会损失最后一次的数据
AOF
append only module, fork一个子进程,保存写操作
同步方式:1s,每次操作,不同步,可能会丢掉1s的数据
AOF重写
执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓存区,该缓冲区会在子进程创建新AOF期间记录所有写命令,
子进程完成创建AOF后,服务器将缓冲区的所有内容追加到新AOF末尾
子进程完成创建AOF后,服务器将缓冲区的所有内容追加到新AOF末尾
RDB和AOF混合使用
会优先使用AOF,rdb数据会写入aof文件头部
高并发
集群
主从复制
读写分离,主机读写,从机从主机中同步复制数据,只读。一主多从,主机宕机后,需要手动更改ip确定新的主机
主要是为了高并发,缺点是难扩容,整个集群的容量受限于某台机器内存容量
哨兵模式
多个哨兵监控主库,超过指定数量个哨兵发现主库不回应,就投票选举新的主库
投票算法
保证了集群的高可用,但仍有容量上限问题
Cluster
多主多从,key通过CRC16算法,结果对应0~16383之间的哈希槽,将数据放到对应的哈希槽,
不同的key分散到不同的主节点上,每个主节点管辖一定的槽位
不同的key分散到不同的主节点上,每个主节点管辖一定的槽位
保证了高扩展,适用于数据量大,需要持续扩容
缓存
为什么能做缓存
读写速度快,减轻数据库压力,提高性能
怎么做缓存
放在请求访问和数据库之间,先操作缓存中的数据,
若缓存中不存在,则从数据库读取返回并更新至缓存中
若缓存中不存在,则从数据库读取返回并更新至缓存中
缓存问题
缓存击穿
访问数据库中不存在的数据,会不断访问数据库
缓存空对象
访问数据库结果为不存在时,将返回空值,保存到缓存中,设置过期时间。
缺点:空对象浪费空间;缓存层和存储层存在一致性问题
缺点:空对象浪费空间;缓存层和存储层存在一致性问题
加过滤器
预先将所有可能存在的数据存到BitMap,用布隆过滤器进行校验,一定不存在的会被拦截
缓存穿透
缓存中某一热点数据失效,同一时间大量请求直接到了数据库
设置合理的过期时间(永不过期)
缓存雪崩
同一时间大面积缓存失效
事前保证集群高可用
本地ehcache缓存+hystrix限流降级,通过加锁或队列空值写操作的线程数量
将不同数据的缓存时间设置的分散些
事后持久化机制,尽快恢复数据
缓存刚开始为空,大量请求涌入数据库
缓存预热,提前将可能会访问的数据加载到缓存中
缓存降级,保留核心业务的功能
缓存和数据库双写出现一致性问题解决方法
预留缓存,写操作时会先删除缓存中的数据,再写入数据库,缓存再从数据库中拿数据
读写串行化
并发读写
单库
一致性问题:A删除了缓存还没写入数据库,B读缓存没有该数据,就从数据库中读取了,
之后A才完成写入数据库,B读到的就是脏数据
之后A才完成写入数据库,B读到的就是脏数据
根本原因:逻辑处理消耗1s
主从
一致性问题:A写入主库,从库还没来得及更新,B从从库中取出了脏数据之后从库才更新新的数据
根本原因:主从同步延时1s
0 条评论
下一页
为你推荐
查看更多