缓存服务的意义
为什么要使用缓存?说到底是为了提高系统的运行速度。将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度。一个 web 应用的简单结构如下图。
web 应用典型架构
在这个结构中,用户的请求通过用户层来到业务层,业务层在从数据层获取数据,返回给用户层。在用户量小,数据量不太大的情况下,这个系统运行得很顺畅。但是随着用户量越来越大,数据库中的数据越来越多,系统的用户响应速度就越来越慢。系统的瓶颈一般都在数据库访问上。这个时候可能会将上面的架构改成下面的来缓解数据库的压力。
一主多从结构
在这个架构中,将数据库的读请求和写请求进行分离。数量众多的读请求都分配到从数据库上,主数据库只负责写请求。从库保持主动和主库保持同步。这个架构比上一个有了很大的改进,一般的互联网应用。这个架构就能够很好的支持了。他的一个缺点是比较复杂,主从库之间保持高效实时,或者准实时的同步是一个不容易做到的事情。所以我们有了另一个思路,采用一个缓存服务器来存储热点数据,而关系数据用来存储持久化的数据。结构如下图所示
采用缓存服务器读的架构
采用缓存服务器读的架构
在这个架构中,当读取数据的时候,先从缓存服务器中获取数据,如果获取调,则直接返回该数据。如果没有获取调,则从数据库中获取数据。获取到后,将该数据缓存到换出数据库中,供下次访问使用。当插入或者更新数据的时候,先将数据写入到关系数据库中,然后再更新缓存数据库中的数据。
当然了,为了应付更大规模的访问量,我们还可以将上面两个改进的架构组合起来使用,既有读写分离的关系数据库,又有可以高速访问的缓存服务。
以上缓存服务器架构的前提就是从缓存服务器中获取数据的效率大大高于从关系型数据库中获取的效率。否则缓存服务器就没有任何意义了。redis 的数据是保存在内存中的,能够保证从 redis 中获取数据的时间效率比从关系数据库中获取高出很多。
基于 redis 缓存服务的实现
这一章节用一个实例来说明如何来在 Java 中实现一个 redis 的缓存服务。
建立 maven 工程并引入依赖
定义接口类com.x9710.common.redis.CacheService
在这个接口类中,主要定了下面的接口
void putObject(String key, Object value);
void putObject(String key, Object value, int expiration);
Object pullObject(String key);
Long ttl(String key);
boolean delObject(String key);
boolean expire(String key, int expireSecond);
void clearObject();
这些接口分别用于存储不过期的对象、存储将来过期对象、获取缓存对象、获取缓存对象剩余存活时间、删除缓存对象、设置缓存对象过期时间、清除所有缓存对象的功能
package com.x9710.common.redis;
/**
* 缓存服务接口
*
* @author 杨高超
* @since 2017-12-09
*/
public interface CacheService {
/**
* 将对象存放到缓存中
*
* @param key 存放的key
* @param value