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

2016-06-20 09:23:53 +08:00
 bicoff9527
比如有两张表 A, B, B 对 A 有外键约束, A 中有唯一索引

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

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

求指教
9383 次点击
所在节点    程序员
17 条回复
aaaron7
2016-06-20 09:29:11 +08:00
关系型数据不适合存到 redis 吧,查的时候会蛋疼死
Navee
2016-06-20 09:29:40 +08:00
ab 单独存, a 中只记录 b 的引用( id )
如果你的 b 记录在 a 中,就造成了 b 的冗余,并且单独查询 b 还是个大麻烦
bicoff9527
2016-06-20 09:49:14 +08:00
@Navee 我要存新的 b 的纪录, 也就是没有 id 的, 该如何存呢...好烦恼
Navee
2016-06-20 10:03:56 +08:00
@bicoff9527 没有 id 你创建一个不就可以了?
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
2016-06-20 11:31:05 +08:00
@tonghuashuai 看云风的文章,他们用 redis 作为 main db ,不过他们是做游戏的。
SlipStupig
2016-06-20 11:35:56 +08:00
这种方案特别不合适,但是方法还有的,方法如下:
1.将 redis 理解成一个 slave ,每次将 mysql 的 binlog 同步过来,解析成 json ,传入到 redis
2.mysql 装一个 Gearman redis 的扩展,用 gm 去管理同步
3.用程序逻辑去控制同步
lslqtz2
2016-06-20 11:42:02 +08:00
Redis 及 Memcache 偏向缓存。
tonghuashuai
2016-06-20 11:42:20 +08:00
@mathgl
我也看过,貌似他用 redis 做数据中转用吧,独立于游戏系统,不知道咱俩看到的是不是同一篇……
fy
2016-06-20 11:49:06 +08:00
没有必要, redis 不是用来解决这个问题的,都用就行。
smartdie
2016-06-20 11:52:10 +08:00
用看似省事儿的办法解决麻烦,越做越麻烦。
memorycancel
2016-06-20 15:37:22 +08:00
那你用 mongoDB 撒
mathgl
2016-06-20 21:08:43 +08:00
@tonghuashuai

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

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

然而就像楼上说的,除非可以保证你存的 AB 表维持在一个稳定的水位
要是只增不减的,不建议存 redis , redis 就是缓存场景,适合存能预估大小和条数的数据
vikeria
2016-06-21 08:49:50 +08:00
用过一次 redis 替换关系数据库,再也不想用了…为啥不用 mongodb ?
winglight2016
2016-06-21 10:50:10 +08:00
试试 memsql 吧
banksiae
2016-06-21 11:29:17 +08:00
我们用 redis 做主库,主要是 IM 记录、以及一些用户信息缓存,每天 16G 的数据。 codis 主备集群,外加 couch 集群。性能上还不错,但是查询比较痛苦,查询的场景基本上要结合 mysql 。
研究过 LOL 的 im 通讯,用的 riak ,集成了 solr ,支持搜索,楼主如果有兴趣可以看看
mongodb 没玩过

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

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

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

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

© 2021 V2EX