在本地用内存数据库,除了 hashMap,还有哪些内存数据库方案?

2019-11-20 09:25:18 +08:00
 tctc4869

目前主要是在单个服务器上使用,暂不考虑 redis 这种比较复杂面向分布式集群的内存数据库,首先是性能优先。我听说 HashMap,如果用字符串做 key,似乎会有 Hash 值重复的可能?

在 Spring 容器启动时会读取数据库的一些数据,并会永久地驻留在服务端的内存中。而另一些数据类型会有过期处理等,如果要用 kV 类型的内存数据库的话,有些数据类型,可能会用整型做 key,也可能会用字符串做 key,这两种方式不可避免

8217 次点击
所在节点    Java
44 条回复
boyhailong
2019-11-20 11:08:26 +08:00
单机使用的内存数据库还是本地缓存?
单机 redis 的确是最优解,具体的过期需求可以设置,占用总内存也可以设置,单机还是集群可配置,是否存储落地也可配置,搜“AOF 和 RDB 禁止持久化”。你能想到的关于内存数据库的使用场景,redis 开发者都想到了,蟹蟹
skypyb
2019-11-20 11:52:59 +08:00
redis 还配置麻烦?你在这发帖的几十分钟里够配置十来个集成 redis 的 spring 项目了。
sunjiayao
2019-11-20 12:12:40 +08:00
楼上 guava 正解
fengpan567
2019-11-20 12:26:29 +08:00
ehcache
kayv
2019-11-20 12:39:06 +08:00
ehcache 或者 google guava 都可以。如果缓存不需要失效,直接上 Map
zhuangzhuang1988
2019-11-20 13:17:38 +08:00
nnnToTnnn
2019-11-20 13:28:10 +08:00
@haoz1w0w 是存在理论上的 hash 碰撞,这个 hash 碰撞还不如 md5 的 hash 碰撞明显,如果真的存在 hash 碰撞了,你的机器内存也并不足够支撑你的数据存储。 如果你觉得这样不保险。还可以继续加盐值,但是我觉得没有必要了。

你可以参考下 md5 的 hash 碰撞需要多大的数据量
nnnToTnnn
2019-11-20 13:38:42 +08:00
准确的说,这个 hash 碰撞,不如 md5 16 的明显,在 md5 32 中加大的盐值,减少了碰撞几率。

理论 hashmap 的 key 字节大小相差特别大,才能可能遇到 hash 碰撞。

我实在是不明白,什么样的情况下你的 key 会大到产生 hash 冲突? 这让我很懵啊。
Bromine0x23
2019-11-20 13:50:00 +08:00
用 Redis 和 new 对象又不矛盾,spring-data-redis 就有对 redis 包装的容器类实现
MyShoW
2019-11-20 14:08:48 +08:00
redis+redisson 也可以考虑一下,直接操作对象,不用关心 redis 的存取
haosamax
2019-11-20 18:01:00 +08:00
冲突的概率也太小了吧,就算冲突了又有什么关系呢
sagaxu
2019-11-20 18:32:02 +08:00
连 map 是啥都不知道的人,也来看不起内存 map 之王了?
CoderGeek
2019-11-20 20:38:56 +08:00
guava Caffeine
ErrorMan
2019-11-20 20:43:50 +08:00
内存型数据库 h2,可以嵌入 java
hantsy
2019-11-20 20:46:22 +08:00
@tctc4869 Hazelcast , infinispan
hzgit
2019-11-20 21:21:43 +08:00
比较主流的就是 guava cache 和 encache 了 ( ps. HashMap 并不是内存数据库哦)
Raymon111111
2019-11-20 21:28:36 +08:00
?

如果你是为了解决 hash 冲突

那应该是没有现成方案的
zhady009
2019-11-20 21:59:27 +08:00
@MyShoW 这个最近在用 真的香
areless
2019-11-20 22:15:56 +08:00
key md5 值建文件夹,把 val 写 key 的 md5 文件夹内的文件内,假若是 obj 序列化,json 分多文件,存到 linux 的 shm 里,这就是最简单的内存 kv 数据库了,以前称之为文本数据库。而且速度不会太慢。mysql 的慢是因为 sql~~~假设 sql 查询通过 gpu 去操作显存就没有像 cpu 去操作机械硬盘这种低速记录体的瓶颈。所以未来会回归 sql,淘汰掉 nosql 做前置缓存的。所以别研究怎么搞一个速度比舒马赫还快的 kv 或者 hashmap,研究一下怎么让正规的 sql 比拟 nosql 吧
areless
2019-11-20 22:26:29 +08:00
sql 快了,那么构架就回归原始。现在像巫师一样的构架师~~~全文本外部索引用 es,kv 用 redis,存储用 mysql 或 pg 或等等等。http 请求负载,构架的重要胜于传统,胜于标准化。这是不合理的。用 sql like 快于 es,sql 内存表快于 redis,apache 常驻模式快于 nginx 才是标准化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX