Redis

  • redis
    Redis,  技术

    Redis Cluster集群节点间通信

    Redis 的集群节点之间的通信采取 gossip 协议进行通信,在 redis cluster 架构下,每个 redis 要放开两个端口号,比如一个是 6379,另外一个就是 加10000 的端口号,比如 16379,16379 端口号是用来进行节点间通信的。 Gossip协议 Gossip protocol 也叫 Epidemic Protocol (流行病协议),顾名思义,就像流言蜚语一样,利用一种随机、带有传染性的方式,将信息传播到整个网络中,并在一定时间内,使得系统内的所有节点数据一致。这里简单介绍下Gossip协议的执行过程: 当一个种子节点有状态需要更新到网络中的其他节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中所有的节点都收到了消息。 Gossip协议优势: 扩展性 网络可以允许节点的任意增加和减少,新增加的节点的状态最终会与其他节点一致。 容错 网络中任何节点的宕机和重启都不会影响 Gossip 消息的传播,Gossip 协议具有天然的分布式系统容错特性。 去中心化 Gossip 协议不要求任何中心节点,所有节点都可以是对等的,任何一个节点无需知道整个网络状况,只要网络是连通的,任意一个节点就可以把消息散播到全网。…

  • redis
    Redis,  技术,  服务组件

    Redis Cluster “cluster nodes”命令

    redis cluster集群部署后,可以通过redis-cli的 cluster nodes 命令查看集群的节点信息。 输出的每行,都代表一个节点,下面我们讲解下这些信息的含义,为了更直观些,我们将这些信息放入表格里: id ip:port flags master ping-sent pong-recv config-epoch config-epoch slot 46dc4de072aad1e44548cfde5b56239001eaff5a 127.0.0.1:6380@16380 master – 0 1623402917302 2 connected 5461-10922 18cc5a352ba7a567bdbad5d777b3712a7b81b0f8 127.0.0.1:6384@16384 slave 99b3c660b15114ef55247e5b07cbf8f34621bee3 0 1623402916327 3 connected 99b3c660b15114ef55247e5b07cbf8f34621bee3…

  • redis
    Redis,  技术,  服务组件

    Redis Cluster集群为何是16384个哈希槽

    我们都知道,对于客户端请求的key,redis是根据公式 HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作。 CRC16算法产生的hash值有16bit,该算法可以产生65536(2^16)个值。换句话说,值是分布在0~65535之间。那作者在做mod运算的时候,为什么不mod 65536,而选择mod 16384?这个问题,作者是给出了回答的,详见: https://github.com/antirez/redis/issues/2576,下面我们来具体的讲一下。 1. 如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。 redis集群的节点之间会定期发送ping/pong消息,交换数据信息的,交换的数据信息,由消息体和消息头组成。 消息体无外乎是一些节点标识,IP,端口号,发送时间等等,这里我们主要关注的是消息头: 可以看到有个字段名为 myslots 的char数组,长度为 CLUSTER_SLOTS/8,CLUSTER_SLOTS为常量16384,所以该数组长度为16384/8,这其实是一个bitmap,每一个位代表一个槽,如果该位为1,表示这个槽是属于这个节点的。 该数组所占空间大小为 16384÷8÷1024=2kb,当槽位为65536时,这块的大小是: 65536÷8÷1024=8kb。消息体中会携带一定数量的其他节点的信息,节点信息里同样包含其槽位信息,节点数大约占集群节点总数量的十分之一,至少是3个节点的信息。节点数量越多,消息体内容越大。 因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽。 2. redis的集群主节点数量基本不可能超过1000个 如上所述,集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此redis作者,不建议redis cluster节点数量超过1000个。 3. 槽位越小,节点少的情况下,压缩率高 Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中,会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),bitmap的压缩率就很低。 如果节点数很少,而哈希槽数量很多的话,bitmap的压缩率就很低。 综上所述,作者决定取16384个槽,不多不少,刚刚好! 相关链接 https://www.cnblogs.com/rjzheng/p/11430592.html https://zhuanlan.zhihu.com/p/99037321

  • redis
    Redis,  技术,  服务组件

    Redis Cluster集群部署

    Redis Cluster是Redis官方提供的Redis集群功能。 下载镜像 docker pull redis:6.2.4 运行镜像 我们需要创建6个redis容器(redis集群,最少必须有6个节点,3主3从) redis-node1:6379 redis-node2:6380 redis-node3:6381 redis-node4:6382 redis-node5:6383 redis-node6:6384 创建挂载目录 分别在每个conf目录下创建文件redis.conf node1/conf/redis.conf : 同样,node1 ~ 6端口号依次为: 6379,6380,6381,6382,6383,6384 创建虚拟网卡 创建虚拟网卡,主要是用于redis-cluster能于外界进行网络通信,一般常用桥接模式。 docker network create redis-net 编辑docker-compose.yml文件 启动容器 docker-compose up -d…

  • redis
    Redis,  技术,  服务组件

    Redis浮生系列:为什么要使用Redis

    Redis可以说是目前而言,应用最为广泛的一种nosql数据库,其广受欢迎必然有着其独有的优势。 优势一:速度快 redis为什么速度快呢? 最主要的原因就是redis是基于内存的。 Redis将所有的数据都放在内存中进行操作,纯内存访问,没有磁盘的I/O读取,自然就非常的快了。 其次,redis是单线程的。 采用异步非阻塞的多路 I/O 复用,让单个线程高效的处理多个连接请求,减少了网络 IO 的时间消耗,且不存在多线程中线程切换竞争等问题造成的性能损耗。(注意:单线程仅仅指的是网络请求这一模块上用的单线程,整个redis的服务并不是单线程的) 另外还有就是用最贴近操作系统的C语言编写 以及优秀的数据结构和算法等也为速度做出了一定的贡献。 当然,最主要的原因还是基于内存这一点,其提升的速度跟其他因素相比不是一个量级的。 优势二:丰富的数据类型 redis提供了五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 丰富的数据类型不仅能够满足大部分的业务场景需求,同时也极大的提高了业务开发的效率。 同时redis还提供了 Bitmaps(位图),HyperLogLog(去重计数),GEO(地理信息定位),Bloom Filter(布隆过滤器),PubSub(发布/订阅),Pipeline (管道),事务,Lua脚本支持等多项高级功能,能够完美的支持一些特定的应用场景。 优势三:高可用和分布式 redis的集群功能是它真正的分布式实现,能够保证Redis节点的鼓掌发现和自动转移,提供了高可用、读写和容量的扩展性,使其能够适应当今主流的分布式业务部署方案。 正因为有着以上的种种优势,redis才会在目前各大互联网公司广受欢迎,同时也是我们所必须掌握的技术之一。

  • redis
    PHP,  Redis,  技术,  服务组件,  编程语言

    redis限制请求频率

    通过redis限制请求的频率 场景1: 限制用户每分钟获取验证码频率,如一分钟不能超过3次 场景2: 限制一个ip地址不能1秒内访问超过n次(方法同场景1) 场景3:限制一个人1分钟内点赞/投票次数不能超过n(方法同场景1) 推荐相关精品课程: redis基础&实战教程