redis 与关系型数据库的对比

复制代码
书和书签系统
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,如需转载请自行联系原作者
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值