[오리지널] REDIS와 MYSQL 구현 라벨의 대비

3588 단어 redismysql
여기서 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;

내려와.
둘째, 리디스 부분,
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"

좋은 웹페이지 즐겨찾기