V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
oldcai
V2EX  ›  问与答

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

  •  
  •   oldcai · 2014-03-06 18:57:50 +08:00 · 3993 次点击
    这是一个创建于 3899 天前的主题,其中的信息可能已经有所发展或是发生改变。
    没超时的适合,保存在内存中,timeout后持久化,可以下次通过key查询到。

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

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

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

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

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

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

    我就是这样的。不知道和他是否一样的意思。
    oldcai
        16
    oldcai  
    OP
       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
        17
    wb14123  
       2014-03-06 23:32:53 +08:00   ❤️ 1
    @oldcai 但是mongodb是自动将热数据存到内存的,有多少可用内存就会吃多少内存。所以和redis放在一台机器上估计会有问题。@ccdjh 所说的放到不同的机器上应该是可以接受的。
    bakac
        18
    bakac  
       2014-03-07 03:38:46 +08:00   ❤️ 1
    redis+MYSQL redis 上设置TTL作为缓存是用, 如果读不到再从MYSQL上拉出来
    oldcai
        19
    oldcai  
    OP
       2014-03-07 10:52:00 +08:00
    @binux
    @9hills
    @bakac
    感谢几位支招,但是我觉得这只是现阶段没有办法的办法。
    如果是靠数据库的本身机制来完成这种功能,而不是联合一个持久的一个内存的来用,会有其他的红利,比如写的时候也只用和内存打交道,等超时了会自动持久化。
    这种机制适合存一些即使丢失了也不可惜,但是最好别丢失的东西。
    比如文章阅读次数,页面缓存,以及可以通过其他已持久化的数据推断出来的数据,比如用户上次活动的时间。

    @wb14123 感觉不像是有多少内存就吃多少的样子,我一般都是使用默认配置,只是VZS使用量大,RSS还是不多的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:43 · PVG 06:43 · LAX 14:43 · JFK 17:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.