Spring Data Redis - Redis Repositories使用技巧

使用Redis Repositories可以方便的在redis中用Redis Hash的方式存儲(chǔ)各種對(duì)象類型。
使用方法非常簡(jiǎn)單,僅需定義接口和在需要存儲(chǔ)的對(duì)象上增加注解:

@RedisHash("people")
public class Person {

  @Id String id;
  String firstname;
  String lastname;
  Address address;
}
public interface PersonRepository extends CrudRepository<Person, String> {

}

分片技巧——Hash Tags

在使用redis的集群模式后,redis會(huì)對(duì)數(shù)據(jù)進(jìn)行分片,分片能使key均勻地分布到集群的機(jī)器上去,能保證數(shù)據(jù)的一致性,有著眾多的優(yōu)點(diǎn)。但是在某些業(yè)務(wù)場(chǎng)景,又要求某些相關(guān)聯(lián)的key分配到相同機(jī)器。這就是分片技術(shù)的矛盾之處。

解決方法還是從分片技術(shù)的原理上找:分片,就是一個(gè)hash的過(guò)程:對(duì)key做md5,sha1等hash算法,根據(jù)hash值分配到不同的機(jī)器上。為了實(shí)現(xiàn)將key分到相同機(jī)器,就需要相同的hash值,即相同的key(改變hash算法也行,但不簡(jiǎn)單)。但key相同是不現(xiàn)實(shí)的,因?yàn)閗ey都有不同的用途。

例如user:user1:ids保存用戶的tweets ID,user:user1:tweets保存tweet的具體內(nèi)容,兩個(gè)key不可能同名。仔細(xì)觀察user:user1:ids和user:user1:tweets,兩個(gè)key其實(shí)有相同的地方,即user1。能不能拿這一部分去計(jì)算hash呢?

這就是Hash Tag,允許用key的部分字符串來(lái)計(jì)算hash。當(dāng)一個(gè)key包含 {} 的時(shí)候,就不對(duì)整個(gè)key做hash,而僅對(duì) {} 包括的字符串做hash。假設(shè)hash算法為sha1。對(duì)user:{user1}:ids和user:{user1}:tweets,其hash值都等同于sha1(user1)。

Spring Data Redis的官方文檔也建議在使用Cluster模式的時(shí)候使用Hash Tag,這樣可以讓對(duì)象的屬性位于同一個(gè)分片,方便查找和計(jì)算。

參考文獻(xiàn):

  1. Redis技巧:分片技術(shù)和Hash Tag
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容