程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> REDIS與MYSQL實現標簽的對比

REDIS與MYSQL實現標簽的對比

編輯:MySQL綜合教程

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'


2. 按照訪問量顯示前三的標簽,

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> 


2. 標簽,我們用有序集合來做,這麼做的好處是可以用REDIS對應的有序來做訪問量的排序。
	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  


b.那其實我們可以在REDIS裡面做一份冗余的集合來存儲,這樣就可以直接把信息拿出來。

 

	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"

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved