對比着關係型數據庫,咱們對redis key的設計通常有如下兩種格式:javascript
用冒號做爲分割是設計key的一種不成文的原則,遵循這種格式設計出的key在某些redis客戶端下能夠有效的識別;
可是,在關係型數據中,除主鍵外,還有可能根據其餘列來查詢。
如上表中, username 也是極頻繁查詢的,每每這種列也是加了索引的。
轉換到k-v數據中,則也要相應的生成一條按照該列爲主的key-value。php
Set user:username:lisi:uid 9 #可是要保證username是惟一的; 這樣,咱們能夠根據username:lisi:uid ,查出userid=9, 再查user:9:password/email ...
mysql數據準備html
CREATE TABLE `book` ( `book_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL DEFAULT '' COMMENT '書名', `add_time` int(10) NOT NULL DEFAULT '0' COMMENT '添加時間', PRIMARY KEY (`book_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='書本表'; INSERT INTO book VALUES (5, 'PHP聖經', UNIX_TIMESTAMP() ), (6, 'ruby實戰', UNIX_TIMESTAMP() ), (7, 'mysql運維', UNIX_TIMESTAMP() ), (8, 'ruby服務端編程', UNIX_TIMESTAMP() ); CREATE TABLE `tag` ( `tag_id` int(11) NOT NULL AUTO_INCREMENT, `tag_name` char(40) NOT NULL DEFAULT '' COMMENT '標籤名', PRIMARY KEY (`tag_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='標籤表'; INSERT INTO tag VALUES (1, 'PHP'), (2, 'ruby'), (3, 'mysql'), (4, 'database'); CREATE TABLE `tag_book` ( `tag_id` int(11) NOT NULL DEFAULT '0' COMMENT '標籤ID', `book_id` int(11) NOT NULL DEFAULT '0' COMMENT '書ID', KEY `tag_id` (`tag_id`), KEY `book_id` (`book_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='標籤與書關係表'; INSERT INTO `tag_book` (`tag_id`, `book_id`) VALUES ('4', '7'),('1', '5'),('2', '6'),('2', '8');
咱們有如下查詢需求:java
# 《mysql運維》有幾個標籤: SELECT tag_name FROM `book` AS b INNER JOIN tag_book AS tb ON b.book_id = tb.book_id INNER JOIN tag AS t ON tb.tag_id = t.tag_id WHERE `name` = 'mysql運維'; # 標籤ruby下有幾本書: SELECT b.name FROM `book` AS b INNER JOIN tag_book AS tb ON b.book_id = tb.book_id INNER JOIN tag AS t ON tb.tag_id = t.tag_id WHERE t.`tag_name` = 'ruby';
換到redis中,咱們能夠以下操做:mysql
一個標籤下面能夠包含不少書籍,一個書籍也能夠包含不少標籤。這種從屬關係若是沒有排序需求的,咱們可使用集合:web
set book:book_id:5:name 'PHP聖經' set book:book_id:6:name 'ruby實戰' set book:book_id:7:name 'mysql運維' set book:book_id:8:name 'ruby服務端編程' sadd tag:tag_name:php:book_id 5 sadd tag:tag_name:ruby:book_id 6 8 sadd tag:tag_name:database:book_id 7 sadd tag:tag_name:mysql:book_id 7 # ruby下面有哪些書 127.0.0.1:6379> sort tag:tag_name:ruby:book_id get book:book_id:*:name ruby實戰 ruby服務端編程 # 標籤同時包含mysql,與database的書 【取交集】 127.0.0.1:6379> sinter tag:tag_name:database:book_id tag:tag_name:mysql:book_id 7 # 在根據book:book_id:7:name得到書籍名稱,但若是返回的數據量大,能夠先添加一個store參數存到一個臨時集合裏,而後再用sort分頁取回; # 查全部的PHP以及mysql的書;【取並集】 127.0.0.1:6379> sunion tag:tag_name:php:book_id tag:tag_name:mysql:book_id 5 7 set book:book_id:9:name 'javascript權威指南' set book:book_id:10:name 'HTML+CSS' sadd tag:tag_name:web:book_id 5 9 10 #查web標籤中的非PHP書籍 127.0.0.1:6379> sdiff tag:tag_name:web:book_id tag:tag_name:php:book_id 9 10
http://ju.outofmemory.cn/entr...
http://www.cnblogs.com/kgdxpr...redis