Goland中Redis的set求並集的錯誤處理

1、 文檔介紹python

今日在項目裏寫了一份簡單的redis兩個set類型求並集的操做redis

不斷報錯,在網上查到的資料裏都簡單介紹了自帶的API接口,可是這個並非全部時間都好用的,甚至能夠說對分佈式而非主機redis來說基本上都是很差用的分佈式

 

2、網傳解決辦法spa

個人代碼調試

func ListUnion2() ([]string, error){
	res, err := redisClient.SUnion(DB_SET, List_Only_Dump).Result()
	DBIgnoreRedisNil(err)
	return res, err
}

 

3、報錯緣由code

WARN CROSSSLOT Keys in request don't hash to the same slot

報錯如上圖所示,意思是「沒法將請求中的CROSS SLOT密匙哈希寫入同一槽中」blog

首先咱們簡單理解一下,Key咱們稱爲密匙,咱們要對兩個不一樣的密匙進行操做不只要求兩個密匙位於相同的節點上,還要求位於相同的哈希槽中,報錯的緣由就是由於兩個密匙不位於相同的哈希槽中,解決辦法見下面👇接口

 

4、簡單理解Redis Cluster讀寫過程ip

redis集羣模式下的讀寫過程當中, 先對key進行hash找到slot進而找到clusterNode,若是clusterNode不是本節點就返回ASK或者MOVED錯誤碼讓客戶端向新的節點ip:port發起鏈接。
也就是按照key->hash值->slot->clusterNode的順序定位到key保存的clusterNode節點。
在完成clusterNode判斷後若是肯定是本節點後執行後續的讀寫操做便可。
 
5、解決辦法
我是採起了比較愚鈍的辦法,建立了一個SET,將須要合併的兩個SET裏面的內容取出來以後再add到新的SET裏面
這裏一個問題就是Goland自己是沒有SET結構的,咱們若是想要使用的話須要手動實現,我今天先在REDIS上申請了一個SET類型來調試這個bug,在後續調試晚以後再手動實現SET
代碼以下:
func ListUnion() ([]string, error){
	redisClient.Del(Union_List)
	res := []string{}
	dbList, err := redisClient.SMembers(DB_SET).Result()
	if err != nil{
		return res, err
	}
	onlyDumpList, err := redisClient.SMembers(List_Only_Dump).Result()
	if err != nil{
		return res, err
	}
	for _, dbName := range dbList{
		_, err := redisClient.SAdd(Union_List, dbName).Result()
		if err != nil{
			return res, err
		}
	}
	for _, dbName := range onlyDumpList{
		_, err := redisClient.SAdd(Union_List, dbName).Result()
		if err != nil{
			return res, err
		}
	}
	res, err = redisClient.SMembers(Union_List).Result()
	return res, err
}
相關文章
相關標籤/搜索