请问有没有一种 key-value 存储数据库,超时后不销毁而是持久化

2014-03-06 18:57:50 +08:00
 oldcai
没超时的适合,保存在内存中,timeout后持久化,可以下次通过key查询到。

redis持久化只是一定时间将整个内存dump一次(类似这种机制),不针对某个key;
memcached好像就没有持久化机制。

先谢过啦~
3863 次点击
所在节点    问与答
19 条回复
binux
2014-03-06 19:07:23 +08:00
为什么没有超时的时候不持久化?
arbipher
2014-03-06 19:09:41 +08:00
你这个叫缓存
oldcai
2014-03-06 19:09:52 +08:00
@binux 那disk的io就会很大吧,不过一般来说没超时的话,只有写的时候会去持久化一下,也无妨吧,有的话求告诉呀。
9hills
2014-03-06 19:10:33 +08:00
mongodb
binux
2014-03-06 19:12:13 +08:00
@oldcai 如果你不相信linux内核的文件缓存,那么即便是mysql也是有缓存的。。
oldcai
2014-03-06 19:18:15 +08:00
@9hills mongodb没法设置超时啊什么的吧,而且比键值对复杂很多呢,用来换sql数据库倒是可以,用开拓展下缓存,就太过了吧。

@binux linux的内存swap去了,整个系统就卡爆,mysql/postgresql的缓存这些都是数据库里面的优化,可控性不大啊。
9hills
2014-03-06 19:21:37 +08:00
@oldcai 那就redis + mongodb

两个同时写,先从redis读,读不到再去读mongodb
oldcai
2014-03-06 19:30:12 +08:00
@9hills 就是为了解决这种麻烦,才想问问有没有这种解决方案。

是不是这种需求太少?
也不少吧,像访问量啊,用户对象信息啊什么的这类信息还是很适合这样做的吧?
mkeith
2014-03-06 19:57:11 +08:00
mongo 你存数据的存一个过期时间,取数据的时候判断下,过期就废弃。
apir8181
2014-03-06 20:08:03 +08:00
cassandra,不过不太算是传统意义上的kv。
oldcai
2014-03-06 20:18:23 +08:00
@apir8181 cassandra没有用过,请问有些什么特性可以适合这么使用的呢?
binux
2014-03-06 20:39:19 +08:00
@oldcai 大部分都有冷热数据区分,如果即使这样还是不断换入换出,说明你内存不够了,再超时持久化也没用。
wb14123
2014-03-06 20:57:13 +08:00
@9hills 两个内存型数据库放一起,估计不太好。
api
2014-03-06 21:47:32 +08:00
ccdjh
2014-03-06 21:49:09 +08:00
@wb14123 一台vps放mongodb 其它vps跑例子和redis,

然后就是@binux 说的 先从redis读,读不到再去读mongodb。

我就是这样的。不知道和他是否一样的意思。
oldcai
2014-03-06 22:16:22 +08:00
@binux 我们使用的一个一个的对象基本上都是很小的内存单元,而系统以linux为例,swap似乎是以一页一页的单位来的,这样的处理方式,对于某些不常活动的进程的内存swap掉是有作用的,而对于活跃的程序就不能指望它了吧。
@wb14123 mongodb不能算是一个内存型数据库吧。
@api 在提问前就找过这个,它说:It is NOT a cache solution,窃以为是只负责持久,不负责内存里面缓存着。
@ccdjh 当然,你说的这种方法是可行的,或者自己写文件,或者用其他数据库,不一定是mongodb,我想问问有没有现成的一个有这种功能的数据库。现在看来似乎是没有的。

@livid 发现个小bug,大概是js里面的:当输入框填满的时候,再点一下“回复”箭头,新增的 @someone 这一行会出现在输入框下方不可见区域内。当然,再输入回车后会自动拉伸输入框。
wb14123
2014-03-06 23:32:53 +08:00
@oldcai 但是mongodb是自动将热数据存到内存的,有多少可用内存就会吃多少内存。所以和redis放在一台机器上估计会有问题。@ccdjh 所说的放到不同的机器上应该是可以接受的。
bakac
2014-03-07 03:38:46 +08:00
redis+MYSQL redis 上设置TTL作为缓存是用, 如果读不到再从MYSQL上拉出来
oldcai
2014-03-07 10:52:00 +08:00
@binux
@9hills
@bakac
感谢几位支招,但是我觉得这只是现阶段没有办法的办法。
如果是靠数据库的本身机制来完成这种功能,而不是联合一个持久的一个内存的来用,会有其他的红利,比如写的时候也只用和内存打交道,等超时了会自动持久化。
这种机制适合存一些即使丢失了也不可惜,但是最好别丢失的东西。
比如文章阅读次数,页面缓存,以及可以通过其他已持久化的数据推断出来的数据,比如用户上次活动的时间。

@wb14123 感觉不像是有多少内存就吃多少的样子,我一般都是使用默认配置,只是VZS使用量大,RSS还是不多的。

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

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

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

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

© 2021 V2EX