存储-redis
2021-12-24 09:25:15 0 举报
redis简介
作者其他创作
大纲/内容
数据结构
string
SET lock_key random_value NX PX 5000
list
blpop 阻塞弹出<br>
set
sortedSet
延时队列,score为毫秒数
map
常用命令
慢日志
config get/set slowlog-log-slower-than 10000 执行时间大于多少微秒的记录
config get/set slowlog-max-len 128储存多少条慢查询的记录<br>
slowlog get N 获取慢日志<br>
dbsize当前数据库的key的数量
time ,显示服务器时间 , 时间戳(秒), 微秒数
Showdown [save/nosave] 关闭
INFO 查看Replication/CPU<br>/Memory/server/clients/stats<br>/Persistence/Cluster<br>
human开头:以可读格式返回
used_memory: Redis分配的内存总量
used_memory_rss:从系统角度,显示Redis进程占用的物理内存总量
used_memory_peak:内存使用的最大值
total_system_memory:系统总内存
used_memory_lua:Lua进程使用内存
mem_fragmentation_ratio:内存碎片率,<br>等价于(used_memory_rss /used_memory)<br>
如何产生
碎片率的意义
碎片率大解决
config get/set 获取设置文件参数
子主题
publish发布<br>
Subscribe订阅
事务
watch unwatch 监控及取消
multi 开启<br>
exec 提交<br>
discard 回滚<br>
randomkey 返回随机key<br>
type 存储的值的类型<br>
ttl 查询生命周期<br>
expire 设置生命周期,以秒为单位<br>
persist 置为永久有效<br>
keys pattern 查询相应的key
eval 执行lua
内存组成
对象内存
Value对象
Key对象
缓冲内存
复制积压缓冲区
AOF缓冲区
客户端缓冲<br>
普通客户端的连接
从客服端链接
订阅客户端<br>
自身进程内存<br>
不由jemalloc分配,不计在used_memory
内存碎片
Redis默认的内存分配器是jemalloc,删除数据后会被redis截留
原因
频繁更新
大量过期键删除
方案
减小内存碎片
尽量数据对齐
redis4.0以上手动回收内存碎片
子进程内存消耗
指AOF/RDB重写时Redis创建的子进程内存消耗
虚拟内存
超出物理内存时:数据在内存与磁盘换入换出的一个持久化策略,管理成本高<br>
内存回收策略
惰性删除
定期删除<br>
定时任务删除
内存溢出的控制策略
volatile-lru
allkeys-lru
volatile-random
allkeys-random
volatile-ttl
noeviction
持久化
快照
bgsave 子进程生成快照
save 生成快照
stop-writes-on-bgsave-error 后台备份进程出错时,主进程停不停止写入<br>
rdbcompression 导出的rdb文件是否压缩<br>
Rdbchecksum 导入rbd恢复时数据时,要不要检验rdb的完整性<br>
dbfilename 导出来的rdb文件名<br>
dir ./ 放置路径<br>
AOF
BGREWRITEAOF 后台进程重写AOF
appendonly no/yes 打开关闭aof功能<br>
auto-aof-rewrite-percentage 文件大小比起上次重写时的大小,增长率X%时,重写<br>
auto-aof-rewrite-min-size 64mb 至少超过64M时,重写<br>
参数
maxmemory
config set maxmemory 8GB 设置最大内存
开快照,设置45%,否95%
maxmemory-policy过期策略 noeviction
主从复制??
命令
slaveof no one 不做从改为主<br>
slaveof IP port 指为IP的从<br>
过程
slave发送一个 PSYNC命令给 master
初次连接到 master会触发一次 full resynchronization 全量复制
RDB生成完毕后, master将这RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中。
master将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。
slave跟master有网络故障,断开了连接,会自动重连,连接之后 master仅复制给 slave部分缺少的数据。
内存缓冲区(in-memory backlog)
复制偏移量(replication offset)和master run id ,
master run id系统且偏移量在内存缓冲区有效
Redis从2.8.18版本开始尝试支持无磁盘的复制
sentinel<br>
功能
集群监控<br>
消息通知
故障转移
配置中心
工作机制
每个哨兵节点每隔10s会向Master发送info replication命令,获取最新拓扑
每个哨兵每隔1s会向集群中的Master和各个Slave节点发送心跳,判断节点是否存活
每个哨兵每隔2s会向Redis中的指定频道发布其对Master节点的判断,同时每个哨兵会订阅该频道
投票,发现Master节点故障后,且超过指定数量,哨兵充当Leader进行故障转移
选举,挑选其中一个存活的Slave节点断开与Master节点的连接,并使其成为新的Master节点
然后将其他Slave节点与该新的Master节点建立联系
最后修改各个节点的redis.conf配置文件,更新主从映射关系
参数配置
redis-server.exe sentinel.conf --sentinel 启动 <br>
sentinel monitor mymaster 127.0.0.1 6379 2 <br>当2个sentinel实例都认为master失效时,正式失效<br>
sentinel down-after-milliseconds mymaster 30000 <br>多少毫秒后连接不到master认为断开<br>
sentinel can-failover mymaster yes <br>是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改<br>
entinel parallel-syncs mymaster 1 <br>一次性修改几个slave指向新的new master<br>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh <br>重新配置new master,new slave过程,可以触发的脚本<br>
主动切换过程
Redis Cluster
设计
采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
图示
内部使用二进制协议优化传输速度和带宽
节点的fail是通过集群中超过半数的节点检测失效时才生效
客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点
cluster把所有的物理节点映射到16384个slot上,维护node<->slot<->value。
key放在CRC16(key) % 16384槽对应的机器上
Gossip 协议
核心功能
主从复制<br>
哨兵模式
分片分区
配置
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002<br>创建cluster:主,从(1个副本),主分的槽,主从关系。
./redis-trib.rb check 127.0.0.1:7002<br>检测cluster状态
分布式寻址算法
hash 算法(扩减会大量缓存重建)
一致性 hash 算法(自动缓存迁移)+ <br>虚拟节点(自动负载均衡)<br>
1 对2的32次方取模,从小到大首位相连形成虚拟圆环
2 对服务器的IP或主机名进行哈希,定位在环中位置。<br>每个服务器节点顺时针到下个节点,则为该机器的数据范围。<br>
3 对数据key哈希,定位在哪台服务器。<br>
减少增加节点,只对变更节点到下个节点产生影响。
数据倾斜问题(服务器数据分布不均)
1 各个服务增加虚机节点。<br>如:每个服务器名增加10个序号
2 对虚拟节点哈希后定位位置
3 数据哈希找到虚拟节点<br>再由虚拟节点找到实际服务器ip。
redis cluster 的 hash slot 算法
一共有2^14(16384)个槽
集群用CRC16(key) %16384 来计算属于哪个槽
每个服务节点负责哈希槽的一个子集<br>
0 条评论
下一页
为你推荐
查看更多