V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bicoff9527
V2EX  ›  程序员

把数据从 mysql 转换存到 redis, 如何设计

  •  
  •   bicoff9527 · 2016-06-20 09:23:53 +08:00 · 9555 次点击
    这是一个创建于 3079 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如有两张表 A, B, B 对 A 有外键约束, A 中有唯一索引

    感觉可以使用 A 的唯一索引字段做 redis 的 hash 的 name, 但是一个 A 中记录对应多条 B 的记录, B 应该如何设计和存储呢?

    把 B 直接用 list 存到 A 的 hash 的某个键值对里? 感觉不太好

    求指教
    第 1 条附言  ·  2016-06-20 14:24:30 +08:00
    现在用 MySQL 并发可能不够了, 而且是写多读少, 应该如何设计方案
    17 条回复    2016-06-21 11:29:17 +08:00
    aaaron7
        1
    aaaron7  
       2016-06-20 09:29:11 +08:00
    关系型数据不适合存到 redis 吧,查的时候会蛋疼死
    Navee
        2
    Navee  
       2016-06-20 09:29:40 +08:00
    ab 单独存, a 中只记录 b 的引用( id )
    如果你的 b 记录在 a 中,就造成了 b 的冗余,并且单独查询 b 还是个大麻烦
    bicoff9527
        3
    bicoff9527  
    OP
       2016-06-20 09:49:14 +08:00
    @Navee 我要存新的 b 的纪录, 也就是没有 id 的, 该如何存呢...好烦恼
    Navee
        4
    Navee  
       2016-06-20 10:03:56 +08:00
    @bicoff9527 没有 id 你创建一个不就可以了?
    tonghuashuai
        5
    tonghuashuai  
       2016-06-20 11:26:50 +08:00
    首先,我还是建议 lz 不要用这种方式使用 redis , redis 不应该这么用吧,很蛋疼。

    当然,如果非要这么用的话, B 的 key 中包含 A 的 ID 应该是一种办法,结构如下:

    A 的结构: a_id: {col1: val2, col2: val2}
    B 的结构: a_id_b_id: {col1: val2, col2: val2}
    但是这样有一个问题就是:如果只有 B 的 ID 想查询 B 就蛋疼了,就得用遍历了……想想就蛋疼


    redis 的最佳实践是存一些热数据,尽量不存业务数据,虽说 redis 有持久化方式,如果选择实时持久化那性能还不如 mysql 呢,如果定期持久化那么必然会存在丢数据的问题。我一般用 redis 存一下经常更新的热数据或一些运算结果,我的使用原则是: redis 中的数据可以由业务数据冷启动的,也就是说:如果哪天 redis 挂掉了,只要有业务数据,随时都可以生成 redis 中的数据冷启动的。
    mathgl
        6
    mathgl  
       2016-06-20 11:31:05 +08:00
    @tonghuashuai 看云风的文章,他们用 redis 作为 main db ,不过他们是做游戏的。
    SlipStupig
        7
    SlipStupig  
       2016-06-20 11:35:56 +08:00
    这种方案特别不合适,但是方法还有的,方法如下:
    1.将 redis 理解成一个 slave ,每次将 mysql 的 binlog 同步过来,解析成 json ,传入到 redis
    2.mysql 装一个 Gearman redis 的扩展,用 gm 去管理同步
    3.用程序逻辑去控制同步
    lslqtz2
        8
    lslqtz2  
       2016-06-20 11:42:02 +08:00
    Redis 及 Memcache 偏向缓存。
    tonghuashuai
        9
    tonghuashuai  
       2016-06-20 11:42:20 +08:00
    @mathgl
    我也看过,貌似他用 redis 做数据中转用吧,独立于游戏系统,不知道咱俩看到的是不是同一篇……
    fy
        10
    fy  
       2016-06-20 11:49:06 +08:00
    没有必要, redis 不是用来解决这个问题的,都用就行。
    smartdie
        11
    smartdie  
       2016-06-20 11:52:10 +08:00
    用看似省事儿的办法解决麻烦,越做越麻烦。
    memorycancel
        12
    memorycancel  
       2016-06-20 15:37:22 +08:00
    那你用 mongoDB 撒
    mathgl
        13
    mathgl  
       2016-06-20 21:08:43 +08:00   ❤️ 1
    @tonghuashuai

    http://blog.codingnow.com/2011/11/dev_note_2.html

    看描述,是主要用它。不过网游的数据的关联性可能不是很高,这样用问题也不大。
    Muninn
        14
    Muninn  
       2016-06-20 23:15:31 +08:00
    建议楼主可以看看 mongodb 的教程
    在 mongo 里怎么存 在 redis 里也能存成类似的

    然而就像楼上说的,除非可以保证你存的 AB 表维持在一个稳定的水位
    要是只增不减的,不建议存 redis , redis 就是缓存场景,适合存能预估大小和条数的数据
    vikeria
        15
    vikeria  
       2016-06-21 08:49:50 +08:00 via iPhone
    用过一次 redis 替换关系数据库,再也不想用了…为啥不用 mongodb ?
    winglight2016
        16
    winglight2016  
       2016-06-21 10:50:10 +08:00
    试试 memsql 吧
    banksiae
        17
    banksiae  
       2016-06-21 11:29:17 +08:00   ❤️ 1
    我们用 redis 做主库,主要是 IM 记录、以及一些用户信息缓存,每天 16G 的数据。 codis 主备集群,外加 couch 集群。性能上还不错,但是查询比较痛苦,查询的场景基本上要结合 mysql 。
    研究过 LOL 的 im 通讯,用的 riak ,集成了 solr ,支持搜索,楼主如果有兴趣可以看看
    mongodb 没玩过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1097 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:23 · PVG 02:23 · LAX 10:23 · JFK 13:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.