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

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

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

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

8195 次点击
所在节点    Java
44 条回复
phantomzz
2019-11-20 09:32:32 +08:00
knightdf
2019-11-20 09:42:19 +08:00
为啥 redis 不考虑?明明 redis 就是就是最适合你的,redis 单机集群都可以用
hyl24
2019-11-20 09:43:17 +08:00
hash 冲突是必然存在的。建议好好学习一下 hashmap 原理。redis 也可以很简单呀单机使用没啥麻烦的。当然也可以选择 ehcache 或者 guava 的缓存 都是 java 进程内的缓存。。。。其次好像没有什么东西是可以永久存在内存中的吧。系统重启都需要从持久化到磁盘的数据恢复到内存的,不然也是内存预热重新加载进去的。
tusik
2019-11-20 09:43:57 +08:00
h2 也行,redis 单机也能跑得很好啊
xmh51
2019-11-20 09:45:06 +08:00
hash 重复 不代表不能识别不同的 key 呀。hash map 保证 key 的唯一性
changdy
2019-11-20 09:49:17 +08:00
感觉楼主思路有点不清晰
一方面追求性能 但是另外一方面对 内存 以及 hashmap 的模型并不清楚.
其实读取数据+序列化反序列化的耗时在一套业务逻辑里面耗时是比较低的

如果自己实现的话 一定要注意线程安全
passerbytiny
2019-11-20 09:55:55 +08:00
你是不是对 数据库 这三个字的量级有误解?不管是 HashMap 还是 Key-Value,最多只能叫做(内存)数据,而不是(内存)数据库。
Oracle (公司)有一款内存数据库,其他大型数据库厂商一般也都会有内存数据库,它们在操作方式上属于仅提供有限功能的标准关系型数据库,掏钱就能用。除此之外,Redis 是最入门的 NoSQL 型内存数据库了,入门到功能都不完全,需要搭配 Spring Data Redis 配套使用。
woshiaha
2019-11-20 09:55:57 +08:00
我听说 HashMap,如果用字符串做 key,似乎会有 Hash 值重复的可能?

------如果你 HashMap 都没整明白的话,还是直接用 redis 算了。。。。
min
2019-11-20 09:58:12 +08:00
nnnToTnnn
2019-11-20 09:59:17 +08:00
```
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```

如果这还存在 hash 冲突,建议你去买张彩票,说真的。
wysnylc
2019-11-20 10:00:27 +08:00
apache 有 lru
但是建议使用 redis
zunceng
2019-11-20 10:19:26 +08:00
blotdb rocksdb 这种? 或者直接 sqlite
crossoverJie
2019-11-20 10:19:38 +08:00
本地缓存配合 Redis 使用也很常见,推荐使用 Google 的 Guava 库,各种缓存特性都有。
tctc4869
2019-11-20 10:30:23 +08:00
@passerbytiny 内存数据库不就是缓存库的一种称呼吗?
你就这么纠结“数据库”这个三个字的文字概念吗,“不管是 HashMap 还是 Key-Value,最多只能叫做(内存)数据,而不是(内存)数据库。”,HashMap 在你眼里只能叫数据,key-value 只能叫数据?那 leveldb 这种持久化的 kv 数据库在你眼里就不是数据库了,叫数据文件是吧,你的意思是瞧不起持久化的 kv 数据库吗,那 sqlite 这种也不是数据库,是数据文件对吧。文字游戏好玩吗。

redis 数据库有缓存库功能,也有持久化功能,那它就不是内存数据库?或者不是磁盘数据库了?你纠结文字概念干嘛,分的清楚就可以。我是来问怎么选缓存库方案的,不是来玩文字概念游戏的。内存数据库的合适称呼是叫缓存库,谁不知道?与之不同的是磁盘数据库,网上叫来叫去都说成约定俗成了,我用"内存数据库"这个词不行吗。
newtype0092
2019-11-20 10:30:32 +08:00
要达到你的要求我一时还真想不到比 redis 更简单更高效的东西了。。。
打开 redis 官网第一段话的介绍,只有最后一句提到了通过集群方式可以提供一些高可用特性,“面向分布式集群”是你自己给自己加戏~
haoz1w0w
2019-11-20 10:31:35 +08:00
@nnnToTnnn #10 肯定会存在 hash 冲突的 否则 hashmap 为什么要挂个链表呢?
yuikns
2019-11-20 10:38:59 +08:00
我寻思楼主就是想要一个基于 Java 的 embedded cache solution

guava 有个 CacheBuilder 似乎就是你想要的? https://github.com/google//wiki/CachesExplained
yuikns
2019-11-20 10:44:33 +08:00
passerbytiny
2019-11-20 10:46:28 +08:00
@tctc4869 #13 拜拜
tctc4869
2019-11-20 11:07:44 +08:00
@newtype0092 我目前其实并不想要具备的持久化功能的缓存库,而且不是 xml 中配置,是直接在 java 通过静态字段的 new 的方式,直接以 new 或创建为配置的那种,然后用封装一下,例如用静态的 hashMap 作为一个缓存库,但静态的 hashmap 功能有点少。redis 配置有点麻烦,而且关乎于端口和 ip,楼上有人推荐 guava,caffeine 这两种的话比较符合,可以直接在 java 中通过静态字段的进行 new 创建的方式进行配置。毕竟不同的缓存功能要对应不用的数据类型,简单可以直接有 hashmap,有些还得具备的简单的关系数据功能。

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

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

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

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

© 2021 V2EX