REDIS與MYSQL實現標簽的對比
這里來演示下REDIS和MYSQL之間的數據轉換問題,REDIS 是典型的KEY -VALUE型NOSQL數據庫,并且提供了額外豐富的數據類型。這里簡單列舉了標簽類型的應用問題。
比如在MySQL里面,對內容的標簽有以下簡單的幾張表,我這里只列出來拆分過后的表結構
第一,MySQL部分,
內容表: CREATE TABLE `content` ( `id` int(10) unsigned NOT NULL, -- 內容ID,唯一。 `name` varchar(60) DEFAULT NULL, -- 內容的名字 `created_timestamp` timestamp NULL DEFAULT NULL, -- 內容的加入時間 PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 標簽表: CREATE TABLE `tag` ( `tag_name` varchar(60) NOT NULL, -- 標簽名字,唯一 `visit_count` int(10) unsigned NOT NULL DEFAULT '0', -- 標簽的訪問次數 PRIMARY KEY (`tag_name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 內容與標簽的關系,多對多。 CREATE TABLE `content_tag_relation` ( `content_id` int(10) unsigned NOT NULL, -- 內容ID `tag_name` varchar(60) NOT NULL -- 標簽名字 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
假設我們有以下的需求:
1. 得到標簽對應的文章名字,
SELECT a.name FROM content AS a,content_tag_relation AS b WHERE a.id = b.content_id AND b.tag_name = 'mysql'
SELECT tag_name FROM tag WHERE 1 ORDER BY visit_count DESC LIMIT 3;
下來我們在REDIS里面存儲這部分數據。
第二,redis部分,
1. a,內容,我們用STRING類型來做,值用JSON來存儲,t_girl:6379> set string:content_id:4 '{"name":"test48601","created_timestamp":"2012-01-01 05:41:01"}'
OK
t_girl:6379> get string:content_id:4
"{\"name\":\"test48601\",\"created_timestamp\":\"2012-01-01 05:41:01\"}" 但是如果想得到內容對應的名字和創建時間,REDIS方面獲取困難,就得交給程序來做了。
b,或者也可以用HASH類型來存儲,
t_girl:6379> hset 'hset:content_id:4' name 'test48601'
(integer) 1
t_girl:6379> hset 'hset:content_id:4' created_timestamp '2012-01-01 05:41:01'
(integer) 1 那這時想獲取對應的名字以及時間非常容易
t_girl:6379> hget hset:content_id:4 name
"test48601"
t_girl:6379> hget hset:content_id:4 created_timestamp
"2012-01-01 05:41:01"
t_girl:6379>
t_girl:6379> zadd zset:tag 680 database 469 db2
(integer) 2 比如我們想要得到訪問前三的標簽名字?
t_girl:6379> zrevrangebyscore zset:tag +inf 0 limit 0 3
1) "mongodb"
2) "sql"
3) "postgresql" 3. 標簽與內容的關系,我們用集合來做,
t_girl:6379> sadd set:content_id:4 role mongodb role database
(integer) 3 那么也很容易得到指定內容對應的標簽
t_girl:6379> smembers set:content_id:4
1) "database"
2) "role"
3) "mongodb" 4. a, 如果用上面的設計我們實現稍微復雜些的需求:比如得到標簽對應的文章名字。這樣的需求貌似沒有可以直接拿來用的方法,比如下面我寫的一段PYTHON代碼來獲取:
import redis
content_id_keys = r.keys('set*')
content_id_keys_len = len(content_id_keys)
i = 0
j = 0
content_name_list = []
while i < content_id_keys_len:
if r.sismember(content_id_keys[i],'mysql') == 1:
content_name_list.append(eval(r.get(content_id_keys[i].replace('set','string')))['name'])
print('Content name is :' + content_name_list[j])
j += 1
i += 1
t_girl:6379> sadd tag:mysql test123 test133 test144 test155
(integer) 4
t_girl:6379> smembers tag:mysql
1) "test133"
2) "test155"
3) "test123"
4) "test144" 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!