0

我正在尝试从存储在 redis 中的 node.js 访问会话数据。在 redis-cli 我运行 Keys * 并返回

1) "sess:ZRhBJSVLjbNMc-qJptjiSjp8lQhXGGBb"
2) "sess:6p1EcGvJukTT26h88NqoTGdz2R4zr_7k"

如果我然后运行 ​​GET 我会返回看起来像哈希的东西

redis 127.0.0.1:6379> GET sess:ZRhBJSVLjbNMc-qJptjiSjp8lQhXGGBb
"{cookie:{originalMaxAge:null,expires:null,httpOnly:true,path:/},userKey:a92ca307-b315-44bc-aadf-da838d063c78,
authenticated:true,clientKey:1ccb5308-2a7e-4f49-bcdf-b2379de44541}"

如果我尝试使用 userKey 获取值

hget sess:oq6RW1zP7sfcZZc4wb1RHbti390FxL7- userKey

它返回

ERR Operation against a key holding the wrong kind of value

所以我运行了一个类型检查,发现它不是一个哈希值而是一个字符串。我现在有点困惑,因为整个事情看起来像一个哈希,我无法弄清楚如何返回我需要的值,因为只是调用 get 会返回整个事情。

我需要使用其他命令来获取值吗?

谢谢

4

2 回答 2

2

如果您可以 GET 反对者密钥,那么它不是哈希,因为您将获得ERR Operation against a key holding the wrong kind of value. 并且您自己进行了 HGET 并得到了错误的确认。

可能键看起来像散列,因为(它是散列但不是 redis 散列数据类型)它是在客户端的会话 cookie 中发给用户的唯一令牌。当用户在每个请求中将此 cookie 发送到服务器时,服务器可以使用 cookie 值作为 redis 键从 redis 检索会话信息。

该值是 JSON 格式的字符串。您必须检索整个值并对其进行解析;在node.js中使用JSON.parse可以完成这项工作。解析值后,您将拥有一个 JavaScript 对象,可以以标准方式访问其属性:

var sessionData = JSON.parse(JSONString);
console.log(sessionData.userKey)
于 2016-01-15T07:16:40.177 回答
1
  1. 这是一个字符串
  2. 您无法直接获取某些会话值,因为它已序列化为某种格式(在本例中为 JSON)
  3. 如果 session 是由 node.js 编写的,你应该使用相同的 API 来读取。
  4. 如果session是其他系统写的,必须用node解析,直接GET,json解析(JSON.parse)</li>
于 2016-01-15T07:08:24.990 回答