需求说明:spring session中的用户session更新是更新key的名字,所以对于key的操作时需要用newkey 替换oldkey value值只允许存在一个,这里用到rename就很合适,单机是没问题的,但是redis的集群模式下,由于采用了虚拟槽进行数据存储,所以修改时会报错
RedisCluster的rename机制失败报错:(error) CROSSSLOT Keys in request don't hash to the same slot
![](https://www.codeprj.com/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTEzNzAyNi8yMDE5MDgvMTEzNzAyNi0yMDE5MDgyMzE1MzIyMTIzNC01MzE3NDg1NjgucG5n.png)
百度查询之后,需要用到hashtag标记下可以解决以上问题,redis提供了一种特定的标签{},这个{}内的字符串才参与计算hash slot.列如:{user}:aaa与{user}:bbb 这两个集合可以确保在同一个slot上。
![](https://www.codeprj.com/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTEzNzAyNi8yMDE5MDgvMTEzNzAyNi0yMDE5MDgyMzE1MzgwNDgyNy03ODY5NzY3MTYucG5n.png)
特地试了试,这个{user}的hashtag放在前中后都可以,然后,用spring session不断去请求存session,发现的确不报错了,另外一个坑点出现:数据倾斜
![](https://www.codeprj.com/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTEzNzAyNi8yMDE5MDgvMTEzNzAyNi0yMDE5MDgyMzE1NDI0MTcxOS0xNTcwODI5NTI2LnBuZw==.png)
上图可以看到关于{hh}的hash tag都在同一个redis实例上存储到对应的hash槽了,这个严重的数据倾斜问题会对单个实例的造成压力,一旦主从压垮,就会拖垮整个集群导致惊群效应
![](https://www.codeprj.com/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTEzNzAyNi8yMDE5MDgvMTEzNzAyNi0yMDE5MDgyMzE1NTEyNTEyMS0xNTk3NDI3NTEwLnBuZw==.png)
特此记录,路过的一定要注意下,我是没法更spring session的实现源码,如果你能避免掉就自己先删在存吧
![](https://www.codeprj.com/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTEzNzAyNi8yMDE5MDgvMTEzNzAyNi0yMDE5MDgyMzE1NTI0NDYyNC00ODYyMTE4NjcucG5n.png)
|