【redis 與關係型數據庫的適合場景】
《MySQL實現書籤系統》
#創建book書表#
create table book (
bookid int,
title char(20)
)engine myisam charset utf8;
#給book表插入數據#
insert into book values
(5 , 'PHP聖經'),
(6 , 'ruby實戰'),
(7 , 'mysql運維'),
(8, 'ruby服務端編程');
#創建tags標籤表#
create table tags (
tid int,
bookid int,
content char(20)
)engine myisam charset utf8;
#給tags表插入數據#
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 where content='WEB' OR content='PHP';
【換成key-value存儲】
/*使用普通的key方式存儲書籍*/
set book:5:title 'PHP聖經'
set book:6:title 'ruby實戰'
set book:7:title 'mysql運難'
set book:8:title 'ruby server'
/*使用“集合”的方式存儲標籤和書籍的關係*/
sadd tag:PHP 5 //tag爲PHP的標籤對應 5號書籍
sadd tag:WEB 5 6 //tag爲WEB的標籤對應 5號書籍和6號書籍,如下類似
sadd tag:database 7
sadd tag:ruby 6 8
sadd tag:SERVER 8
/* 查詢 */
查: 既有PHP又有WEB的書——查集合的交集(Sinter)
Sinter tag:PHP tag:WEB
查: 有PHP或有WEB標籤的書——查集合的並集(Sunin)
Sunin tag:PHP tag:WEB
查:含有ruby,不含WEB標籤的書——求差集(Sdiff)
Sdiff tag:ruby tag:WEB
【Redis key 設計技巧】
1: 把表名轉換爲key前綴 如, tag:
2: 第2段放置用於區分區key的字段--對應mysql中的主鍵的列名,如userid
3: 第3段放置主鍵值,如2,3,4...., a , b ,c
4: 第4段,寫要存儲的列名
用戶表 user , 轉換爲key-value存儲 |
|||
userid |
username |
passworde |
|
9 |
Lisi |
1111111 |
set user:userid:9:username lisi
set user:userid:9:password 111111
set user:userid:9:email [email protected]
#查詢都有哪些字段
keys user:userid:9*
#查詢某個字段的值
get user:userid:9:username
◆ 注意:—— 冗餘字段
在關係型數據中,除主鍵外,還有可能其他列也步驟查詢,
如上表中, username 也是極頻繁查詢的,往往這種列也是加了索引的.
轉換到k-v數據中,則也要相應的生成一條按照該列爲主的key-value
Set user:username:lisi:uid 9
這樣,我們可以根據username:lisi:uid ,查出userid=9,
再查user:9:password/email ...
完成了根據用戶名來查詢用戶信息