【原创】REDIS与MYSQL实现标签的对比

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介:

这里来演示下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"




本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/1723464 ,如需转载请自行联系原作者
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
89 26
|
2天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
54 7
|
1月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
67 14
|
1月前
|
存储 NoSQL 关系型数据库
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
86 4
|
1月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MYSQL日志之详解如何配置查看二进制、查询及慢查询日志;备份与恢复等具体详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
|
1月前
|
存储 SQL NoSQL
|
1月前
|
存储 SQL NoSQL
2024Mysql And Redis基础与进阶操作系列(10)作者——LJS[你个IKUN还学不会嘛?你是真爱粉嘛?真是的 ~;以后别侮辱我家鸽鸽]
Mysql And Redis基础与进阶操作系列之存储函数和MySQL 触发器等具体举例以及详解步骤;注意点及常见报错问题所对应的解决方法]
|
6天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
121 85
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
84 6

推荐镜像

更多