redis随笔

Jedis-Cluster与HashTags深入解析
本文详细分析了Jedis-Cluster的工作原理,包括连接集群、数据存取流程,以及如何通过HashTags实现相关联业务数据的原子性操作。深入探讨了在Redis集群环境中,如何利用HashTags确保一组key在相同节点上,以解决数据分布与原子操作之间的矛盾。

redis官网:https://redis.io/

redis中文网:http://www.redis.net.cn/

一、

Jedis-cluster原理分析

连接方式

Set<HostAndPort> hostAndPorts=new HashSet<>();

HostAndPort hostAndPort=new HostAndPort("192.168.11.113",7001);

HostAndPort hostAndPort1=new HostAndPort("192.168.11.114",7002);

HostAndPort hostAndPort2=new HostAndPort("192.168.11.115",7003);

HostAndPort hostAndPort3=new HostAndPort("192.168.11.116",7004);

hostAndPorts.add(hostAndPort);

hostAndPorts.add(hostAndPort1);

hostAndPorts.add(hostAndPort2);

hostAndPorts.add(hostAndPort3);

JedisCluster jedisCluster=new JedisCluster(hostAndPorts,6000);

jedisCluster.set("test","testtest");

原理分析

程序启动初始化集群环境

1)、读取配置文件中的节点配置,无论是主从,无论多少个,只拿第一个,获取redis连接实例

2)、用获取的redis连接实例执行clusterNodes()方法,实际执行redis服务端cluster nodes命令,获取主从配置信

3)、解析主从配置信息,先把所有节点存放到nodesmap集合中,key为节点的ip:portvalue为当前节点的

jedisPool

4)、解析主节点分配的slots区间段,把slot对应的索引值作为key,第三步中拿到的jedisPool作为value,存储在

slotsmap集合中

就实现了slot槽索引值与jedisPool的映射,这个jedisPool包含了master的节点信息,所以槽和几点是对应的,与

redis服务端一致

从集群环境存取值

1)、把key作为参数,执行CRC16算法,获取key对应的slot

2)、通过该slot值,去slotsmap集合中获取jedisPool实例

3)、通过jedisPool实例获取jedis实例,最终完成redis数据存取工作

二、

HashTags

通过分片手段,可以将数据合理的划分到不同的节点上,这本来是一件好事。但是有的时候,我们希望对相关联的

业务以原子方式进行操作。举个简单的例子

我们在单节点上执行MSET , 它是一个原子性的操作,所有给定的key会在同一时间内被设置,不可能出现某些指定

key被更新另一些指定的key没有改变的情况。但是在集群环境下,我们仍然可以执行MSET命令,但它的操作不

在是原子操作,会存在某些指定的key被更新,而另外一些指定的key没有改变,原因是多个key可能会被分配到不

同的机器上。

所以,这里就会存在一个矛盾点,及要求key尽可能的分散在不同机器,又要求某些相关联的key分配到相同机器。

这个也是在面试的时候会容易被问到的内容。怎么解决呢?

从前面的分析中我们了解到,分片其实就是一个hash的过程,对keyhash取模然后划分到不同的机器上。所以为

了解决这个问题,我们需要考虑如何让相关联的key得到的hash值都相同呢?如果key全部相同是不现实的,所以

怎么解决呢?在redis中引入了HashTag的概念,可以使得数据分布算法可以根据key的某一个部分进行计算,然后

让相关的key落到同一个数据分片

举个简单的例子,加入对于用户的信息进行存储, user:user1:iduser:user1:name/ 那么通过hashtag的方式,

user:{user1}:iduser:{user1}.name; 表示

当一个key包含 {} 的时候,就不对整个keyhash,而仅对 {} 包括的字符串做hash

在key中通过增加{}来确保在hash的时候在同一个节点

 

 

### Redis 详细教程与使用指南 Redis 是一种高性能的键值对数据库,支持多种数据结构操作以及丰富的功能特性。以下是关于 Redis 的一些核心概念及其应用。 #### 主从复制机制 Redis 支持主从复制模式,这种模式允许将一台 Redis 服务器的数据同步到其他 Redis 服务器上。在这种架构中,提供数据写入服务的是主节点(master),而负责处理读请求的主要由从节点(slave)完成[^1]。通过这种方式可以有效分担负载压力,并提升系统的可用性和扩展能力。 #### 数据持久化方式 为了防止因意外宕机而导致数据丢失,Redis 提供了两种主要的持久化方法——RDB 和 AOF。 - **RDB (Redis DataBase)**: 这种方式会在特定的时间间隔内创建内存中的数据快照并将其保存至硬盘文件里。它适合于那些能够容忍一定范围内数据损失的应用场景[^2]。 - **AOF (Append Only File)**: 不同于 RDB 定期生成整个数据集副本的做法,AOF 则会记录每一个修改命令,在程序重启时重播这些日志从而重建原始状态。尽管这种方法通常会产生更大的日志体积,但它能带来更高的安全性保障[^2]。 #### 常见应用场景 除了基本的键值存储外,Redis 还广泛应用于以下几个领域: - **热点数据缓存**: 将频繁访问的信息驻留在高速 RAM 中以加速查询响应速度[^3]; - **限时促销活动的支持**: 如秒杀活动中临时存储商品库存数量等动态变化较大的数值型字段[^3]; - **计数统计需求满足**: 实现点赞次数累积计算等功能可通过 INCR 指令轻松达成目标[^3]; - **排行榜维护**: 对象分数排序展示可借助 Sorted Set 结构高效管理; - **分布式环境下的协调工具**: SETNX 可用于构建简单的互斥锁解决方案以便控制并发流程[^3]。 ```python import redis # 创建连接池实例 pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) # 获取客户端对象 r = redis.Redis(connection_pool=pool) # 设置key-value pair 并设置过期时间为5秒 r.set('test_key', 'value_data', ex=5) print(r.get('test_key')) # 输出 value_data 后经过约五秒钟再次尝试获取则返回 None ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值