问题描述:

键值数据库或者缓存系统,由于通常采用hash函数将key映射到对应的实例,造成key的分布与业务无关,但是由于数据量、访问量的需求,需要使用分布式后(无论是客户端一致性哈性、redis-cluster、codis),批量操作比如批量获取多个key(例如redis的mget操作),通常需要从不同实例获取key值,相比于单机批量操作只涉及到一次网络操作,分布式批量操作会涉及到多次网络io。

比如有1000个key,通过hash计算,落在10个节点上。如何快速访问这些key呢?

解决方案:

1、针对每个节点执行一次mget方法,需要10次网络IO。这里是串行执行10次mget。
在这里插入图片描述

2、将方案1改为并行执行mget。即多线程执行,网络IO次数虽然还是节点的个数,但因为是同时执行,所以网络时间变为o(1),但是这种方案会增加编程的复杂度。
在这里插入图片描述

3、那么我们能不能像使用单机redis一样,一次IO将所有的key取出来呢?hash-tag提供了这样的功能。
hash tag主要作用是将某一固定特征数据存储到一台实例上,避免逐个查询集群中实例。例如将用户信息与用户订单数量存储到一个实例用于后续展示统计。
缺点:可能会导致数据集中在一个实例中,造成数据倾斜,例如将用户1-10000的数据存储在一个实例中。
在这里插入图片描述

Logo

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

更多推荐