redis
2019-09-12 10:04:59 3 举报
redis 介绍
作者其他创作
大纲/内容
一个哨兵先订阅了主节点,当里一个哨兵加入集群时,会向主节点发布一条消息,原先的哨兵就会收到相应的通知。
level 3
发起SYNC命令请求同步
监控内部各个节点
全量复制
redis集群
union
正常增量复制
member1
5
7
dictht[0]
ziplistentry1 2...n
dict
slave
scoreN
quicklistnode
哨兵集群
6
master
keyunion vdictEntry next
dictEntry table...
redis集群主节点配置:protected-mode no 改成no。并把bind ****注释掉从节点的配置:增加 slaveof 主IP 主端口配置(所有的从)。查看集群:redis-cli进入控制,输入info replication查看。数据同步原理:全量复制,增量复制。无磁盘复制。可以在从节点使用replconf listening-port 主port 监听主节点的命令发生情况。用sync开始监听。解决网络延迟问题:配置文件,多少从节点同步之后可以接受请求和从节点心跳超时时间。min-slaves-to-write:多少台,min-slaves-max-lag:心跳时间。数据不一致问题:从节点记录了上次同步的信息,保存了上次同步的位置等。主节点选举:哨兵机制。哨兵主要监听主从节点的是否正常运行。以及当主节点故障时,从从节点中选出一个新的主节点。哨兵配置:sentinel.conf文件(在redis的安装目录下)。redis-sentinel sentinel.conf启动sentinel monitor mymaster IP Port n。n是多少哨兵达成一致,才说明master故障。
1
dictht
bgsave生成快照
dictEntry
单线程 高性能(多路复用)redis任务主要的延迟发生在网络传输上。单线程也不会存在线程切换的问题。多路复用,一个请求过来后,会立马返回,不会阻塞,redis还可以继续接受其他的请求,从而提高性能。但是单线程并不是线程安全的,不是原子性的。因为客户端的请求并不能保证顺序性。复杂操作不安全。
member2
pub/sub
4
发布订阅模式 pub/sub发布:publish channel message 向channel中发送消息message。订阅:subscriber channel1 channle2... 订阅多可channel,可收到多个渠道的消息。note 这是个简单的轻量级的消息模式,不支持持久,重试等机制。
quicklist
key
0
score1
...dictht ht[2] 2个...
3
level 2
val u64 s64 d
redis数据分片:缓解数据量过大问题。redis cluster bus提供了基于gossip协议的无中心化节点的集群(每个节点都是主节点,每个主节点都用相应的从节点)。redis内部提供了虚拟槽slot的概念(0-16383),每个节点有自己划分的槽范围,客户端的请求会根据CRC16(key)%16383算法,确定数据请求会落在在一个节点上。扩展:1,可以用hashTag 取多个key的共同部分作为运算的key,可以使请求落在同一节点上。2,如果一个请求去A节点请求数据,A不包含,A就会返回包含的节点B给客户端。分片迁移:增加节点时,会从现有的节点中切出部分数据到新的节点中(数据的迁移)。同时会进行槽的迁移。此时,各节点的状态会发生变化,迁出和迁入有响应的转态,当客户端请求过来是,如果正在迁出,且数据还没有迁出就直接返回,已迁出就返回ASK让客户端去请求另一节点。如果是正在迁入,判断是否ask跳过来的,是不容许操作,否返回。
相互
每个节点的数据结构
哨兵内部的选举,raft协议。
score2
生成期间的数据异动的命令
数据库和redis缓存一致性的问题:根据更新缓存的代价,代价大就直接失效。数据库和缓存先后问题:
新加入从节点
quicklistnode prevquicklistnode nextzl:总的数据长度...
增量复制
redis应用。哨兵模式下,怎么连接:通过配置所有的哨兵地址得到JediSentinelpool,内部是遍历所有的哨兵节点,发送一个命令,通过名称查询master节点,检验返回结果,合法就表示找到主节点,此时还要建立监听,方便知道哨兵的健康情况。拿到主节点之后,就通过主节点的地址信息建立jedis的连接池,用来操作redis。rediscluste分片模式:通过HostAndPort(主节点地址合集)集合构建JedisCluste来操作redis。构造的时候,会发送slots命令获得集群中的所有信息,包含槽的分配,然后把每个节点缓存到本地的集合中。在执行redis命令时,再去通过算法判断应该落到哪一个节点上。Redisson模式:Config中设置好每台redis的地址和其他的信息,在通过Redisson.create(config) 构造出RedissonClient。分布式锁:redis的setnx命令。Redisson的getlock(基于juc的Lock+lue脚本实现)。pipeline管道:解决网络通信的问题。通过jedis获取一个管道,然后通过管道操作redis。
ziplist
sorted-set 有序链表zadd key score member ..... 存储数据,zscore key member 获取score,zrange key 0 3 取key的前三个member,zrange key 0 3 withscore 取key的前三个member并获取score--正向排序,zrevrange 反向。数据结构:ziplist,skiplist+hashtable。跳跃表的结构,数据分层,每个数据都有向右和向下的指针,查询快速。使用场景:根据特定需要排序。
memberN
sentinel哨兵1
unsigned char flages:3位2进制表示当前的类型。5/8/16...char buf[]:数据存放的位置uint8_t len:当前字符长度uint8_t alloc:已经为当前结构分配的数据大小
dictht[1]
发送快照
内存回收策略 redis.conf中 maxmemory-policy 配置noeviction:当内存达到阈值的时候,在去申请内存就会报错。(默认方式)allkeys-lru:达阈值时,从内存中查最少使用的数据去淘汰。allkeys-random:达阈值时,从内存随机查询数据去淘汰。volatile-random/lru/ttl:从已经设置过期数据中-随机淘汰/最少使用淘汰/即将过期的淘汰。
sentinel哨兵2
超时时间设置expire key seconds span style=\"font-size: inherit;\
zlbyteszltailentry1entry2....n
2
yum install telnet 安装telnet
level 1
quicklistnode tailquicklistnode headcount:总的数据长度len:节点数...
load
lua脚本的使用 解决原子问题,减少网络的开销。批量操作,pipeline管道的方式。lua脚本中执行redis:redis.call('')执行脚本 eval \"脚本\" 参数,也可以 创建一个.lua的脚本文件 eval 文件 参数 执行。script load 脚本或脚本文件 生成一串摘要。 然后evalsha 摘要 参数 页可以执行,减少网络传输成本。lua脚本执行时,其他的命名阻塞,不能执行。
0 条评论
下一页