redis string 看起来像一个 hash,获取值

redis string looks like a hash, getting the value

我正在尝试从 node.js 访问存储在 redis 中的会话数据。 在 redis-cli 我 运行 键 * 和 returned

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

它returns

ERR Operation against a key holding the wrong kind of value

所以我运行 进行了一次TYPE 检查,发现它不是散列而是字符串。我现在有点困惑,因为整个事情看起来像一个散列,我无法弄清楚如何 return 我需要的值,因为只是调用 get returns 整个事情。

是否需要使用其他命令来获取值?

谢谢

  1. 这是一个字符串
  2. 您无法直接获取某些会话值,因为它已序列化为某种格式(在本例中为JSON)
  3. 如果会话是由node.js编写的,您应该使用相同的API来读取。
  4. 如果session是其他系统写的,必须用node解析,就直接GET,然后json解析(JSON.parse)

如果您可以 GET aganist 密钥那么它不是哈希,因为您会得到 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)