这里来演示下REDIS和MYSQL之间的数据转换问题,REDIS 是典型的KEY -VALUE型NOSQL数据库,并且提供了额外丰富的数据类型。这里简单列举了标签类型的应用问题。
比如在MySQL里面,对内容的标签有以下简单的几张表,我这里只列出来拆分过后的表结构
第一,MySQL部分,
内容表:
1
2
3
4
5
6
|
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
|
标签表:
1
2
3
4
5
|
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
|
内容与标签的关系,多对多。
1
2
3
4
|
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
2
3
4
5
6
|
假设我们有以下的需求:
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来存储,
1
2
3
4
5
|
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类型来存储,
1
2
3
4
5
6
7
8
9
10
|
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对应的有序来做访问量的排序。
1
2
3
4
5
6
7
|
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. 标签与内容的关系,我们用集合来做,
1
2
3
4
5
6
7
|
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代码来获取:
1
2
3
4
5
6
7
8
9
10
11
12
|
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里面做一份冗余的集合来存储,这样就可以直接把信息拿出来。
1
2
3
4
5
6
7
|
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"
|
本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/1723464
,如需转载请自行联系原作者