REDIS与MYSQL实现标签的对比

标签: redis mysql 标签 | 发表时间:2015-12-16 10:15 | 作者:yueliangdao0608
出处:http://blog.csdn.net
这里来演示下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"




作者:yueliangdao0608 发表于2015/12/16 10:08:04 原文链接
阅读:0 评论:0 查看评论

相关 [redis mysql 标签] 推荐:

REDIS与MYSQL实现标签的对比

- - CSDN博客推荐文章
这里来演示下REDIS和MYSQL之间的数据转换问题,REDIS 是典型的KEY -VALUE型NOSQL数据库,并且提供了额外丰富的数据类型. 这里简单列举了标签类型的应用问题. 比如在MySQL里面,对内容的标签有以下简单的几张表,我这里只列出来拆分过后的表结构. 内容表: CREATE TABLE `content` ( `id` int(10) unsigned NOT NULL, -- 内容ID,唯一.

浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移

- - CSDN博客数据库推荐文章
    ㈠ Redis 与 MySQL 的耦合性.     在业务架构早期、我们便该"吃着碗里的看着锅里的"、切莫让MySQL 有梦、而Redis 无心.     毕竟、有些关系型的结构不适合放到Redis跑、"男女搭配、干活不累"嘛、推荐让MySQL与Redis喜结连理.     其次、这 2 人、一般是在不同场景做选择、而不会在性能上选择、.

mysql突然出现大量慢sql,随后redis访问超时

- - Linux - 操作系统 - ITeye博客
在亚马逊云买了多台的虚拟主机,一年多没有由于系统的原因出过故障. 早上接到报警,从业务故障上来看,应该是数据库没有响应了. SSH连数据库服务器,发现连不上. 重启数据库服务器,一直起不来. 最后用上周的数据库服务器的系统备份snapshot(我们的数据盘和系统盘是分开的)新建一个Volume,替换掉故障系统盘,重新启动服务器,才顺利进入系统.

redis作为mysql的缓存服务器(读写分离)

- - 数据库 - ITeye博客
Redis是一个key-value存储系统. 和Memcached类似,为了保证效率,数据都是缓存在内存中. 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步. 在部分场合可以对关系数据库起到很好的补充作用. 它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便.

Mysql和Redis数据同步策略 - 元思 - 博客园

- -
不更新缓存是防止并发更新导致的数据不一致. 所以为了降低数据不一致的概率,不应该更新缓存,而是直接将其删除,. 然后等待下次发生cache miss时再把数据库中的数据同步到缓存. 如果先删除缓存,有一个明显的逻辑错误:考虑两个并发操作,线程A删除缓存后,线程B读该数据时会发生Cache Miss,然后从数据库中读出该数据并同步到缓存中,此时线程A更新了数据库.

JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)

- - 企业架构 - ITeye博客
MySQL到Redis数据复制方案. 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略.

全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发

- - 操作系统 - ITeye博客
重新安装系统,在苹果商店下载好OS X Mavericks安装文件,然后准备一支16G的USB3.0 U盘. 制作 OS X Mavericks 全新安装启动U盘. untitled 是你的u盘盘符,根据实际情况来. 看到上面的信息说明启动盘制作成功. 安装起来so easy :). 安装完成系统之后, 暂时还没有去迁移文件,由于本人喜好摄影,有大量RAW格式的原图在Aperture 的照片库中,尼康D800一张RAW文件有40M左右,到时候迁移照片库和照片流希望不要掉坑里了.

Redis 负载监控——redis-monitor

- - ITeye资讯频道
redis-monitor是一个Web可视化的 redis 监控程序. 使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等. 实时的消息处理信息,例如处理 command 数量、连接总数量等. 内存占用、 cpu 消耗实时动态图表.

Redis 起步

- - 博客园_首页
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章:. Redis是一个key-value存储系统. 和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型.

redis 配置

- - 谁主沉浮
# 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写). # 内存配置大小写是一样的.比如 1gb 1Gb 1GB 1gB. # daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes. # 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址.