書和書籤系統 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: 把表名轉換為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
//先根據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
6380:0>get user:userid:9:username
"lisi"
6380:0>get user:userid:9:password
"111111"
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
2 注意:
在關係型資料中,除主鍵外,還有可能根據其他列來查詢,例如根據使用者名稱來查詢,沒有什麼好的方法,只能根據冗餘資訊來維護。
Set user:username:lisi:userid 9 //再維護一個使用者名稱對應的userid的資訊
6380:0>Get user:username:lisi:userid
"9" //根據username查詢到userid,然後根據userid找到哪一行
如果還要根據email來查詢,那麼就要又維護一個冗餘的email,查詢的時候先根據email找到userid,然後根據userid找到那一行。
Set user:email:yyy@163.com:userid 10
Set user:email:lisi@163.com:userid 9
這就跟索引一樣,如果經常要根據哪個列查詢,就要維護一個索引表,這裡就是要維護一個指向主鍵的kv表。以空間換時間。