免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
【redis專(zhuān)題(10)】KEY設(shè)計(jì)原則與技巧

對(duì)比著關(guān)系型數(shù)據(jù)庫(kù),我們對(duì)redis key的設(shè)計(jì)一般有以下兩種格式:

  • 表名:主鍵名:主鍵值:列名
  • 表名:主鍵值:列名 在所有主鍵名都是id的情況下(其實(shí)我個(gè)人不喜歡這種情況,比如user表,它的主鍵名就應(yīng)該是user_id,而不是id,這樣在表與表之間關(guān)聯(lián)的時(shí)候一目了然)

用冒號(hào)作為分割是設(shè)計(jì)key的一種不成文的原則,遵循這種格式設(shè)計(jì)出的key在某些redis客戶(hù)端下可以有效的識(shí)別;

但是,在關(guān)系型數(shù)據(jù)中,除主鍵外,還有可能根據(jù)其他列來(lái)查詢(xún)。
如上表中, username 也是極頻繁查詢(xún)的,往往這種列也是加了索引的。
轉(zhuǎn)換到k-v數(shù)據(jù)中,則也要相應(yīng)的生成一條按照該列為主的key-value。

Set user:username:lisi:uid  9  #但是要保證username是唯一的; 這樣,我們可以根據(jù)username:lisi:uid ,查出userid=9, 再查user:9:password/email ...

mysql與redis的數(shù)據(jù)轉(zhuǎn)換實(shí)例

mysql數(shù)據(jù)準(zhǔn)備

CREATE TABLE `book` (  `book_id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '書(shū)名',  `add_time` int(10) NOT NULL DEFAULT '0' COMMENT '添加時(shí)間',  PRIMARY KEY (`book_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='書(shū)本表';INSERT INTO book VALUES (5, 'PHP圣經(jīng)', UNIX_TIMESTAMP() ), (6, 'ruby實(shí)戰(zhàn)', UNIX_TIMESTAMP() ), (7, 'mysql運(yùn)維', UNIX_TIMESTAMP() ), (8, 'ruby服務(wù)端編程', UNIX_TIMESTAMP() ); CREATE TABLE `tag` (  `tag_id` int(11) NOT NULL AUTO_INCREMENT,  `tag_name` char(40) NOT NULL DEFAULT '' COMMENT '標(biāo)簽名',  PRIMARY KEY (`tag_id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='標(biāo)簽表';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 '標(biāo)簽ID',  `book_id` int(11) NOT NULL DEFAULT '0' COMMENT '書(shū)ID',  KEY `tag_id` (`tag_id`),  KEY `book_id` (`book_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='標(biāo)簽與書(shū)關(guān)系表';INSERT INTO `tag_book` (`tag_id`, `book_id`) VALUES ('4', '7'),('1', '5'),('2', '6'),('2', '8');

我們有以下查詢(xún)需求:

# 《mysql運(yùn)維》有幾個(gè)標(biāo)簽: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運(yùn)維';    # 標(biāo)簽ruby下有幾本書(shū):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中,我們可以如下操作:

一個(gè)標(biāo)簽下面可以包含很多書(shū)籍,一個(gè)書(shū)籍也可以包含很多標(biāo)簽。這種從屬關(guān)系如果沒(méi)有排序需求的,我們可以使用集合:

  1. 可以準(zhǔn)確表達(dá)從屬關(guān)系,一個(gè)標(biāo)簽PHP的集合下面有:哪些書(shū)籍(存ID就可以了)
  2. 集合不僅可以方便CURD,還可以求并集交集等
set book:book_id:5:name 'PHP圣經(jīng)'set book:book_id:6:name 'ruby實(shí)戰(zhàn)'set book:book_id:7:name 'mysql運(yùn)維'set book:book_id:8:name 'ruby服務(wù)端編程'sadd tag:tag_name:php:book_id 5sadd tag:tag_name:ruby:book_id 6 8sadd tag:tag_name:database:book_id 7sadd tag:tag_name:mysql:book_id 7# ruby下面有哪些書(shū)127.0.0.1:6379> sort tag:tag_name:ruby:book_id get book:book_id:*:nameruby實(shí)戰(zhàn)ruby服務(wù)端編程 # 標(biāo)簽同時(shí)包含mysql,與database的書(shū) 【取交集】127.0.0.1:6379> sinter tag:tag_name:database:book_id tag:tag_name:mysql:book_id7 # 在根據(jù)book:book_id:7:name獲得書(shū)籍名稱(chēng),但如果返回的數(shù)據(jù)量大,可以先添加一個(gè)store參數(shù)存到一個(gè)臨時(shí)集合里,然后再用sort分頁(yè)取回;# 查所有的PHP以及mysql的書(shū);【取并集】127.0.0.1:6379> sunion tag:tag_name:php:book_id tag:tag_name:mysql:book_id57set book:book_id:9:name 'javascript權(quán)威指南'set book:book_id:10:name 'HTML+CSS'sadd tag:tag_name:web:book_id 5 9 10#查web標(biāo)簽中的非PHP書(shū)籍127.0.0.1:6379> sdiff tag:tag_name:web:book_id tag:tag_name:php:book_id910

總結(jié)如下:

  1. 表達(dá)從屬關(guān)系(一對(duì)多,多對(duì)多),最好用集合; 比如: 書(shū)名和標(biāo)簽,關(guān)注與被關(guān)注(微博粉絲關(guān)系)等等。
  2. 求最近的,一般利用鏈表后入后出的特性。比如:最近N個(gè)登錄的用戶(hù),可以維護(hù)一個(gè)登錄的鏈表,控制他的長(zhǎng)度,使得里面永遠(yuǎn)保存的是最近的N個(gè)登錄用戶(hù)。
  3. 對(duì)于排序,積分榜這類(lèi)需求,可以用有序集合,比如:我們把用戶(hù)和登錄次數(shù)統(tǒng)一存儲(chǔ)在一個(gè)sorted set里,然后就可以求出登錄次數(shù)最多用戶(hù)。
  4. 對(duì)于大數(shù)據(jù)量的非是即否關(guān)系,還可以通過(guò)位圖(setbit)的方式,比如:1億個(gè)用戶(hù), 每個(gè)用戶(hù) 登陸/做任意操作,記為今天活躍,否則記為不活躍;(每天一個(gè)位圖來(lái)記錄,會(huì)員id就是位圖的位置);
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Redis學(xué)習(xí)筆記3--Redis鍵值設(shè)計(jì)
mysql 查詢(xún)優(yōu)化 in 和 not in
淺談redis數(shù)據(jù)庫(kù)的鍵值設(shè)計(jì)
2017 年該學(xué)習(xí)的編程語(yǔ)言、框架和工具
php導(dǎo)出excel電子表格
通用郵件申請(qǐng)空間英文模板
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服