redis:key設計原則
阿新 • • 發佈:2018-12-02
redis與關係型資料庫的適合場景
場景:書有標籤,一本書可能有多個標籤。一個標籤可能對應多本書。
如果是關係型資料庫來儲存:
create table book(
id int,
title char(20)
)engine myisam charset utf8;
insert into book values(5,'PHP經典'),(6,'Ruby實戰'),(7,'MySQL基礎'),(8,'Ruby服務端程式設計');
create table tags( id int, book_id 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.id=t1.id
where tags.content='php' and t.content='web';
如果是要查詢 既有web標籤又有php標籤,同時還有database標籤的書,你就要三表聯查。
如果資料量大了,比如上百萬本書,這樣的查詢就太消耗效能了。(沒發玩了)
換思路:用key-value儲存
set book-5-title 'PHP經典' set book-6-title 'Ruby實戰' set book-7-title 'MySQL基礎'
使用redis的set集合
型別儲存書的標籤:
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 tag-php tag-web #集合的交集
有php標籤
或web標籤
的書
sunion tag-php tag-web #並集
含有ruby標籤
但不含web標籤
的書
sdiff tag-ruby tag-web #求差集
Redis key設計技巧
1、把表名轉換為key字首,如tag:
2、把第二段放置用於區分key的欄位,對應msyql中主鍵的列名,如user_id
3、第三段放置主鍵值,如2,3,4
4、第四段寫儲存的列名
使用者表uesr,轉換為key-value儲存
user_id user_name email
9 lily [email protected]
set user:user_id:9:user_name lily
set user:user_id:9:email [email protected]
#查詢這個使用者
keys user:user_id:9*
注意:
在關係型資料中,除主鍵外,還有可能其他列也會參與查詢。
如上表中,user_name也是很頻繁查詢的,往往這種列也是加了索引的。
轉換到key-value資料中,則也要相應的生成一條按照該列為主的key-value
set user_name:lily:user_id 9
這樣我們可以根據user_name:lily:user_id
查詢出user_id為9,再查user_id:9:email
。
完成了根據使用者名稱查詢使用者資訊。