redis12-----redis 與關係型資料庫的對比

weixin_33816946發表於2018-01-15
書和書籤系統
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表。以空間換時間。

  

相關文章