上一篇写到产品的整体业务结构,接着写redis存储,redis存储关键是key的设计,出来工作一直做些c/c++方面的后台开发工作,传统的数据库,mysql这些多少有些接触,对于redis存储数据,也是0经验,记得当初也是找了很多资料,总是有些顾虑,后来在网上看到一位工程师写的文章,觉得跟redis官网中讲到的非常吻合,我特地写了邮件给请教他,他很快给我了回复,和他自己写的一本书,在这里再次感谢他,这里把他的个人主页附上,里面有很多好的文章:
http://zihua.li/
http://zihua.li/2012/07/two-patterns-of-statistics-using-redis/
另外,网易技术大神的文章也有:
http://blog.codingnow.com/2011/11/dev_note_2.html
还有一些英文版的,这个是国人翻译的,对比英文版,算翻译的很好的文章
http://www.mysqlops.com/2011/09/06/redis-kv-design.html
后来,baby的key设计就采用了这些设计方法。
从前面两篇文章,可以了解到baby的数据需求:主题,商品。确实就这么两个,考虑到以后的扩展性,暂时,在后台设计存储的时候,同时考虑了用户注册,商品标签,商品评论,商品收藏(预计会取消掉)关系,所以整体的表设计就有:主题表,商品表,用户表,标签表,评论表及关联关系。
redis存储数据有丰富的数据结构,key/value,set,zset,list,hash,bit。在key的设计上,刚开始不熟悉,可以先用传统数据库设计的方式,把表和表关系理清楚,或者用E-R图的方式描述清楚,然后再转换成redis的key,我也是这样做的,一起来看看吧。
我有个小黑板,今天再画一次,我通常喜欢这么自己图图画画:
说明:
1、主题theme和商品product关系:1:n
2、用户user和product 的收藏关系:1:n(我一直不是很喜欢收藏这个功能,可能会取消掉)
3、用户user和评论comment关系:1:n
4、商品product评论comment关系:1:n
5、标签tag和商品关系:n:m
各个表的属性,这里列举两个表,其他也是类似的,根据自己的需求可以自己调整的。
主题表:
theme | ||
属性 | 描述 | 备注 |
id | Id 唯一标识 | |
title | 标题 | |
desc | 描述 | |
status | 状态 | hide/show |
coverpic | Url,封面照片url地址 | |
update | 更新时间 |
商品表:
product | ||
属性 | 描述 | 备注 |
id | Id 唯一标识 | |
num_iid | 商品num_iid | |
title | 标题 | |
outer_id | ||
pic_url | 商品住图片地址 | |
price | 商品价格 | |
item_imgs | 商品图片列表 | |
click_url | 商品购买链接 | |
Mobile_url | 移动端购买链接 | |
love_counter | 喜爱计数器 | |
comment_counter | 评论计数器 |
主题表和商品表的关系是1:n,细心的读者肯定发现了,我在商品表中,少了外键主题ID,没错,关系数据在表现1:n关系时,通过外键来关联的。转换成redis时,可以不必要写在表中,只要理清楚了表之间的关系就可以,他们的关系是通过另外的方式来转换的,现在把这两张表的关系转换成redis的key
我选取了常用的方式,key/value,hash,set和zset四种数据结构来表示:
单独表示表的用hash数据结构:
主题表:key: theme:{id}:name
主题表和商品表关联关系用set数据结构:
key:theme:{id}:product
通常还需要对每张表的数据条目做统计,排序用,用zset
key:theme:zset
最后的设计:
theme | 主题 |
String -theme:key | 记录主键id当前值 |
Hash -theme:{id} | Hash(theme:001) = {001,夏日,美丽的夏天,show,2013-6-13} |
Set -theme:{id}:clothes | Theme:001:product{1,2,3,4,5,6},id是product表id 体现了主题和商品的1:n关系 |
zset -theme:zset | theme:zset{001,002,003}, |
商品表的设计也类似:
product | 产品 |
Hash -product:{id} | |
String -product:key | |
Set -product:{id}:tag -product:{id}:comment | 体现商品和标签关系 商品和评论关系 |
List -product:list | |
Zset -product:zset | Product:zset{} |
注:商品和标签关系是:n:m,有读者会问,这里只是1:n关系,跟传统数据库设计一样,这里n:m也是通过拆分成两个1:n和1:m关系来表达的
其他表的key设计也是类似的方法。
笔者用php写的后端,选用了predis客户端操作redis,web框架选取了组件式框架Yii框架。
今天先写到这里,下一篇接着写,具体的ORM持久层的设计方式。
yii框架和php,redis笔者也是新手,有经验的童鞋一起来学习交流……
对了,虽然不是什么大神的文章哦,转载的时候,要记得带上说明哦,学习要尊重作者的劳动呀,我今天不小心发现
一些网站转载了文章,写着原创,呵呵,笔者没太大关系,但是对转载的人没好处呀。