1 为什么要使用缓存
缓存的分类
-
客户端缓存
- 页面缓存
- 浏览器缓存
- App 客户端缓存
-
网络缓存
- 代理缓存
- CDN 缓存
-
服务器缓存
- 数据库缓存
- 平台缓存级缓存
缓存最终的目的:是为减轻服务端压力,减少网络传输请求。
2 分布式 session
问题
session
是存放在服务器端的(保存在 单个 JVM
中),返回 sessionid
(在响应头中),客户端存放 sessionid
。当下次请求的时候,直接使用对应的 sessionid
从服务器中查询对应的 session
。
所以在分布式系统中,存在
session
共享的问题
推荐使用 token
2 基于 Map
集合实现本地缓存
2.1 定义 Map
缓存工具类
package com.snow.utils;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Map缓存工具类
*
* @param <K>
* @param <V>
*/
@Component
public class MapCaChe<K, V> {
// 存放缓存的容器
private Map<K, V> caCheMap = new ConcurrentHashMap<K, V>();
public void put(K k, V v) {
caCheMap.put(k, v);
}
public V get(K k) {
return caCheMap.get(k);
}
public void remove(K k) {
caCheMap.remove(k);
}
}
2.2 使用
package com.snow.controller;
import com.snow.utils.MapCaChe;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@Autowired
private MapCaChe<String, Object> mapCaChe;
@RequestMapping("/put")
public String put(String key, String value) {
mapCaChe.put(key, value);
return "success";
}
@RequestMapping("/get")
public String get(String key) {
String value = (String) mapCaChe.get(key);
return value;
}
@RequestMapping("/remove")
public String remove(String key) {
mapCaChe.remove(key);
return "success";
}
}
测试:
3 缓存框架分类
- 单点缓存框架(针对单个
JVM
,缓存容器存放在JVM
中,每个JVM
互不影响):Ehcache
- 分布式缓存框架:
Redis