REDIS与MYSQL实现标签的对比_MySQL

php中文网
发布: 2016-05-27 13:46:18
原创
1760人浏览过

这里来演示下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.75 build build 090709
微尔企业网站管理系统1.75 build build 090709

系统功能介绍 1 包含企业网站所必备的功能:企业信息、产品管理、人才招聘、新闻资讯、企业图片、以及视频下载等模块2 由于是从CMS系统的基础上开发而成,因此相对于一些其他的企业网站管理系统,本系统具备更强的可扩展能力,可以胜任从小型工作室到大中型企业网上门户等各种不同规模网站的需求。3 后台管理与模板完全分离,并具备非常灵活的标签技术,可以实现无限制个性化的界面定制4 操作简单,利用已经制作好的模

微尔企业网站管理系统1.75 build build 090709 0
查看详情 微尔企业网站管理系统1.75 build build 090709
下来我们在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"
登录后复制
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号