粗略看了一下,是个用 map 和 vector 的轮子,CRUD 只实现了 C, 目的是为了解决 Ruby String 对象的内存占用问题,特别是重复对象和空值。
所以 Readme 中提到的 480MB 的 Ruby 内存占用我不知道你是不是用了 freeze
或 # frozen_string_literal: true
, 另外,Ruby 3.4 默认设置了 frozen_string_literal 为 true, 如果你有 1440000 个字符串,可以升级 Ruby 看一下内存占用。
你的 gem 在我看来只适合你的特定场景,一个健壮的 rails 系统要尽量减少 gem, 如果内存溢出,得排查老半天,如果不是自己写的 gem, 灾难程度还要升级。
因为内存的特性,内存中的数据只适合做缓存,如果真要在本地用几百 MB 的缓存,我可以在本地装个 Redis 就可以了,Redis 默认还有持久化,速度也能保证。当然,我最先会考虑 ActiveSupport::Cache::MemoryStore
, Redis 都不会装。
MemoryStore 的 ruby 对象设计也很优雅,内存限制内不会被清理,超过设定值后,最久未使用(LRU)项会被清理。现在内存这么便宜,我在欧洲 OVH 16 欧元/月的服务器都是 64 GB 内存,为什么还要折腾代码?