Redis key的设计

上一篇写到产品的整体业务结构,接着写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,夏日,美丽的夏天,show2013-6-13}

Set 

 -theme:{id}:clothes

Theme:001:product{1,2,3,4,5,6},idproductid

体现了主题和商品的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笔者也是新手,有经验的童鞋一起来学习交流……


对了,虽然不是什么大神的文章哦,转载的时候,要记得带上说明哦,学习要尊重作者的劳动呀,我今天不小心发现

一些网站转载了文章,写着原创,呵呵,笔者没太大关系,但是对转载的人没好处呀。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值