需求說明:spring session中的用戶session更新是更新key的名字,所以對於key的操作時需要用newkey 替換oldkey value值只允許存在一個,這里用到rename就很合適,單機是沒問題的,但是redis的集群模式下,由於采用了虛擬槽進行數據存儲,所以修改時會報錯
RedisCluster的rename機制失敗報錯:(error) CROSSSLOT Keys in request don't hash to the same slot
百度查詢之后,需要用到hashtag標記下可以解決以上問題,redis提供了一種特定的標簽{},這個{}內的字符串才參與計算hash slot.列如:{user}:aaa與{user}:bbb 這兩個集合可以確保在同一個slot上。
特地試了試,這個{user}的hashtag放在前中后都可以,然后,用spring session不斷去請求存session,發現的確不報錯了,另外一個坑點出現:數據傾斜
上圖可以看到關於{hh}的hash tag都在同一個redis實例上存儲到對應的hash槽了,這個嚴重的數據傾斜問題會對單個實例的造成壓力,一旦主從壓垮,就會拖垮整個集群導致驚群效應
特此記錄,路過的一定要注意下,我是沒法更spring session的實現源碼,如果你能避免掉就自己先刪在存吧