为什么 Redis 比 MySQL 缓存快?

为什么 Redis 比 MySQL 缓存快?

 在一次课堂项目演示的过程中,老师提出了一个问题:“为什么要选择 Redis 作为缓存,而不是选择MySQL 缓存呢?Redis 的优势在哪?”

 对于这个问题我一时间回答不出来,只是说了些 “Redis 是基于内存操作的,存储查询速率很快“ 之类的话,老师回应说 ”那 MySQL 缓存也是在内存操作的,为什么比不上 Redis 呢 “,这时我陷入了沉默。

 课后我查找了一些资料,写出这篇文章,该篇文件从 MySQL 缓存 和 Redis 两个方面进行阐述,论证了 Redis 为什么 比 MySQL 缓存快这个问题。

​ 由于查找资料较少,论证观点可能存在错误,望修改指正。



MySQL 缓存

MySQL 采用的缓存方式是 MYSQL Query Cache(MySQL 查询缓存)。

实现手段是:

 对 查询语句 进行 hash 计算,然后把得到的 hash 值 与 hash 链表(初始状态为空)进行一次匹配。

 如果匹配不成功,则将该 hash 值 作为新节点插入到 hash 链表中,并把 Query 结果集存放到 Cache 中,再将结果集的内存地址存放到对应的 hash 链表节点中;

​ 如果匹配成功,则返回该 hash 值对应 Query 结果集所在的内存地址。

在这里插入图片描述

Query Cache 的缺点:

  • Query Cache 是基于 select 语句的 Query 结果集进行缓存,这就造成了一个问题:缓存结构单一,我们没法去构建一个更高效的缓存结构。
  • Query Cache 只能缓存 select 语句,不能修改缓存内容,这也导致了一个问题:如果数据库表的内容发生改动了,该缓存就作废了。
  • Query Cache 是多线程的,因而在查询缓存前会加一个全局锁(global lock),这就产生了锁资源的开销,并且线程间的切换和上下文的切换也会造成额外资源的浪费。


Redis

Redis 的缓存方式:将目标数据以 K-V 键值对的形式存储在内存中。

Redis 的优点:

  • Redis 基于 K-V 键值对的存储模式,查找的时间复杂度为 O(1) 。
  • Redis 是单线程的,不用考虑加锁问题,减少了锁资源的消耗,并且也避免了线程间切换和上下文切换所造成的额外资源消耗问题。
  • Redis 采用了多路 IO 复用模型,使得单个线程可以高效的处理多个请求。

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Spring Boot进行MySQL缓存时,可以使用Redis作为缓存中间件。为此,需要在项目中添加相关依赖和配置。 首先,在项目的构建文件中(如pom.xml或build.gradle)添加以下依赖项: - mysql-connector-java:用于MySQL数据库的连接器 - spring-boot-starter-data-jpa:用于与JPA(Java Persistence API)集成的Spring Boot启动器 - spring-boot-starter-data-redis:用于与Redis集成的Spring Boot启动器 例如,在pom.xml文件中添加以下代码引用: ``` <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 接下来,需要在应用程序的配置文件(如application.properties或application.yml)中进行配置。配置MySQLRedis的连接信息,以及其他相关属性。 例如,在application.properties文件中添加以下配置引用: ``` # MySQL数据库连接配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name spring.datasource.username=your_username spring.datasource.password=your_password # JPA配置 spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.jpa.show-sql=true # Redis配置 spring.redis.host=your_redis_host spring.redis.port=your_redis_port spring.redis.password=your_redis_password spring.redis.database=0 ``` 完成上述步骤后,你可以在Spring Boot应用程序中使用JPA和Redis作为MySQL缓存。可以通过定义实体类、编写Repository接口和使用相应的注解来操作数据库数据。使用Redis作为缓存中间件可以提高数据的读取速度和性能。 希望这个回答对您有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringBoot使用Redis缓存MySql](https://blog.csdn.net/lanxing_huangyao/article/details/123042333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值