Redis
2022-03-07 17:36:44 10 举报
AI智能生成
redis 基础
作者其他创作
大纲/内容
8字节长整型
int
<=44字节的字符串 分配一次空间 redisObject和sds是连续的 对象的所有数据连在一起 寻找方便
embstr 动态字符串
大于44个字节的字符串 分配两次空间 分别为redisObject和sds分配空间
raw
编码
string
当每个列表项是小整数值或者短字符串 会使用压缩列表进行存储
类似于数组的一种结构 一个压缩列表可以包含多个节点 每个节点可以保存一个字节或者一个整数值 放到一个连续的内存区
zipList
由一个list结构和多个listNode结构组成
linkedList
3.2开始 使用快速链表 可以看做是一个双向链列表 列表的每个节点都是一个zipList 其实就是linkedList和zipList的结合
quickList
list
hash中元素个数大于512个
hash中所有键值对的键和值字符串长度大于64字节
hashtable
hash中元素个数小于512个
hash中所有键值对的键和值字符串长度小于64字节
hash
元素都是整数
元素数量小于512个
intser
不满足intset条件
set
同时满足 元素小于128 长度不足64字节
有一个不满足压缩列表条件的就会用压缩列表
skiplist
zset
数据类型
setbit key offset value
getbit key offset
bitcount key
BitMap
PFADD
PFCOUNT
PFMERGE
计数统计 每个HyperLogLog键只需要花费12KB内存 计算2 64次方个不同元素的数据 只统计个数不返回数据
HyperLogLog
底层是zset
添加地理位置
geoadd
获取地理位置
geopos
计算两个位置之间的距离
geodist
根据用户给定的经纬度坐标来获取指定范围内的地理位置
georadius
根据储存在位置集合里面的某个地点获取指定范围内的地理集合
georadiusbymember
返回一个或者多个位置对象的geoHash值
geohash
Geospatial
高级数据类型
使用lpush和rpop
Subtopic
队列模式
用于订阅信息
SUBSCRIBE
向信道发送消息
PUBLIST
取消订阅
UNSUBSCRIBE
发布订阅模式
redis stream
只能保证隔离性
multi 开始事务
exec 确认提交事务
discard 取消执行 回滚操作
事务
快照模式 当符合一定条件时候 redis会自动将内存中的数据进行快照并持久化到硬盘
save命令 save 300 100 表示五分钟内至少有100个key有变化就进行持久化
redis调用系统中的fork函数复制一份当前进程的副本
父进程继续接受处理客户端的请求 而子进程开始将内存中的数据写入硬盘中的临时文件
子进程完成数据的写入后会用该临时文件替换旧的RDB文件
快照过程
符合指定配置
执行save或者bgsave save主线程去快照 bgsave调用异步线程去快照
执行flushAll或者flushdb
执行主从复制操作
触发时机
RDB
每执行一条会更改redis中的数据命令 redis就会将该命令写入硬盘AOF文件 这一过程会降低redis的性能 较快的硬盘可以提高AOF的性能
AOF文件体积过大的时候 redis会自动的在后台对AFO文件 重写后的AOF文件包含了回复当前数据所需要的最小的命令集合
重写的机制
AOF
写入的时候 先把当前的数据以RDB的形式写入文件的开头 再将后续的操作以AOF的格式存入文件 既保证了redis的重启的速度又能减低数据丢失的凤险
config get aof-use-rdb-preamble yes 开启混合模式
混合模式
持久化
在从服务器上的配置文件中配置 replicaof masterip masterport
参与主从复制的节点都会维护自身的复制偏移量 主节点在处理完写入命令后 会把命令字节长度累加做记录 统计在info relication中的master_repl_offset指标中
从节点slave每秒钟上报自身的复制偏移量给主节点 因此主节点也会保存从节点的复制偏移量
从节点接收到主节点发送的命令后 也会累加自身的复制偏移量 统计在info relication中的slave_repl_offset中
通过对比主从节点的偏移量 判断主从节点数据是否一致
复制偏移量
每个主从节点都会生成一个runid 相当于自己的身份。每次重启都会重新生成
runid
redis主从复制
每个哨兵节点每10秒会向主节点和从节点发送info命令获取最新的拓扑结构图 哨兵配置时只要配置对主节点的监控即可 通过向主节点发送info 获取从节点的信息 并当有新的从节点加入时可以感知马上到
每个哨兵节点每隔2秒会向redis数据节点指定频道上发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息 同时每个哨兵节点也会订阅该频道 来了解其他哨兵节点的信息以及对主节点的判断 其实是通过publish和subscribe完成的
每隔一秒每个哨兵会向主节点 从节点以及其余哨兵节点发送一次ping命令做一次心跳检测 这个也是哨兵用来判断节点是否正常的重要依据
监控机制
单个哨兵节点认为某个服务下线 以每一秒的频率向所有与其建立了命令的实例 master 从节点 其他的哨兵节点 发送ping命令 通过命令判断对该节点来说是否是否在线
主观下线
当主观下线的节点时主节点时 该哨兵节点会通过指令 sentinel is- masterdown-by-addr 需求其他节点对主节点的判断 如果其他节点也认为主节点主观下线 则认为主观下线的票数超过了quorum选举个数 此时哨兵节点则认为该主节点确实有问题 这样就客观下线了 也就是大部分哨兵同意下线 就说客观下线
客观下线
如果主节点被判定为客观下线后 会选举一个哨兵节点进行故障转移 也就是重新选举一个master
每个在线的哨兵节点都可以成为领导者 当主节点下线时 会向其他哨兵发送is-master-down-by-addr命令 征求判断并要求自己为领导者
被请求节点配置的纪元小于请求节点的配置的纪元
被请求的配置的纪元中收到的第一个投票请求
其他的哨兵收到命令后女 可以同意或者拒绝它成为领导者
当选举者发现自己的票数大于或者等于哨兵节点除以2加一时 会成为领导者
哨兵leader选举
因为哨兵每十秒就会去主节点拉取信息 主节点中有从节点的信息 所以哨兵是有记录从节点的信息的
过滤主观下线的节点
选择优先级最高的节点。优先级可以在配置文件中配置。默认都是100
如果优先级一样 选举复制偏移量最大的节点 偏移量越大数据复制越完整
如果偏移量也相同 会选举runid最小的节点
选举主节点
哨兵机制
redis集群内置了16384个hash槽 当需要在某个节点存放k-v时 会对key用crc16算法算出一个数值 然后对16384进行取余 取余后会得出得数会对应在0-16384之间的槽 redis会将节点数大致相等的将hash槽映射到不同的节点。如果新加一个节点 就需要手动分配槽 然后数据会自动的更新过去
配置文件中配置cluster-enabled yes
搭建集群
cluster info 查看集群的状态
cluster nodes 查看节点信息
无需哨兵监控 master挂了会自动吧slave切换成master
可以进行水平扩容
如果一个master的slave挂了 然后master也挂了 这时候如果其他的master有多余的slave 就会自动的吧多余的slave迁移到没有slave的master节点中
批量操作 无法保证事务 事务需要多个命令 有可能命令在多个节点执行
资源隔离性比较差 容易出现相互影响。命令有可能被其他的节点的命令打断
特点
slave更新自己的状态 声明自己为主节点 将自己从m中移除 不再从M同步数据 并且吧同步数据相关信息给删除 将mater的槽都声明到自己 发送一个pong包 通知其他节点更新状态
主从切换
redis clustre
使用长整形或者整形 可以节省空间 redis会用int类型(8字节)代替字符串
redis将0-9999的整数放在了常量池中 减少了对象的创建同时也减少了redisObject的创建
共享对象
内存
expipe 设置key的生存时间为ttl秒
pexpire 设置key的生存时间为ttl毫秒
key的过期时间设置为指定的秒数时间戳
expireat
key的过期时间设置为指定的毫秒数时间戳
pexpireat
设置键值对过期时间 节约内存的占用 避免键值对过多的堆积 频繁触发内存淘汰策略 但是会有缓存雪崩的风险
使用惰性删除 访问数据的时候才会去判断是否过期
lru 最近最少使用 思想是 如果数据最近被访问过 那吗将来被访问的几率也很高
lfu 一段时间内 数据被使用频次最少的优先被淘汰
设置redis内存大小 设置内存淘汰策略 当redis内存使用达到了最大内存使用后 会进行内存淘汰
因为redis是单线程去完成的查询 所以数据过大的时候会产生阻塞 可以把一个大的结构体分为几个小的 也就是用hsah
redis使用单线程模型处理客户端的请求 主要还是因为cpu不是redis服务器的瓶颈 系统的瓶颈主要在网络io操作上 多线程模型并不能抵消它带来的开发成本和维护成本 而引入多线程操作是出于性能上的考虑 对于一些键值对的删除操作 通过多线程非阻塞的释放内存空间也能减少对redis主线程阻塞的时间 提高执行效率
禁用长耗时的查询命令
slowlog-log- slower-than 用来设置慢查询的评定时间 超过配置时间的命令会记录在慢查询日志中 执行单位是微妙
配置慢查询日志最大记录数
slowlog-max-len
slowlog get 获取相关的慢查询日志
通过slow log命令 找出最耗时的redi命令进行相关优化
使用slowlog优化耗时命令
避免大量数据同时失效
性能
优化
info memory 内存信息
统计命令
Redis
0 条评论
回复 删除
下一页