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