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

简介:

这里来演示下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)
     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里面做一份冗余的集合来存储,这样就可以直接把信息拿出来。

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 ,如需转载请自行联系原作者
相关文章
|
12月前
|
缓存 NoSQL 关系型数据库
MySQL 与 Redis 如何保证双写一致性?
我是小假 期待与你的下一次相遇 ~
1180 7
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
12月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1049 6
|
缓存 NoSQL 关系型数据库
Redis与MySQL的数据一致性
在高并发环境下,保持 Redis 和 MySQL 的数据一致性是一个复杂但重要的问题。通过采用读写穿透、写穿透、分布式锁、双写一致性保障和延时双删策略,可以有效地减少数据不一致的风险,确保系统的稳定性和可靠性。通过合理的缓存策略和数据同步机制,可以显著提升系统的性能和用户体验。
920 22
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1906 0
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
1037 25
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
477 1
Redis专题-实战篇二-商户查询缓存

推荐镜像

更多