redis之缓存查询优化技术

  • redis本质上是key-value的nosql数据库,可以进行数据存储,并且可以按照缓存更新策略,一般是影响多少个key时做一次缓存操作或者一分钟几分钟来进行缓存更新等,这是由redis的缓存策略RDB(记录数据以压缩二进制方式存储在rdb文件当中)或者AOF(通过记录数据的执行过程,即指令到aof文件中来进行缓存)来确定的,一般redis作缓存的方式有:
  1. 单机版redis
  2. sential哨兵模式
  3. Cluster 集群模式
  • sential哨兵模式 :假设有两台物理机作为redis,一个为master redis(主redis),一个slave redis(从redis),redis slave同步了master redis的缓存数据,相当于备份操作,开始工作时,并且由主要由master redis提供查询缓存服务,如果主redis挂掉了,就需要切换到从redis提供缓存查询服务,但是后台并不知道怎样识别从和主redis以及相互切换,这时便引入了哨兵机制redis sential:如下所示

             

  • redis sential 均与redis1和redis2建立长连接,这种长连接是心跳机制,redis sentinal清楚的知道这两台redis的服务状态,当后台服务启动时,需要询问单个redis sentinal 来连接那一个redis,然后由redis sentinal进行回复它应该连接哪一个redis服务,后台连接的那一个redis便作为主redis来提供服务,从redis备份作为替代,通过redis哨兵的心跳机制,哨兵可以很清楚的知道主redis的状况,一旦主redis挂了其心跳便会被破坏掉,由于redis哨兵是个集中式设备,它认为主redis挂掉了/或者通信异常,这时便会进行切换,将redis2作为master提供服务,将redis1作为slave,然后便会通知后台服务产生了change,需要重新来ask以获得连接,然后哨兵便会返回其该连接的redis服务:

        

  • Cluster集群模式:很明显,上面的哨兵模式只能允许一台redis来get和set操作进行工作,在集群模式中我们可以采用分片机制,将每个读redis和写redis都配有slave redis,对其redis服务器的ip作hash值,来确定那台作为主写、主读以及对应的从redis,从而可以快速路由到相应的redis:
  • Redis Cluster 集群模式通常具有 高可用可扩展性分布式容错 等特性。Redis 分布式方案一般有两种:
  1. 客户端 就已经决定数据会被 存储 到哪个 redis 节点或者从哪个 redis 节点 读取数据。其主要思想是采用 哈希算法 将 Redis 数据的 key 进行散列,通过 hash 函数,特定的 key会 映射 到特定的 Redis 节点上。 Redis Sharding 是 Redis Cluster 出来之前,业界普遍使用的 Redis 多实例集群 方法。Java 的 Redis 客户端驱动库 Jedis,支持 Redis Sharding 功能,即 ShardedJedis 以及 结合缓存池 的 ShardedJedisPool。
  2. Redis集群是一个由多个节点组成的分布式服务集群,它具有复制、高可用和分片特性
  3. Redis的集群没有中心节点,并且带有复制和故障转移特性,这可用避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线
  4. 集群中的主节点负责处理槽(储存数据),而从节点则是主节点的复制品
  5. Redis集群将整个数据库分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个
  6. 集群中的每个主节点都可以负责0个至16384个槽,当16384个槽都有节点在负责时,集群进入上线状态,可以执行客户端发送的数据命令
  7. 主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽的命令时,它将会处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送

                 

 

  • redis cluster节点间采取gossip协议进行通信,跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间不断通信,保持整个集群所有节点的数据是完整的。
  1. 集中式:元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到; 不好在于,所有的元数据的跟新压力全部集中在一个地方,可能会导致元数据的存储有压力
  2. gossip:元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新,有一定的延时,降低了压力; 缺点,元数据更新有延时,可能导致集群的一些操作会有一些滞后
  • 10000端口:每个节点都有一个专门用于节点间通信的端口,就是自己提供服务的端口号+10000,比如7001,那么用于节点间通信的就是17001端口,每隔节点每隔一段时间都会往另外几个节点发送ping消息,同时其他几点接收到ping之后返回pong交换的信息故障信息,节点的增加和移除,hash slot信息,等等
  • gossip协议

  gossip协议包含多种消息,包括ping,pong,meet,fail,等等

  meet: 某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信

  redis-trib.rb add-node其实内部就是发送了一个gossip meet消息,给新加入的节点,通知那个节点去加入我们的集群

  ping: 每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护集群元数据,互相通过ping交换元数据,每个节点每秒都会频繁发送ping给其他的集群,ping,频繁的互相之间交换数据,互相进行元数据的更新

  pong: 返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新

  fail: 某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值