瞎扯淡 我是不是可以把 HashMap 当作一种实现缓存的方法。

frank · 2013年09月18日 · 最后由 frank 回复于 2013年09月27日 · 8902 次阅读

拿 JAVA(也可是 Ruby 或其他语言)来说,HashMap 对象是 Key Value 形式,也是放到内存中。 而 Redis 和 Memcached 也是 Key Value 形式,也是放到内存中。我是不是在某些不方便或者不值得用 Redis 或者 Memcached 的情况下。用 HashMap 来存储或者缓存数据?

MemoryStore

参考 Rails Cache 中的 Memory Store

#2 楼 @nouse wocao 好厉害!

如果 Hash 的大小有 1G,当你 hash.to_json 写入磁盘时,会很卡吧?一般也不写入?

可以啊,就是内存缓存嘛,缺点是这只是应用内缓存,用 Redis 可以多个应用共享呗

最好根据 key 做个分布式处理

可以,不过别滥用,内存和缓存都由同一个应用管理不好。

#7 楼 @gihnius 恩。我觉得临时可以用下,在数据量不是很大的时候。

可苦了 ruby gc 了,普通 ruby 进程 100-200m 的内存 gc 已经很痛苦了;做缓存动辄几十 G,一 gc 就得等很长时间了吧。

#9 楼 @kevinxu 你想的严重了。那么多数据,估计谁都不会用 HahMap.超过 3M 我都不会考虑。我只是觉得他们的原理类似。

#10 楼 @frank 原理上,都是放在内存里面的,从这点上来讲确实一样。但同 Redis 之类的缓存在性能和使用上都很不一样。 使用上,你这个 HashMap 是单进程里的多线程共享,但本机的其他进程和其他服务器的进程都不能访问这块 HashMap。扩展和通信都很不方便。你如果给这个进程加上一系列的访问接口,那么就是一种 redis 或者 memcached。

HashMap 的性能一般,几百万个 key 的时候就有点慢了。

另外,Java 的话,内存数据不共享问题不大,毕竟大部分 java web 都是只跑一个 tomcat 或者 jetty 进程。但 rails 就两样了,一般都是好几个进程开着的,如果 20 个进程各自建一套缓存,显然不如一起合用 redis 节约的多。

#11 楼 @swachian 多谢普及知识!

@frank https://github.com/djreimer/mini_cache 我想你说的意思与这个小项目正合你意,代码也简单,可以了解一下。

#13 楼 @qichunren 恩,多谢!十一期间抽个时间看看。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号