Redis知识点
2021-05-29 14:39:34 0 举报
Redis知识点
作者其他创作
大纲/内容
子进程执行数据持久化(I/O操作)
新节点
1
MULTI
redis
删除节点
data
磁盘
特点
RDB快照
set
3
sentinel
扩容/缩容条件
哨兵模式
数据结构
0
交换信息channel(ping info)
headtaillencount
字符串
没挂啊
10实际上并不存在,这就布隆过滤器的误判
随机生成抽奖验证码
写操作
底层存储(redis object encoding命令可查看你当前key的存储结构类型)
1.获取字符串长度O(1)2.高效追加字符串操作3.二进制安全4.空间分配原则
无序去重集合操作
对老数据友好,为了防止老数据一直不被淘汰,有衰减机制,逐渐减少使用次数,新数据每次进入都放入末尾,容易被淘汰
repl写操作buff
intset
dict(hashtable底层实现)
基本命令
存储数量小于512值小于64字节
同步数据
master选择策略
原子性一致性隔离性(单线程)持久性
DISCARD
优点:查询速度快O(1)缺点:消耗更多的内存空间
对字典的添加、删除、查找、或更新操作时,都会判断是否正在进行rehash操作,如果是,则顺带进行单步rehash,并将rehashidx+1
force
可修改
client
发送增量命令repl
linux 内核
6
hash
1G文件
1.noeviction(内存不足,写入失败,不进行淘汰)2.allkeys-lru(所有键最近最长未使用)3.allkeys-random(所有键随机最近最长未使用)4.volatile-lru(过期键最近最长未使用)5volatile-random(过期键随机最近最长未使用)6volatile-ttl(即将过期键)7.allkeys-lfu(所有键最少使用)8.volatile-lfu(过期键最少使用)获取一批数据进行淘汰机制,并不是所有数据都进行淘汰
记录主节点信息清除历史数据,同步RDB数据
100
2
zl
4
content(数据内容)
struct { len buf // 字符串长度 free buf[] // 未使用的缓冲区长度 buf[] // 存储的数据内容}
项目中的session
R fd1
Redis的数据库就是使用字典作为底层实现的,通过key和value的键值对形式,代表了数据库中全部数据。而且,所有对数据库的增、删、查、改的命令,都是建立在对字典的操作上。
set 4
ziplist linkedlistquicklist(3.2版本后)
故障场景
用户态
作用
写
slave3
client1
if get lockkey == random {del lockkey}
ziplist
存在
master
文件查找必然会进行全量扫描
nio操作慢,安全性高,一致性降低
buff缓冲区,刷写,每秒钟一次(默认)
hash处理
int16 2Bint32 4Bint64 8B
9
确保每个哨兵都正常,彼此会发送ping信息交流在channel
write
redis单线程处理任务
结构
skiplist
选择步骤:1. 过滤连接失败2.过滤响应时间慢的3.过滤与master断开久的优先原则:1.优先级2.offset3.runId
监控/故障转移
晶振(时间中断)
struct dict { dictType *type; //指向dictType结构,dictType结构中包含自定义的函数,这些函数使得key和value能够存储任何类型的数据。 void *privdata; //私有数据,保存着dictType结构中函数的参数。 dictht ht[2]; //两张哈希表。 long rehashidx; //rehash的标记,rehashidx==-1,表示没在进行rehash int iterators; //正在迭代的迭代器数量}
get/set 2
Redis 集群的键空间被分割为 16384 hash个槽(slot), 集群的最大节点数量也是 16384 个
执行EXEC之前的操作都能回滚,清空命令队列
每次操作,追加日志
优点:1。数据有序,二分查找O(logn)缺点:1.插入不同类型int会将元素set全部进行转换
主从模式
1。内存操作2.非阻塞io多路复用3.单线程操作,减少线程切换的开销
sentinel选择策略
应用场景
优点:1.插入快O(logn)缺点:1. 内存空间大特点:随机建层(每次插入元素后会重新建层,每一层建立都是随机的)层高有限制,最高是64层
(dirt)hashtableintset
检测客户端flag属性如果不支持执行失败回归,队列任务FIFO顺序执行,执行过程中失败不支持回滚
sentinelStat(当前节点信息)master(所有主库信息)slave(所有从库信息)sentinel(所有哨兵信息)
客户端flag属性中打开:REDIS_MULTI
10
单点故障
repl比较,将增量命令发送
zltail(首位地址偏移量)
cpu
ziplistdirct(底层hashtable)
增量同步(网络异常)
存入
LRU
其它哨兵收到master挂的消息,自己也请求确认
不存在
网络断开
可转换
encoding(节点类型,长度)
fork
linkedlist
slave6
基于Reactor 模式开发的网络事件处理器
加入新节点,依照特性,数据应该存储到指定方向的第一个节点内,所以迁移让部分数据复制到新节点
cmd通道,info传递
false
zlend(0xEF标识末端)
1.惰性淘汰(当访问数据时判断是否过期进行淘汰)2.定期淘汰 (每个时间内,随机抽取指定数量key,进行判断是否过期) 时间和数量可配置
按时间排序的评论列表(支持分页)
可以使用多个hash处理生成多个hash值校验,降低误差率
使用io,快,缓冲区buff可能丢失一个buff数据
确实挂了
发送Psync信号 -1,表示新节点
字符串对象文件
ziplistskiplist
os缓存区刷写一个buff
二进制安全
压力
5
headtaillen
请求失败,master挂了
AOF文件过大会执行重写逻辑bgrewriteaof旧版本AOF日志是全量日志(恢复慢)新版本redis 4.0的AOF日志内容是 RDB快照 + 增量aof日志实现数据恢复(结合两者各自的优点)eg:先将8点的RDB快照写入aof日志文件中,再将8点后的增量日志写入文件
定期存储快照,重启恢复 => 恢复快,丢失部分数据
排行榜(分页动态[通过score进行分页])
redis cluster(服务的分片)
2亿用户任意时间窗口统计活跃用户数(and运算)
什么是布隆过滤器
slave2
理解capbase
bitmap
zlbytes(列表总字节数)
tail
分布式锁
bgsave
应用程序
quicklist
slave4
如果上一个字节长度小于255字节使用1字节存储否则使用5字节存储0x05 => 80字节0xEF 00 00 27 66 => 10086 字节
释放锁,保证获取的值和锁的值一致才可以删除,为了保证一致性可使用lua脚本执行nosql命令
加入集群
str: \"abcd\\0abc\"在C语言中\\0表示字符串结束符len(str) = 4在php中是二进制安全的不会对字符串进行格式分析 len(str) = 8
list
数值统计
读
布隆过滤器(不存在的数据一定不存在,存在的数据不一定存在)
将命令放入队列中,一次性执行,但是不保证原子性(有一条命令执行失败不影响其它命令)
Twemproxy(中间件)
fd2
连锁更新
共同好友: 交集推荐好友:差集
redis sharding(客户端分片)
raft算法
set 5
zset
fd1
删除节点后,需要将原先节点存储的数据转移到旧节点
info:masterslave(哨兵获取后找到对应slave地址)sentinel
代理分片
\"hello word\"
slave5
任意时间窗口统计新注册用户数(计算bitmap 1的数量)
发送rdb数据快照
通过选举算法选出sentinel来进行故障处理。处理流程:选出满足条件的slave作为master,将其他slave修改master配置信息
详情页
每次字符操作如果字符串len小于1m未使用缓冲区长度等于buf数据长度。如果大于1M那么程序会分配1M的未使用空间长度为N的字符串,空间分配次数小于等于N
redis 6以下没有实现io thread多线程
软中断
优点:1.结合了linkedlist和ziplist的优点缺点:1.如果链接单个节点存储的字节大于设定值,则需要重新分配ziplist到节点中
票数过半& 票数=quorum/故障处理
判断是否存在
EXEC
运行中
Redis是一种面向“k/v”对类型数据的分布式NoSQL内存数据库系统,特点是高性能,适应高并发的应用场景。默认0 -10个数据库
获取info请求
每个sentinel会有给随机时间定时器
MULTI(事务开始)EXEC(执行操作)DISCARD(回滚)WATCH(监控指定key变化,事务回滚)UNWATCH(取消监控)
append字符串操作
数据聚合
内存
length1
发送最新复制offset
set lockkey random_value NX PX 500K
Redis模型
ziplist(如上图)每个节点存储的是k-v数据
键的个数小于512值小于64字节则使用ziplist
定时任务主动处理
文件系统
缓存淘汰机制(内存不足)
zllen(压缩列表节点数)
存储数量小于512每个元素都是整数
raft算法根据每个节点随机定时器结束后,将投票请求发送给其它节点,其它节点定时器未结束只能同意,如果出现重复票数继续竞选
栈队列数组数据裁剪
list长度小于512list每个元素小于64字节则使用ziplist
null
R fd2
12306车票查询(位图判断)
Redis底层存储
触发场景
中断回调callback
默认开启
Redis可用性
encodeingint162B大小
content 3
entry(节点)
提高精准度:1. 加大字节长度2. 设置合理数量hash计算函数
true
repl buff
i/o耗时严重
Redis数据持久化(为了高性能,最好关闭持久化功能)
解决缓存穿透(缓存不存在,数据库也不存在)大量请求到数据库,防止攻击,大部分攻击者给的都是无效参数,这些请求需要被过滤,不应该请求到数据库
新增节点
hashtable
nio/epoll
优点:读写分离减轻单机压力缺点:master挂了,写如就会失败
空间分配原则
扩容缩容方法(rehash)
各个编码含义这里不多阐述
slave1
i/o操作慢的原因
previous_entry_length(上一节点长度)
分片集群
SDS(Simple Dynamic String)
LFU
淘汰机制
ziplist(压缩列表)
优点:1.防止数据丢失,每个节点都有相应的从节点2.大大减轻的单机压力,数据切片缺点:1.运维成本高2.可能会出现数据倾斜3.可能出现请求倾斜
常识:磁盘读取: (毫秒)ms级别内存读取: (纳秒)ns级别两者相差100w倍【磁盘】吞吐: 百兆 G耗时:ms【内存】耗时:ns
ACID
hashtable不存value
Redis 五大Value与应用场景
中断
发送Psync runId
用户态切换内核态(压入堆栈,保存上下文)
扩容:当hash数组元素内的链表长度大于hash数组长度的时候会将数组长度扩容到原来的两倍(如果redis进行bgsave,为了减少cow,会取消扩容),当hash数组元素内的链表长度为数组的5倍时会进行强制扩容缩容:当hash表内的元素小于数组长度的百分之10%会进行缩容减小数组长度,缩容不会考虑 Redis 是否正在做 bgsave。
如果lockkey不存在该命令返回true表示获得锁
io thread
无论是redis节点加入,数据的加入都会计算hash到对应的槽中,然后判断存储到对应节点内eg. 按照某个方向(这里拿顺时针举例)所有数据会存储在顺时针放心的第一个redis节点
连锁更新是由于previous_entry_length字段特性引起的在list首个节点前插入一个大于255字节的节点,下一个节点刚好254字节长度,需要更新previous_entry_length长度,总长度254 -> 258 导致下一个节点也需要更新previous_entry_length 长度,不过这种概率比较小,出现不频繁
优点:1. 节省内存空间大小2.查找节点左右速度快O(1)3.连续内存空间对cpu高速缓存更友好缺点:1.查询速度慢O(n)2.可能出现连锁更新问题
client2
依靠业务将数据分配到各个redis事例,每个redis事例都是独立的,不支持动态扩容缩容
有序去重集合操作
Redis事务
哨兵模式的通讯建立
全量同步
string
AOF日志
增量同步
统计限流window
过期键淘汰机制
内核态(kernel)【11:callback】
优点:1.插入删除速度快缺点:1.查询速度慢O(n)
0 条评论
下一页