3.6 3.6.1 3.7版本(3.5以上的)token删除失败
hsgmj opened this issue · comments
问题描述:应用里面有 “app" pc,然后在token列表选择app, 选择对应的token 点击删除 页面列表会少一条数据 同时提示成功。
但是 重新刷新则 会发现数据实际没有删除成功。查看redis里面
client_id_to_access:* 查出来对应的list里面对应token没有删除。
跟踪代码 发现 CustomRedisTokenStore对应的removeAccessToken里面
conn.get(accessKey);
conn.get(authKey);
List results = conn.closePipeline();
byte[] access = (byte[]) results.get(0);
byte[] auth = (byte[]) results.get(1);
实际上redis里面accessKey authKey都是可以查得到,但results.get(0) 基本上都是返回的空( 偶尔才返回)。
如果返回空
则:
conn.lRem(unameKey, 1, access);
conn.lRem(clientId, 1, access);
conn.del(serialize(ACCESS + key)); 这几行不会执行 导致lrem里面的list数据没有移除掉。
再次刷新 会发现如上图所示。有重复的也有用户名等信息不存在的现象 根本原因就是results.get(0) 和results.get(1)没有值导致 lRem没有执行。
证据:
- 下载github的3.7 3.6 3.6.1 3.5 在本地跑(相同的redis 5.0.3)
3.5没问题 每次都成功
3.5以上90%以上 概率会 byte[] access = (byte[]) results.get(0);返回的是空, byte[] auth = (byte[]) results.get(1);也80%概率是空。
2.当将openPipeline closePipeline等注释掉,然后用同步方式 如下:
byte[] access = conn.get(accessKey);
byte[] auth = conn.get(authKey);
则 不管是3.5 3.6 3.7都无问题
3.redis集群我们试过 4.0.11 和5.0.3 都一样 跟版本的关联性应该可以排除
如上测试也许不全面 但是希望有朋友能够帮忙看看解惑
参考commit:782b5e075bd34bcdc8b10e9a318df6e5fae87f53