【问题标题】:Can you safely store JavaScript class instances in Redis? [duplicate]你能在 Redis 中安全地存储 JavaScript 类实例吗? [复制]
【发布时间】:2019-05-09 17:58:34
【问题描述】:

例如:

let client1 = new Client(); // it can do client1.connect() and other methods
await redis.hset('client1', JSON.stringify(client1));
client1 = await redis.get('client1');
client1 = JSON.parse(client1);
await client1.connect();

如果您要取回该值并使用 JSON.parse() 它,它仍然可以正常工作,这是否安全?

【问题讨论】:

  • JSON.stringify 将省略函数和一些其他值,如果Client 已经不是普通的 Json 对象,则这些值将难以重构。换句话说,你可以在 Redis 中存储某些类属性,但client1.connect() 肯定不行。
  • @p.s.w.g 如果我确实想将这些客户端存储在每个用户都有自己的客户端(用户:客户端)并且有 .connect() 工作的地图中,但在副本之间有相同的地图可用(其中这就是为什么我对使用 Redis 进行分布式键值感兴趣),有没有办法做到这一点?
  • 我很难想出你真正想要的任何理由。如果您尝试实现object pool,那么池实际上应该只存在于内存中。无论如何,永远不会有办法在两个服务器或进程之间共享一个对象的单个 instance,您必须以某种方式 clone 该对象,此时,您只需从一个进程传递可序列化的属性,并使用它们在另一个进程中构造一个新实例。
  • @p.s.w.g 这正是我想要的!好的,是时候学习一种新的设计模式了!非常感激。 ????

标签: javascript node.js redis


【解决方案1】:

也许你不能。

使用 JSON.stringfy(client) 时只能获取字符串,因此使用 JSON.parse() 时无法获取客户端。

不用redis也可以试试:

let client1 = new Client();
const clientStr = JSON.stringify(client1);
client1 = JSON.parse(clientStr);
await client1.connect();

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2012-10-20
    • 2022-01-01
    • 2023-04-08
    相关资源
    最近更新 更多