关于Redis到底能不能做数据库以及一些NoSQL的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tonghuashuai
V2EX    Redis

关于Redis到底能不能做数据库以及一些NoSQL的问题

  •  
  •   tonghuashuai
    tonghs 2013-10-23 13:15:06 +08:00 9539 次点击
    这是一个创建于 4438 天前的主题,其中的信息可能已经有所发展或是发生改变。
    小弟有几个问题不太明白,特烦请各位给解释一下:
    1.能不能单纯的用Redis做数据库,由于Redis是基于内存的,只是周期性的转到持久存储,这样是不是就不能保证数据了
    2.上面说到的问题,貌似MongoDB没有吧
    3.看@Livid的博客,V2EX用到了Redis,是用作数据存储还是只是用做缓存
    3.豆瓣、facebook等等一些架构用到了Redis、memcached等等,但是还是用到了MySQL等关系型数据库,是不是可以说传统的关系型数据库的地位在有些地方还是不能撼动的
    21 条回复    1970-01-01 08:00:00 +08:00
    mahone3297
        1
    mahone3297  
       2013-10-23 13:40:44 +08:00   1
    1. 是,不能保证数据,所以不能做数据库
    2. mongodb是数据库
    3. 我猜肯定是缓存
    4. redis,memcached是缓存,不是数据库。。。
    分清了redis不是数据库,上面的问题,就都有答案了。。。
    cloudzhou
        2
    cloudzhou  
       2013-10-23 14:02:24 +08:00
    @mahone3297 redis 可以不单单是缓存,你可以把 redis 理解为一个长久的 hashtable, sortset 等等,redis 是为了加速特定结构的数据,这些数据访问量非常大,放在数据库压力大。
    Ricepig
        3
    Ricepig  
       2013-10-23 14:06:52 +08:00
    redis只是害怕意外停机,可以通过多机的方式避免某机器意外停机
    mongodb
        4
    mongodb  
       2013-10-23 14:14:39 +08:00
    可以做纯数据库,意外停机造成数据丢失的问题可以通过架构解决。
    如果拿不准的话可以暂时作为缓存或者某些特定的库和表尝试用redis,抗压能力是杠杠的。
    也可以尝试使用一下我,对比下。
    mahone3297
        5
    mahone3297  
       2013-10-23 14:15:03 +08:00
    @cloudzhou 对,我知道。是为了加速,所以我把他理解成缓存。。。可能用词不准,但是意思就这个意思,理解就行。反正不是数据库。redis的官网说他是个“数据结构服务”
    tonghuashuai
        6
    tonghuashuai  
    OP
       2013-10-23 14:35:30 +8:00
    @mahone3297
    @cloudzhou
    @Ricepig
    @mongodb
    多谢各位,明白了
    misaka
        7
    misaka  
       2013-10-23 14:49:53 +08:00
    @mahone3297

    Bullshit.
    Do confirm your answer before answering questions.

    ---

    Redis on Ubuntu 10.04 (Lucid) #on sidebar
    http://library.linode.com/databases/redis/ubuntu-10.04-lucid
    "/database"

    http://en.wikipedia.org/wiki/Redis
    "Type: Document-oriented database"

    http://redis.io/topics/quickstart
    Search "database"

    http://www.redisbook.com/en/latest/
    See "数据库"

    ---

    Redis is database.
    shiny
        8
    shiny  
    PRO
       2013-10-23 14:57:50 +08:00
    NoSQL 绝不是要取代传统 SQL,而是传统 SQL 有益的补充。
    Redis 的可靠性没有想象中的那么弱,开启 aof 及多机复制,一般应用场合足矣。
    mahone3297
        9
    mahone3297  
       2013-10-23 15:33:33 +08:00
    @misaka 看看官网
    Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.
    反正不管怎样,我还是不会认为他是database
    Livid
        10
    Livid  
    MOD
    PRO
       2013-10-23 17:17:19 +08:00
    V2EX 目前在用 Redis 存储一些用户的设置数据(比如 ignore 的主题)。

    这样的一个好处是,除了性能好之外,在添加这类新数据的时候,不会涉及任何的 scheme change,也就是说不需要运行 alter table 自然也就不存在锁表问题。
    tonghuashuai
        11
    tonghuashuai  
    OP
       2013-10-23 17:45:56 +08:00
    @Livid
    我可以这么理解不:可以使用Redis存一些不经常改动的数据,这样由内存到持久存储同步时,系统异常丢数据的概率就比较小了
    chloerei
        12
    chloerei  
       2013-10-23 18:14:31 +08:00
    @tonghuashuai 应该存经常改动,丢了也没关系或者可以从数据库重建的数据。
    allenwei
        13
    allenwei  
       2013-10-23 18:37:14 +08:00
    Redis最常用的就是cache和queue吧, 还有作为缓冲区的,充分发挥读写快的优势
    lerry
        14
    lerry  
       2013-10-23 18:39:22 +08:00
    redis怎么不是数据库了,开启 Replication 和 aof 已经很可靠了
    用到redis的,我觉得大部分不是作为缓存的
    likuku
        15
    likuku  
       2013-10-23 21:22:32 +08:00
    @tonghuashuai 你这种就是需要个数据库的缓存,memcached 很适合。
    moroumo
        16
    moroumo  
       2013-10-23 21:26:41 +08:00
    我觉得redis做数据库到没多大问题,对于一般的应用而言。
    但是如果数据需要从不同的字段或者维度做统计的话,还是db的好。
    RisingV
        17
    RisingV  
       2013-10-24 00:51:54 +08:00
    一句话,不合适。用aof失去了高可用性本意。redis所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。用snapshot才是好的使用方式。
    Ricepig
        18
    Ricepig  
       2013-10-24 13:40:57 +08:00 via iPhone
    @lerry 最大问题来自于redis和db的一个差异:普通db是写入磁盘后才认为操作完成,redis是写入内存就意味操作完成,replica和aof可以认为是后续附加操作。这一点点貌似只是先后的差别,对于数据的可靠性考量还是不一样的。
    当然,replica和aof会把丢数据的概率降低很多。
    est
        19
    est  
       2013-10-24 15:24:40 +08:00
    @Livid 比如我这样建立一个表: create table settings (id int, key varchar(100), value varchar(500) ); 可以解决你的alter table麻烦不?


    @lerry redis的问题是,k-v方便,keys() 超级卡超级麻烦。一般都通过数据冗余来解决scan的操作。感觉就是不如OLTP方便。
    stackpop
        20
    stackpop  
       2013-10-24 16:42:03 +08:00
    和架构有很大关系。

    个人所负责的业务,一般是热数据放在内存中,使用redis等,然后ssd中有一份完整数据,磁盘也有一份。

    对于实时服务,一般使用内存中的数据,一旦机器挂掉,就重新从磁盘导出一份进内存。

    对于非实时的服务,就没这么讲究了,很有可能就是提交一个map/reduce的任务,让他一直跑,跑完了,结果还是放回内存,等待用户来取。
    lerry
        21
    lerry  
       2013-10-24 17:55:13 +08:00
    @est 确实有很大限制性,无法反向查询
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     909 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 21:43 PVG 05:43 LAX 13:43 JFK 16:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86