Map实现缓存

为什么要使用缓存

缓存最终的目的是为减轻服务端压力,减少网络传输请求

客户端缓存  

浏览器访问自带缓存~~

页面缓存

浏览器缓存

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 去检查下 有过期的没 然后执行删除操作

猜你喜欢

转载自www.cnblogs.com/toov5/p/9880563.html
今日推荐