因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件,我们可以从以下几个方面展开看看
缓存中间件将常用数据存储在内存中,以提供快速的读取操作。因为内存访问速度比从磁盘或网络获取数据快得多,所以使用缓存可以显著降低数据检索的延迟,提高应用程序的响应速度。
缓存可以减少对数据库的频繁查询,因为常用数据可以从缓存中获取,而无需每次都从数据库中检索。这降低了数据库服务器的负载,使其可以更好地处理事务性操作和写入操作。可以将一些比较常用的数据并且更新频次较低的数据缓存到数据库中,比如省市区信息,比如商品库等等。
缓存可以分散负载,使多个应用程序实例共享相同的缓存数据。这种分布式缓存架构有助于应对大量用户同时访问应用程序的情况,支持应用程序的水平扩展。
缓存中间件可以减少对外部服务或数据源的依赖。这意味着即使外部服务不稳定或不可用,应用程序仍然可以从缓存中获取数据,保持了应用程序的可用性。
快速的响应时间和低延迟通常导致更好的用户体验。用户不必等待太长时间才能看到所需的数据或页面,这可以提高用户满意度并增加用户留存率。
缓存中间件通常提供缓存数据的过期和更新机制,以确保缓存数据与源数据保持一致。这有助于防止数据陈旧问题,并避免用户看到过时的信息。
在促销活动、新闻事件或其他突发事件期间,应用程序可能会遇到突发的高流量。使用缓存可以帮助平滑处理这些高峰,而不至于使服务器不堪重负。
通常存储在应用程序内存中,用于快速访问常用数据。本地缓存就是在进程的内存中进行缓存,比如我们的 JVM 堆中,可以用 LRUMap 来实现,也可以使用 Ehcache 这样的工具来实现。
本地缓存是内存访问,没有远程交互开销,性能最好,但是受限于单机容量,一般缓存较小且无法扩展。
像Redis这样的缓存中间件可以在多个应用程序实例之间共享缓存数据。分布式缓存一般都具有良好的水平扩展能力,对较大数据量的场景也能应付自如。缺点就是需要进行远程请求,性能不如本地缓存。
使用内存存储数据,以提供极快的读写速度。
将数据存储在磁盘上,以便在服务重启后仍然可用。
像CDN(内容分发网络)一样的代理服务器可以缓存静态资源,减轻原始服务器负载。一般我们前端静态资源会使用cdn缓存来加快页面的加载。
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。
Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。
除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等
总的来说,选择使用Redis还是Memcached取决于应用程序的需求和场景。如果需要更复杂的数据操作、数据结构支持、数据持久化以及更丰富的功能,那么Redis可能是更好的选择。而如果只需要基本的键值对缓存,可以考虑使用Memcached。在某些情况下,也可以考虑将两者结合使用,以满足不同的需求。
假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据缓存在 Redis 中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了,操作 Redis 缓存就是直接操作内存,所以速度相当快。如果 MySQL 中的对应数据改变的之后,同步改变 Redis 缓存中相应的数据即可,不过这里会有 Redis 和 MySQL 双写一致性的问题,大家可以思考一下如何解决这个问题,后面会提出如何解决这个问题。
Redis采用单线程模型,即所有命令都在一个主线程中执行。这一特性看似不利于高并发,但实际上,Redis通过使用非阻塞I/O和事件循环机制来充分发挥单线程的性能。它可以处理数千个并发客户端连接,而不需要创建大量线程,从而降低了线程管理的开销。
Redis使用非阻塞的I/O操作,它可以在等待数据就绪时处理其他任务,而不是被阻塞在I/O操作上。这使得Redis能够在等待数据时接受其他客户端的请求,从而提高了并发性。
所以,直接访问 Redis 能够承受的请求是远远大于直接访问 MySQL 的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库
与mysql类似,Redis支持主从复制和集群模式,可以提供高可用性和容错性,确保缓存的稳定性。
后续将会持续更新Redis 相关文章,包含Redis的安装与基本命令使用,以及Redis常用使用场景,目前规划的有以下文章:
文章内容会讲解Redis在Windows以及linux 的安装,以及基本Redis命令操作
对针对这三种情况展开讲解,结合相关实际用例
由于引入了缓存,那么在数据更新时,不仅要更新数据库,而且要更新缓存,这两个更新操作存在前后的问题,到底是先更新数据库,再更新缓存?还是先更新缓存,再更新数据库?