Redis整理
2021-03-08 13:41:32 15 举报
AI智能生成
个人知识总结
作者其他创作
大纲/内容
支持的类型
String
字符类型
get
set
append
数值类型
incr(不接触数据库)
1.做秒杀系统,设置一个最大值,当操作达到临界点,之后的请求可以直接拒绝操作
2.点赞系统
bitmaps
位图,大量数据存储
存储2^20个数据,有是1,无是0
语句
setbit
bitcount
bitop
bitpos
hashs
适用于存储对象
list
栈
队列
数组
阻塞,单播队列(FIFO)
set
无序,随机
随机事件
SRANDMEMBER操作
正数:取出不含重复的结果集(不会超过已有集)
负数:取出重复的结果集
正数:取出不含重复的结果集(不会超过已有集)
负数:取出重复的结果集
子主题
子主题
spop,q取出一个操作
sorted set
用处:设置权重打分等操作
跳表(简单就是建立多个索引集合,以空间换时间操作)
平衡二叉树(AVL树)
左子树的节点深度和右子树节点深度不能相差1
查找速度差不多是O(logn),但是插入和删除节点的时候,需要不停的进行旋转操作达到平衡,增加IO次数
红黑树(特性)
1.根节点只能是黑色
2.叶子节点(NIL)只能是黑色
3.每个节点要么是黑色,要么是红色
4.如果一个节点是红色,那么他的子节点一定是红色
5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]
平衡方式基于AVL树之上多了对节点变色的操作,可以降低IO次数
内存淘汰策略
LRU
最近未被使用过
TTL
有过期时间的,按照过期时间清理
random
随机清除(不推荐)
noeviction
当内存不足以支持写入数据时,就会进行报错
过期键删除问题
定时过期
每个key都会有一个专门的定时器,当ttl到期则直接将key删除,该模式对内存友好,但是对极大增加cpu的损耗,影响响应时间和吞吐量
惰性过期
当访问到这个key的时候,我们才会判断key值是否已经过期。对内存不友好,极端情况是大量key值不被访问,内存白白的被浪费掉了
定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。(每隔100ms部分key检查一次)
(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)
Redis中同时使用了惰性过期和定期过期两种过期策略。
(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)
Redis中同时使用了惰性过期和定期过期两种过期策略。
服务拓展
AKF原则
X轴相当于扩展多台机器实现:主主,主从,主备模式
Y轴相当于基于业务进行拆分,比如订单系统,客户系统
Z轴相当于在Y轴基础之上,对每个系统里涉及到的数据业务进行拆分,比如:北京,上海,广州等可以拆分三台数据服务器
集群
目的
达到线性可扩展性、可用性、数据一致性
解决读写分离以及支持更多的负载
模式
主从模式
主数据库负责读写操作,从数据库负责读操作,定时接收主数据库发送过来的备份文件
一个master可以有多个slave,但是slave只能有一个
slave挂了,并不会影响到别的服务,重新启动之后再重新接收master的数据
master挂了,不会影响到slave的读,但是关闭了写入的功能
master挂了,slave不会进行选举机制重新选择master
Sentinel(哨兵模式),解决主机挂了,备机升级为master
采用奇数
一般至少三个哨兵进行监控
特点及作用
master挂了之后,会立马进行master切换,成功之后会将配置文件告知给其余的slave并且进行修改,原先的master将会降级为slave
多哨兵之间会形成一个集群,并且进行监控。多哨兵可以监听不同的redis,也可以监听同一个redis
工作原理
1.每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
2.如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
3.如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
4.当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
5.在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
6.当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
7.若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
Cluster模式
目的
当数据量达到一定程度时,必须对其进行动态扩容,上述模式已经无法满足
特点
最小配置为6台(三主三从),其中主节点做读写操作,从节点不对外提供任何服务,只为提供故障转移
分片规则
1.所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
2.Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中
优点
1.数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布;
2.部分节点不可用时,集群仍可用。通过增加 Slave 做 standby 数据副本,能够实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升
缺点
1,。节点会因为某些原因发生阻塞(阻塞时间大于 clutser-node-timeout),被判断下线,这种 failover 是没有必要的。
2.数据通过异步复制,不保证数据的强一致性
基本介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
持久化操作
RDB模式(默认)
原理
定时的创建一个fork子进程将内存数据写入到一个临时文件中,如果写入成功,就覆盖之前的持久化文件
弊端
如果在定时之前,服务器突然宕机,那么它将无法恢复数据
数据备份较大时,则会出现短暂的服务停顿现象
优点
因为备份全交由子进程操作,所以IO次数少
操作
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
AOF模式
原理
通过日志操作记录每一次的增加,删除操作。每次都是在日志文件中进行append操作
优势
日志文件结构清晰
即使服务宕机,也不会丢失之前已经存在的记录
劣势
IO写入次数多
恢复速度慢
操作
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
事务
一个redis事务中,如果一条命令执行失败,这条命令不会执行,后续命令继续操作。如果服务宕机了,操作失败,并不支持回滚机制
redis集群事务支持性很差,key会在不同的节点上,但是可以通过三方插件执行
如何保证数据库与redis的双写一致性
读数据先读缓存,之后差找不到在查找数据库
写入数据时,把key值删除掉,之后在写入数据库
缓存异常问题
缓存击穿
某些key经常被访问,当其失效时,直接大并发的请求数据库
使用分布式锁
setnx操作
缓存穿透
某些数据在数据库里查询不到,这样在缓存里也不会有
允许redis空值存储
缓存雪崩
意思就是大面积的key值失效
分散key的过期时间,给某个key的缓存时间加一个随机值
缓存降级
资源不够时,优先给核心资源,意思就是设置不同的熔断机制
为什么读取这么快
相较于磁盘读取,redis采用的是数据存放在内存中
网络IO模型(之后更新)
0 条评论
下一页