文档章节

REDIS与MYSQL实现标签的对比

f
 fengduss
发布于 2015/12/16 19:06
字数 873
阅读 12
收藏 0

这里来演示下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)
     =  0
     =  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])
             + =  1
         + =  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"


获取【下载地址】 

© 著作权归作者所有

f
粉丝 0
博文 1
码字总数 873
作品 0
海口
私信 提问
【原创】REDIS与MYSQL实现标签的对比

这里来演示下REDIS和MYSQL之间的数据转换问题,REDIS 是典型的KEY -VALUE型NOSQL数据库,并且提供了额外丰富的数据类型。这里简单列举了标签类型的应用问题。 比如在MySQL里面,对内容的标签...

david_yeung
2015/12/16
0
0
结合SSM框架讲解Shiro案例--Shiro Demo

本教程结合SSM(SpringMVC + Mybatis)框架讲解Shiro(Shiro是 Java 的一个安全框架。我们经常看到它被拿来和 Spring 的 Security 来对比。),讲解的内容有自定义Shiro拦截器,Shiro Freem...

8446666
2016/06/29
29K
11
2019BATJ面试题详解:MyBatis+MySQL+Spring+Redis+多线程

这里为大家分享一些面试的一手资料,供大家迎接接下来的金三银四跳槽季 Spring Spring 概述 什么是spring? 使用Spring框架的好处是什么? Spring由哪些模块组成? 解释AOP模块 Spring配置文件...

别打我会飞
03/20
315
0
mysql理由canal同步数据到redis的数据比对

使用canal读取mysql的binlog实时同步msyql中的数据到redis。 现在要做一个功能,要求能查看某个时间段内对比mysql的数据与redis的数据是否一致。比如想查看10号到20号之间,mysql的数据和red...

浅浅浅浅
03/27
55
0
Laravel5.2之Model Observer模型观察者

说明:本文主要学习下Laravel的Model Observer模型观察者,把一点点经验分享出来希望对别人能有帮助。同时,会将开发过程中的一些截图和代码黏上去,提高阅读效率。 备注:上一篇文章:Larav...

botkenni
2016/10/22
31
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部