书和书签系统 create table book ( bookid int, title char(20) )engine myisam charset utf8; insert into book values (5 , 'PHP圣经'), (6 , 'ruby实战'), (7 , 'mysql运维') (8, 'ruby服务端编程'); create table tags ( tid int, bookid int, content char(20) )engine myisam charset utf8; insert into tags values (10 , 5 , 'PHP'), (11 , 5 , 'WEB'), (12 , 6 , 'WEB'), (13 , 6 , 'ruby'), (14 , 7 , 'database'), (15 , 8 , 'ruby'), (16 , 8 , 'server'); # 既有web标签,又有PHP,同时还标签的书,要用连接查询 select * from tags inner join tags as t on tags.bookid=t.bookid where tags.content='PHP' and t.content='WEB';
换成key-value存储用kv 来存储, book就是表,5是id,title是字段 6377:0>set book:5:title 'PHP圣经' 6377:0>get book:5:title "PHP圣经" set book:6:title 'ruby实战' set book:7:title 'mysql运难' set book:8:title ‘ruby server’ sadd tag:PHP 5 sadd tag:WEB 5 6 sadd tag:database 7 sadd tag:ruby 6 8 sadd tag:SERVER 8 查: 既有PHP,又有WEB的书 Sinter tag:PHP tag:WEB #查集合的交集 查: 有PHP或有WEB标签的书 Suion tag:PHP tag:WEB 查:含有ruby,不含WEB标签的书 Sdiff tag:ruby tag:WEB #求差集
Redis key 设计技巧 //先根据a分组,再根据b分组,再根据c分组,再根据d分组,d组只有一个值是1
1
2
3
4
5
6
7
8
|
1: 把表名转换为key前缀 如, tag: 2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid 3: 第3段放置主键值,如2,3,4...., a , b ,c 4: 第4段,写要存储的列名 用户表 user , 转换为key-value存储 userid username passworde email 9 Lisi 1111111 lisi@163.com |
1
2
3
4
5
6
7
8
|
//先根据user分组,再根据userid分组,再根据9分组,最后根据username分组,这个组只有一个值就是lisi set user:userid:9:username lisi
set user:userid:9:password 111111
set user:userid:9:email lisi@163.com
set user:userid:10:username yyy
set user:userid:10:password 222222
set user:userid:10:email yyy@163.com
|
1
2
3
4
|
6380:0>get user :userid:9:username
"lisi" 6380:0>get user :userid:9: password
"111111" |
1
2
3
4
5
6
7
|
6380:0>keys user :userid:9* //9号用户有多少字段
1) "user:userid:9:email"
2) "user:userid:9:password"
3) "user:userid:9:username"
//查询用户名叫lisi的,redis毕竟不是传统数据库,查起来比较复杂 keys user :userid:*:username lisi
|
1
2
3
4
5
|
2 注意: 在关系型数据中,除主键外,还有可能根据其他列来查询,例如根据用户名来查询,没有什么好的方法,只能根据冗余信息来维护。 Set user :username:lisi:userid 9 //再维护一个用户名对应的userid的信息
6380:0>Get user :username:lisi:userid
"9" //根据username查询到userid,然后根据userid找到哪一行
|
1
2
3
|
如果还要根据email来查询,那么就要又维护一个冗余的email,查询的时候先根据email找到userid,然后根据userid找到那一行。 Set user :email:yyy@163.com:userid 10
Set user :email:lisi@163.com:userid 9
|
1
|
这就跟索引一样,如果经常要根据哪个列查询,就要维护一个索引表,这里就是要维护一个指向主键的kv表。以空间换时间。
|
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/8287118.html,如需转载请自行联系原作者