1. 程式人生 > >redis:key設計原則

redis:key設計原則

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
完成了根據使用者名稱查詢使用者資訊。