hash tag用于redis集群中。其实现方式为在key中加个{},例如test{1}。使用hash tag后客户端在计算key的crc16时,只计算{}中数据。如果没使用hash tag,客户端会对整个key进行crc16计算。下面演示下hash tag使用。

127.0.0.1:6380> cluster keyslot user:case
(integer) 9491
127.0.0.1:6380> cluster keyslot user:case{1}
(integer) 9842
127.0.0.1:6380> cluster keyslot user:info
(integer) 15429
127.0.0.1:6380> cluster keyslot user:info{1}
(integer) 9842


通过以上代码可以看到,不使用hash tag 对应的hash slot是不同的,使用后则会对应到一个hash slot中

 优点:

      hash tag主要作用是将某一固定特征数据存储到一台实例上,避免逐个查询集群中实例。例如将用户信息与用户订单数量存储到一个实例用于后续展示统计。

将用户id为1的相关信息存储在6380实例
127.0.0.1:6380> set user:info{1} 基本信息
OK
127.0.0.1:6380> set user:order{1} 2
OK
127.0.0.1:6380> keys *
1) "user:order{1}"
2) "user:info{1}"

缺点:

        可能会导致数据集中在一个实例中,造成数据倾斜,例如将用户1-10000的数据存储在一个实例中。

如果只有1-10000的用户有订单信息,那么相当于所有信息都存储在了6380这台实例中
127.0.0.1:6380> set user:1:order{1-10000} 2
OK
127.0.0.1:6380> set user:2:order{1-10000} 2
OK
127.0.0.1:6380> set user:3:order{1-10000} 2
OK

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐