为什么要使用缓存
缓存最终的目的是为减轻服务端压力,减少网络传输请求
客户端缓存
浏览器访问自带缓存~~
页面缓存
浏览器缓存
App客户端缓存 IOS 前端开发 底层都有缓存技术的
(移动端登录 用token 本地是有个文件的)
如果一旦请求到服务器端之后,会在本地缓存一份,快速响应给用户。
网络缓存
代理缓存(Nginx可以缓存)
CDN缓存
服务器缓存
数据库缓存
平台缓存级缓存
缓存最终的目的是为减轻服务端压力,减少网络传输请求
Session 是存放在服务器端(保存在单个JVM中),返回SessionId(响应头),客户端存放的SessionId,下次请求时候,直接使用对于的SessionId从服务器端查询对应Session
分布式Session (Session共享的问题)----直接使用token解决
实现单个JVM缓存框架, Session Key Value 可以用Map集合实现 过期时间需要好好设计了
废话不多说,写一个给予Map集合实现Jvm缓存框架
项目目录结构:
首先定义map实现的缓存类:(concurrentHashmap保证安全)
package com.toov5.ehcache; import java.util.concurrent.ConcurrentHashMap; import org.springframework.stereotype.Component; @Component //这样的话 就是单例的了!!!注入到容器里面 public class MapCache<K,V> { //存放缓存容器 public ConcurrentHashMap<K, V> concurrentHashMap = new ConcurrentHashMap<K,V>(); //纯手写单个JVM缓存框架 缓存概念偏向于临时 //对传统的Map包装 public void put(K key,V value){ concurrentHashMap.put(key, value); } //查询 public V get(K key){ return concurrentHashMap.get(key); } public void remove(String k){ //这个map是安全的 不需要加锁! concurrentHashMap.remove(k); } }
Controller业务类
package com.toov5.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.toov5.ehcache.MapCache; @RestController public class IndexController { @Autowired private MapCache<String, Object> mapCache; @RequestMapping("/get") public String get(String key){ return (String)mapCache.get(key); } @RequestMapping("/put") public String put(String key, String value){ mapCache.put(key, value); return "成功"; } @RequestMapping("/remove") public String remove(String key){ mapCache.remove(key); return "成功"; } }
App启动类:
package com.toov5.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication(scanBasePackages={"com.toov5.*"}) public class app { public static void main(String[] args) { SpringApplication.run(app.class, args); } }
运行结果
有效期设计:再开一个定时Job 每隔1S 去检查下 有过期的没 然后执行删除操作