• 技术文章 >数据库 >mysql教程

    REDIS与MYSQL实现标签的对比_MySQL

    2016-05-27 13:46:18原创755
    这里来演示下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"
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:标签
    上一篇:MySql5.5忘记root密码怎么办_MySQL 下一篇:关于MySQL 优化的100个的建议_MySQL
    Web大前端开发直播班

    相关文章推荐

    • MySQL性能调优之分区表(总结分享)• mysql怎么增加权限• 夯实MySQL基础的问题归纳• mysql视图与表的区别是什么• mysql怎么删除unique约束

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网