认识Redis

文章目录

  • 为什么需要使用缓存中间件
    • 提高读取性能
    • 降低数据库负载
    • 提高可伸缩性
    • 降低外部依赖
    • 提高用户体验
    • 缓存数据一致性
    • 应对突发流量
  • 缓存的类型
    • 本地缓存
    • 分布式缓存
    • 内存缓存
    • 磁盘缓存
    • 缓存代理
  • 什么是Redis
  • Redis 和 Memcached 对比
    • 数据结构支持
    • 持久化支持
    • 数据查询和操作
    • 数据复制和分布式
    • 内存管理:
    • 生态系统和支持库
    • 应用场景
    • 总结
  • 为什么用 Redis 作为 MySQL 的缓存?
    • Redis 具备高性能
    • Redis 具备高并发
      • 单线程模型
      • 非阻塞I/O
    • Redis高可用性
  • 后期预告
    • Redis的安装与基本使用
    • Redis的基本操作
    • Redis缓存雪崩、击穿、穿透详解
    • Redis缓存与数据库如何保证一致性

为什么需要使用缓存中间件

因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件,我们可以从以下几个方面展开看看

提高读取性能

缓存中间件将常用数据存储在内存中,以提供快速的读取操作。因为内存访问速度比从磁盘或网络获取数据快得多,所以使用缓存可以显著降低数据检索的延迟,提高应用程序的响应速度。

降低数据库负载

缓存可以减少对数据库的频繁查询,因为常用数据可以从缓存中获取,而无需每次都从数据库中检索。这降低了数据库服务器的负载,使其可以更好地处理事务性操作和写入操作。可以将一些比较常用的数据并且更新频次较低的数据缓存到数据库中,比如省市区信息,比如商品库等等。

提高可伸缩性

缓存可以分散负载,使多个应用程序实例共享相同的缓存数据。这种分布式缓存架构有助于应对大量用户同时访问应用程序的情况,支持应用程序的水平扩展。

降低外部依赖

缓存中间件可以减少对外部服务或数据源的依赖。这意味着即使外部服务不稳定或不可用,应用程序仍然可以从缓存中获取数据,保持了应用程序的可用性。

提高用户体验

快速的响应时间和低延迟通常导致更好的用户体验。用户不必等待太长时间才能看到所需的数据或页面,这可以提高用户满意度并增加用户留存率。

缓存数据一致性

缓存中间件通常提供缓存数据的过期和更新机制,以确保缓存数据与源数据保持一致。这有助于防止数据陈旧问题,并避免用户看到过时的信息。

应对突发流量

在促销活动、新闻事件或其他突发事件期间,应用程序可能会遇到突发的高流量。使用缓存可以帮助平滑处理这些高峰,而不至于使服务器不堪重负。

缓存的类型

本地缓存

通常存储在应用程序内存中,用于快速访问常用数据。本地缓存就是在进程的内存中进行缓存,比如我们的 JVM 堆中,可以用 LRUMap 来实现,也可以使用 Ehcache 这样的工具来实现。

本地缓存是内存访问,没有远程交互开销,性能最好,但是受限于单机容量,一般缓存较小且无法扩展。

分布式缓存

像Redis这样的缓存中间件可以在多个应用程序实例之间共享缓存数据。分布式缓存一般都具有良好的水平扩展能力,对较大数据量的场景也能应付自如。缺点就是需要进行远程请求,性能不如本地缓存。

内存缓存

使用内存存储数据,以提供极快的读写速度。

磁盘缓存

将数据存储在磁盘上,以便在服务重启后仍然可用。

缓存代理

像CDN(内容分发网络)一样的代理服务器可以缓存静态资源,减轻原始服务器负载。一般我们前端静态资源会使用cdn缓存来加快页面的加载。

什么是Redis

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景

Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。

除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等

Redis 和 Memcached 对比

数据结构支持

  • Redis: Redis支持多种数据结构,如字符串、列表、集合、有序集合、哈希表等,使其能够存储更复杂的数据和执行更丰富的数据操作。
  • Memcached: Memcached仅支持简单的键值对数据存储,没有内置的数据结构。

持久化支持

  • Redis: Redis支持数据持久化,可以将数据写入磁盘,以便在服务重启后恢复数据。这使得Redis更适合用于缓存和持久存储。
  • Memcached: Memcached通常不支持数据持久化。如果需要持久化,通常需要依赖额外的解决方案。

数据查询和操作

  • Redis: Redis支持复杂的数据查询和操作,如范围查询、排序、事务等。这使得Redis在一些使用场景中更加灵活。
  • Memcached: Memcached仅支持基本的键值操作,不支持复杂的数据操作。

数据复制和分布式

  • Redis: Redis支持主从复制和集群模式,能够实现高可用性和分布式部署。
  • Memcached: Memcached通常需要依赖外部工具来实现复制和分布式部署。

内存管理:

  • Redis: Redis提供了更丰富的内存管理选项,可以配置最大内存使用、数据淘汰策略等。
  • Memcached: Memcached的内存管理较为简单,通常需要手动处理数据淘汰。

生态系统和支持库

  • Redis: Redis拥有广泛的生态系统,包括各种客户端库、工具和扩展,使其更容易集成到不同的应用程序中。
  • Memcached: Memcached的生态系统相对较小,不如Redis丰富。

应用场景

  • Redis: 由于其支持更多数据类型和更丰富的功能,Redis常用于缓存、会话存储、消息队列、实时分析等广泛的应用场景。
  • Memcached: Memcached通常用于简单的键值对缓存,适用于需要高速数据检索的场景。

总结

总的来说,选择使用Redis还是Memcached取决于应用程序的需求和场景。如果需要更复杂的数据操作、数据结构支持、数据持久化以及更丰富的功能,那么Redis可能是更好的选择。而如果只需要基本的键值对缓存,可以考虑使用Memcached。在某些情况下,也可以考虑将两者结合使用,以满足不同的需求。

为什么用 Redis 作为 MySQL 的缓存?

Redis 具备高性能

假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据缓存在 Redis 中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了,操作 Redis 缓存就是直接操作内存,所以速度相当快。如果 MySQL 中的对应数据改变的之后,同步改变 Redis 缓存中相应的数据即可,不过这里会有 Redis 和 MySQL 双写一致性的问题,大家可以思考一下如何解决这个问题,后面会提出如何解决这个问题。

Redis 具备高并发

单线程模型

Redis采用单线程模型,即所有命令都在一个主线程中执行。这一特性看似不利于高并发,但实际上,Redis通过使用非阻塞I/O和事件循环机制来充分发挥单线程的性能。它可以处理数千个并发客户端连接,而不需要创建大量线程,从而降低了线程管理的开销。

非阻塞I/O

Redis使用非阻塞的I/O操作,它可以在等待数据就绪时处理其他任务,而不是被阻塞在I/O操作上。这使得Redis能够在等待数据时接受其他客户端的请求,从而提高了并发性。

所以,直接访问 Redis 能够承受的请求是远远大于直接访问 MySQL 的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库

Redis高可用性

与mysql类似,Redis支持主从复制和集群模式,可以提供高可用性和容错性,确保缓存的稳定性。

后期预告

后续将会持续更新Redis 相关文章,包含Redis的安装与基本命令使用,以及Redis常用使用场景,目前规划的有以下文章:

Redis的安装与基本使用

文章内容会讲解Redis在Windows以及linux 的安装,以及基本Redis命令操作

Redis的基本操作

会通过命令行来操作具体的Redis命令操作,以及结合实际场景操作

Redis缓存雪崩、击穿、穿透详解

对针对这三种情况展开讲解,结合相关实际用例

Redis缓存与数据库如何保证一致性

由于引入了缓存,那么在数据更新时,不仅要更新数据库,而且要更新缓存,这两个更新操作存在前后的问题,到底是先更新数据库,再更新缓存?还是先更新缓存,再更新数据库?

你可能感兴趣的:(redis,数据库,缓存)