Redis HashTag
hashTag用于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主要作用是将某一固定特征数据存储到一台实例上,避免逐个查询集群中实例。例如将用户信息与用户订单数量存储到一个实例用于后续展示统计。
redis的pipline、lua命令涉及到的key都必须是同一个slot,否则会报错"command keys must in same slot"。
将用户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