redis筆記11-key設計原則

【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

email

9

Lisi

1111111

[email protected]

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 ...

完成了根據用戶名來查詢用戶信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章