Redis中分布式缓存的实现
1.什么是缓存
定义:就是计算机中的一段数据
2.内存中数据特点
1.读写快。因为Redis的数据直接在内存里面,我们用的时候不需要经过这种io读取的过程,直接拿过来用就行。而且我们也是直接操作内存中的数据,所以相对于我们操作磁盘上的数据要快的多得多,因为磁盘上的数据要经过io加载到内存中,才可以进行操作。
2.断电立即丢失。所谓断电立即丢失,就是在某一时刻我们的计算机突然断电了,就会让我们内存中的数据立即丢失。
那么我们了解完缓存的定义和缓存的特点之后,缓存到底能干什么呢?
3.缓存解决了什么问题?
1.提高了网站的吞吐量,提高了网站的运行效率。我们刚刚也了解了,缓存时计算机中的一段数据,它最大的特点就是读写快,正因为它读写很快,所以我们可以把一些常用的应用数据放在内存中,以后我们用的时候就直接去我们的应用数据中拿。
如图中描述,当我们在客户端发送一个请求,应用程序会根据我们的jdbc或者mybatis去打开数据库的连接,通过io把磁盘中的数据加载到应用程序的内存中,再响应给客户端之后,释放内存。但假如我们同时来了一百个请求对我们的应用发起查询操作,如果请求的数据在缓存中有,就只在缓存中获取,没有再去查数据库,再把得到数据放入缓存一份儿,这样就极大的提高了网站的运行效率,在一定程度上减轻了数据库的压力。那么既然缓存能提高效率,那项目中所有数据加入缓存岂不是更好?
4. 哪些数据可以放入缓存呢?
使用缓存时一定是数据库中数据极少发生修改时,更多用于查询这种情况。比如 省份、城市、县这些极少发生变化的信息。
5.本地缓存和分布式缓存的区别?
本地缓存:存在应用服务器内存中的数据称之为本地缓存(local cache)
分布式缓存:存储在当前应用服务器内存之外数据称之为分布式缓存(distribute cache)
集群:将同一种服务的多个节点放在一起共同对 系统提供服务过程称之为集群
分布式:有多个不同服务集群共同对系统提供服务这个系统称之为分布式系统(distributesystem)
6.利用mybatis自身本地缓存结合redis实现分布式缓存
首先mybatis的二级缓存存在应用服务器上,这种缓存也叫本地缓存,但是本地缓存占用了这台服务器jvm的内存,而且,本地缓存会随着jvm的结束而消失,同时,他只是存在于当前的应用服务器本身,那么日后在集群分布式系统下面它不能做到共享,如果我们用了分布式缓存,任意一个请求在任意一台服务器上查询了相应的操作,都会把它放入redis中,日后所有的查询都会从我们的redis中获取,那么日后缓存的丢失与我们当前应用服务器的重启和断电没有任何影响。
mybatis中catch标签的缓存实现
mybatis底层默认使用的是org.apache.ibatis.cache.impl.PerpetualCache实现
PerpetualCache实现代码:
public class PerpetualCache implements Cache {
private final String id;
private final Map<Object, Object> cache = new HashMap<>();
public PerpetualCache(String id) {
this.id = id;
}
@Override
public String getId() {
return id;
}
@Override
public int getSize() {
return cache.size();
}
@Override
public void putObject(Object key, Object value) {
cache.put(key, value);
}
@Override
public Object getObject(Object k