天天看点

Redis快速实战-为什么要使用缓存?缓存能做什么?

作者:架构师面试宝典
Redis快速实战-为什么要使用缓存?缓存能做什么?

什么是缓存?

缓存原本是指代在CPU上的一种高速存储机制,主要是用来解决CPU与内存之间的数据交换速度不匹配的问题。现在被用来泛指计算机系统之间原始数据的复制集合,用来解决数据访问与数据提供速度不匹配的问题。在互联网技术中,缓存是用来实现系统快速响应的关键技术之一,是一种以空间换取时间的技术手段。

缓存的使用场景

用于减轻DB服务器的压力

一般情况下,数据是被存储在数据库中,应用程序通过各种手段来获取到数据库中的数据进行业务逻辑操作,完成用户交互。这种情况在系统初期业务量较少的情况下勉强可以完成整个的系统业务支持,但是随着系统不断的运行,业务不断增加,数据的积累,最终会导致数据库的访问压力越来越大。

这个时候我们可以采取分库分表、读写分离等技术来减轻数据库的访问压力。但是业务的增加随之带来的就是用户访问的增加,这个时候,如果有大量的访问到达的时候,就无法通过分库分表的方式或者是通过读写分离的方式来解决高并发的问题了,毕竟不可能无限的增加分库,增加数据库服务器。这个时候就必须要引入缓存了。

Redis快速实战-为什么要使用缓存?缓存能做什么?

通过引入缓存技术,将用户已经访问过的数据加入到缓存中,这样在极大的程度上可以减少对于数据库的访问压力。

提高系统响应速度

通过引入缓存技术,将用户经常访问的数据加入到缓存中,当用户再次访问的时候,就可以直接从缓存中进行获取,这样减少了数据访问的时间。

我们知道数据库的数据是被存储在文件中的,而这些文件又是被存放在磁盘之中,这个时候如果要进行数据访问就不得不进行一次内存交换操作。也就是将磁盘中的数据从用户态转换为内存态,然后再将内存态的数据转换成为数据库SQL语句读取的用户态数据。

这样频繁的内存交换操作会使得系统性能有很大的损坏,如果在瞬间出现大量并发读取操作的时候MySQL就会因为IO操作而造成数据无法响应等问题出现,严重的情况可能会导致数据库系统宕机。

引入缓存操作之后,是将数据放入到了内存中,而内存的响应速度是是非常高的,并且内存也是天然支持高并发访问的机制,可以瞬间处理大量的请求。这样可以极大的提升系统响应速度。

用来完成Session共享

在传统的单体应用中Session操作是有Tomcat容器自己进行管理维护,并且如果出现多个应用部署的时候,就需要重新建立Session会话。但是在分布式场景中,由于不同的应用会有多个不同的实例部署,就会出现在多个实例之间Session不共享的情况,如果通过网络对各个应用实例之间的Session进行共享,那将会是一个非常消耗性能的操作。极大的影响了系统的响应。

所以当用户登录成功之后,我们可以将Session的信息放入到缓存中,这样在多个应用实例之间就可以实现Session的共享。而缓存又是一个临时的存储空间,可以时间过期清理缓存的操作,就可以完成登录时间过期等操作。如下图所示

Redis快速实战-为什么要使用缓存?缓存能做什么?

用来完成分布式锁操作

Redis还被用来实现分布式锁操作,在单例模式中我们可以使用Java提供的内存锁来实现在同一个Java进程中所有线程的锁操作,但是在分布式场景中,每个Java应用实例都是独立运行在不同的JVM中的,所以说必须要提供一个公共的锁机制来保证多线程并发访问共享资源的线程安全操作。这个时候我们就可以使用Redis来实现对于分布式共享资源的锁定操作。

在大型网站中的使用

在单机架构的LAMP、JavaEE(SSM)、Spring Boot 提供的Jar包应用中,随着业务需求的不断增加,用户访问量的不断增加,系统的响应能力就会不断降低,用户对于系统的体验也会越来越差。如下图所示。

Redis快速实战-为什么要使用缓存?缓存能做什么?

这样的系统,存在的最大的问题并不是在于用户访问并发的增,而是随着时间的积累,用户数据的的不断增加,静态资源等的不断增加,最终导致了系统响应缓慢,用户体验降低。

随着架构的从单体架构变成分布式架构,加之引入微服务等操作,系统的性能也随之提升,但是由于数据积累的问题,还是会出现系统响应慢的问题,所以就需要在各种层级中添加缓存。最终就形成了上面这样的一个结构。

总结

总得来说,对于缓存的理解,就主要抓住它的核心功能,就是为了解决访问速度不匹配的问题。无论使用什么样的缓存中间件,都离不开这个核心思想。

继续阅读