Redis
2023-03-18 22:05:57 34 举报
AI智能生成
Redis总结
作者其他创作
大纲/内容
Redis 过期键的删除策略
惰性删除
定期删除
内存淘汰策略
不淘汰
noeviction (v4.0后默认的)
当内存使用超过配置的时候会返回错误,不会驱逐任何键
对设置了过期时间的数据中进行淘汰
volatile-random
加入键的时候如果过限,从过期键的集合中随机驱逐
volatile-ttl
从配置了过期时间的键中驱逐马上就要过期的键
volatile-lru
加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
volatile-lfu
从所有配置了过期时间的键中驱逐使用频率最少的键
全部数据进行淘汰
allkeys-random
加入键的时候如果过限,从所有key随机删除
allkeys-lru
加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
allkeys-lfu
从所有键中驱逐使用频率最少的键
Redis如何做内存优化
缩减键值对象: 缩减键(key)和值(value)的长度
共享对象池
字符串优化
编码优化
控制key的数量
redis事务
相关命令
MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列
EXEC:执行事务中的所有操作命令。
DISCARD:取消事务,放弃执行事务块中的所有命令。
WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。
UNWATCH:取消WATCH对所有key的监视。
事务中出现错误的处理
语法错误(编译器错误)
回滚
Redis类型错误(运行时错误)
不回滚
Redis集群
主从同步/复制
主从复制的作用
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
Redis 全量复制的三个阶段
第一阶段是主从库间建立连接、协商同步的过程
第二阶段,主库将所有数据同步给从库
第三个阶段,主库会把第二阶段执行过程中新收到的写命令,再发送给从库
Redis 增量复制的流程
repl_backlog_buffer
replication buffer
Redis 为什么主从全量复制使用RDB而不使用AOF
RDB文件小,AOF文件大,传输RDB降低主库网络带宽的消耗
RDB文件存储的都是二进制数据,从库直接按照RDB协议解析还原数据即可,速度会非常快,而AOF需要依次重放每个写命令,这个过程会经历冗长的处理逻辑,恢复速度相比RDB会慢得多
使用AOF做全量复制,意味着必须打开AOF功能,打开AOF就要选择文件刷盘的策略,选择不当会严重影响Redis性能
哨兵模式
哨兵实现了什么功能
监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
配置提供者(Configuration provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
通知(Notification):哨兵可以将故障转移的结果发送给客户端。
Redis 哨兵集群是通过什么方式组建的
哨兵实例之间可以相互发现,要归功于 Redis 提供的 pub/sub 机制,也就是发布 / 订阅机制。
Redis 哨兵的选举机制
分布式算法 - Raft算法
Cluster群集
集群的作用
数据分区,突破了 Redis 单机内存大小的限制,存储容量大大增加,每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力
高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似) ;当任一节点发生故障时,集群仍然可以对外提供服务
集群模式的数据分片
Redis集群引入了哈希槽的概念
Redis集群有 16384 个哈希槽( 编号0-16383)
集群的每个节点负责一部分哈希槽
每个Key 通过 CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
集群模式的主从复制模型
Redis缓存有哪些问题,如何解决
缓存穿透
缓存穿击
缓存雪崩
Redis6.0为什么要引入多线程
可以充分利用服务器 CPU 资源,目前主线程只能利用一个核
多线程任务可以分摊 Redis 同步 IO 读写负荷
为什么用Redis
读写性能优异
数据类型丰富
Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
原子性
Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性
Redis支持 publish/subscribe, 通知, key 过期等特性。
持久化
Redis支持RDB, AOF等持久化方式
发布订阅
Redis支持发布/订阅模式
分布式
为什么Redis 是单线程的以及为什么这么快
redis完全基于内存,绝大部分请求是纯粹的内存操作
数据结构简单,对数据操作也简单
采用单线程模型, 避免了不必要的上下文切换和竞争条件, 也不存在多线程或者多线程切换而消耗CPU, 不用考虑各种锁的问题, 不存在加锁, 释放锁的操作, 没有因为可能出现死锁而导致性能消耗
使用了多路IO复用模型,非阻塞IO
使用底层模型不同,它们之间底层实现方式及与客户端之间的 通信的应用协议不一样,Redis直接构建了自己的VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
Redis 一般有哪些使用场景
热点数据的缓存
限时业务的运用
计数器相关问题
分布式锁
Redis 五大数据类型
String
结构存储的值
可以是字符串、整数或浮点数
结构的读写能力
对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;
Hash
结构存储的值
包含键值对的无序散列表
结构的读写能力
包含方法有添加、获取、删除单个元素
List
结构存储的值
一个链表,链表上的每个节点都包含一个字符串
结构的读写能力
对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;
Set
结构存储的值
包含字符串的无序集合
结构的读写能力
字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等
Zset
结构存储的值
和散列一样,用于存储键值对
结构的读写能力
字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素
三种特殊的数据类型
HyperLogLogs(基数统计)
Bitmaps (位图)
geospatial (地理位置)
谈
谈
Redis 的对象机制(redisObject)
Redis 的持久化机制
RDB(默认)
触发方式
手动触发
save命令
bgsave命令
自动触发
AOF
Always:同步写回:每个写命令执行完,立马同步地将日志写回磁盘
Everysec,每秒写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘
No,操作系统控制的写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。
混合
0 条评论
下一页