Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我应该使用Redis哈希还是Ruby哈希?_Ruby On Rails_Ruby_Multithreading_Hash_Redis - Fatal编程技术网

Ruby on rails 我应该使用Redis哈希还是Ruby哈希?

Ruby on rails 我应该使用Redis哈希还是Ruby哈希?,ruby-on-rails,ruby,multithreading,hash,redis,Ruby On Rails,Ruby,Multithreading,Hash,Redis,我有一个Rails应用程序,在其中我必须维护一个哈希,该哈希将由多个线程同时访问 大多数访问都是读取,很少有写入。我试图在使用Ruby哈希和Redis哈希之间做出选择 Redis散列是线程安全的,可以将数据存储到磁盘。但是,坚持并不是所有必要的 此外,对散列的写入并不频繁,要写入的数据基本上就是写入数据的时间本身。因此,即使它不是线程安全的,由于竞争条件导致的精度损失也是可以接受的,因为并发写入之间的时间最多只能变化几秒钟 使用单例Ruby哈希的唯一问题是更新不是线程安全的,也不是原子的。那么,

我有一个Rails应用程序,在其中我必须维护一个哈希,该哈希将由多个线程同时访问

大多数访问都是读取,很少有写入。我试图在使用Ruby哈希和Redis哈希之间做出选择

Redis散列是线程安全的,可以将数据存储到磁盘。但是,坚持并不是所有必要的

此外,对散列的写入并不频繁,要写入的数据基本上就是写入数据的时间本身。因此,即使它不是线程安全的,由于竞争条件导致的精度损失也是可以接受的,因为并发写入之间的时间最多只能变化几秒钟

使用单例Ruby哈希的唯一问题是更新不是线程安全的,也不是原子的。那么,同步的非原子密钥更新会导致异常吗

如果不是,那么维护没有锁的单例Ruby哈希有意义吗

我对使用Redis散列的担心是内存中散列的大小可能大于Ruby散列以及调用Redis服务器的开销。并发性和持久性很好,但不是必需的

请让我知道你的想法。谢谢。

(这是根据霍尔格刚才纠正我的评论所作的更正。)

有一个库专门为您的需要而设计,名为
并发ruby

请点击查看

它有一个Hash类()和一个Map类(),他们说这个类速度更快,但不完全符合Ruby Hash的语义(例如,不保证按键插入顺序排序)

请注意,安装gem后,使用它所需的
require
与gem名称不同;您
需要并发

require 'concurrent'
h = Concurrent::Hash.new

不过,我没有使用过它,因此我无法提供任何个人反馈。

一旦在生产环境中运行应用程序,您可能需要运行多个Worker,甚至在多个服务器上运行应用程序。也就是说:Redis可能是个更好的主意。我正在Puma上运行这个应用程序,它可以使用多个工人。那么,这是否意味着如果我在涉及多个工作者时使用单例哈希,不同的工作者将有不同的应用程序实例,因此,每个实例都有不同的哈希?如果是这样的话,Redis会是生成全局可用散列的唯一选项吗?这是正确的:Puma工作者在不同的进程中运行,并且不共享内存。但您也可以将puma配置为在共享内存的多个线程中运行。所以答案是:这取决于你的配置。Redis可以在所有配置下工作——即使是多台服务器……gem被合并到包含许多附加原语的gem中。因此,线程安全gem已被弃用,并被视为仅处于维护模式。因此,对于新的开发,您可能应该使用并发ruby。由于ActiveSupport 5依赖于并发ruby,因此使用起来也应该相当安全。