要知道什么是数据倾斜就的搞清楚redis是怎么存储和访问数据的。数据会按照一定的规则分布到不同槽上,然后槽又落在不同的机器节点上。比如把key进行crc16函数计算后的值对槽取模,然后槽会分配到不同的节点上。然后存取都会到对应的节点上去进行处理。
倾斜可以分为两类:
1,存储倾斜。指不同节点上存储的数据量很不均匀,如一台存的很多,一台存的很少。
2,访问倾斜。数据存储都差不多,但是访问很倾斜的打到一台节点上。
为什么会造成存储倾斜呢?
1,bigkey导致。bigkey的意思就是key的value非常大。存了很大的字符串或者集合。解决办法就是把数据分开存储到多个key上即可。
2,槽分配不均匀导致。redis有16000多个槽,数据会存储在这些槽上,实际这些槽会分布到具体的实体机器上。这个分配是可以手动的,如果哪台机器性能较好,完全可以多分配些槽上去。
3,哈希标签(Hash Tag)方式。hashTag的意思是在key中加一对括号。比如user:{123},那么计算槽时就只会用123计算,而不是整个user:{123}计算。
访问倾斜又是怎么回事呢?
访问倾斜其实就是典型的热点数据。比如用redis做博客,明星发布了一个什么吃瓜消息后。同时几十万上百万的请求都想看这个新闻,那么这个访问就发生了倾斜。如果请求都打到一台机器上,肯定完蛋。
怎么应对热点数据?
其实也是要将数据分开存储到不同的机器上,让更多的机器来抗压力。数据怎么存储多份呢?
key | 槽 | 机器 |
key=热点事件:XX明星结婚:随机key1 | 1024 | 1 |
key=热点事件:XX明星结婚:随机key2 | 2048 | 2 |
key=热点事件:XX明星结婚:随机key3 | 3096 | 3 |
然后访问的时候随机的带上当时存储的随机key就可以把请求分摊到多台机器上了。