2021-04-22

Redis(五)集群

(a)是什么?
1)当容量不够时,redis如何进行扩容?
当并发写操作时,redis如何分摊?
当使用主从模式,薪火相传模式,主机宕机,导致ip地址发生变化。应用程序中配置需要修改对应的主机地址,端口等信息。
2) 在redis-3之前通过代理主机解决这些问题,redis-3后提供了 无中心化集群 配置解决方案(任何一台服务器都可以作为集群的入口,服务器之间可以互相连接。当以一台服务器为入口,但是请求不在这台服务器上,就交给集群中的下一台服务器进行匹配。同代理主机相比,需要主机更少)。
在这里插入图片描述
在这里插入图片描述
3)redis集群实现了对redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
4)redis集群可通过分区来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

(b)集群的实现
尚硅谷redis集群的实现

1)注意:
一个集群最少要有三个主节点;
选项(cluster-replicas 1)表示我们希望为集群中的每个主节点创建一个从节点;
分配原则尽量保证每个主服务器运行在不同的IP地址,每个从库和主库不在一个IP地址上。

2)Slots(插槽):
一个redis集群包含16384个插槽(hash slot),数据库中每个键都属于这16384个插槽中的一个。

集群使用公式CRC16(key)%16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。

集群中每个节点负责处理一部分插槽(如一个集群中有三个主节点-相对应3个从节点;节点A处理0-5460,节点B处理5461-10922,节点C处理10923-16383)。插槽属于哪个主服务器,则切换到这个服务器进行操作,后续再重复。

目的:为了把值平均分摊到集群中的不同主服务器。
在这里插入图片描述

3)在集群中录入值:
在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。

不在一个slot下的键值,是不能使用mget,mset等多键操作。

可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。

4)查询集群中的值
使用CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。
在这里插入图片描述
第一个cluster操作为查询cust的插槽值。
第二个命令为查询4847插槽中有几个key键。
第三个命令为查询插槽中具体的key键。10表示返回key键的数量,这里只有三个,则返回三个。

(c)集群中的Jedis开发
尚硅谷集群的Jedis开发
1)配合redis-6官方文档操作效果更好。
2)注:
即使连接的不是主机,集群会自动切换主机存储,主机写,从机读。
无中心化主从集群。无论从哪台主机写数据,其它主机都能读到数据。

(d)redis集群的优缺点
1)优点:
实现扩容
分摊压力
无中心化配置相对简单
2)缺点:
多键操作不被支持
多键的Redis事务不被支持,lua脚本不被支持
许多公司使用其它集群方案,如迁移到redis集群,复杂度较高。

要比较两个时间戳之间的差异,可以利用 `date` 命令或者编程语言(如 Python 或 Bash 脚本)来实现。以下是具体方法: ### 方法一:通过 Linux 的 `date` 和 `awk` 计算时间差 可以通过以下命令计算两个时间戳之间的时间差(单位为秒)。 ```bash #!/bin/bash timestamp1="2025-03-16T13:33:38+08:00" timestamp2="2021-04-22T08:25:10Z" # 将时间转换为 UTC 时间并获取 Unix 时间戳 time1=$(date -u -d "${timestamp1}" +%s) time2=$(date -u -d "${timestamp2}" +%s) # 计算时间差 diff=$((time1-time2)) echo "Time difference in seconds: $diff" ``` 上述脚本会将输入的时间戳转换为 Unix 时间戳,并计算两者之差[^1]。 --- ### 方法二:使用 Python 编写脚本来比较时间戳 Python 提供了强大的日期处理库 `datetime` 来解析 ISO 8601 格式的时间戳并进行运算。 ```python from datetime import datetime, timezone # 输入时间戳 timestamp1 = "2025-03-16T13:33:38+08:00" timestamp2 = "2021-04-22T08:25:10Z" # 解析时间戳 dt1 = datetime.fromisoformat(timestamp1).astimezone(timezone.utc) dt2 = datetime.fromisoformat(timestamp2.replace('Z', '+00:00')).astimezone(timezone.utc) # 计算时间差 delta = dt1 - dt2 print(f"Time difference: {delta.days} days, {delta.seconds} seconds") ``` 此代码片段能够正确解析带有时区偏移量的时间戳,并返回两者的天数和秒数差异[^2]。 --- ### 方法三:基于 Docker 日志功能间接验证时间戳 如果需要对比的是某个容器内的日志时间和外部指定时间,则可借助 `docker logs` 命令提取日志中的时间戳并与目标时间做比较。例如: ```bash CONTAINER_ID=cacf7a960d29 LOG_TIME="2023-04-29T19:22:53" # 获取自 LOG_TIME 后的日志条目 docker logs -t --since="$LOG_TIME" "$CONTAINER_ID" ``` 这一步骤可以帮助确认容器内部事件发生的具体时刻是否晚于给定的参考时间[^3]。 --- ### 总结 无论是采用 Shell 还是 Python 方案,均能有效完成对不同格式时间戳间差距的量化分析工作;而当涉及实际业务场景下的数据校验时,则可能还需要结合具体的上下文信息进一步细化逻辑设计[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值