使用Java写一个类似小程序Storage的工具类

编程入门 行业动态 更新时间:2024-10-22 20:26:41

使用Java写一个<a href=https://www.elefans.com/category/jswz/34/1770819.html style=类似小程序Storage的工具类"/>

使用Java写一个类似小程序Storage的工具类

起因:因为小程序需要获取accessToken来进行一些操作,而获取accessToken每天是有数量限制的,不可能每个用户请求一次就发一次请求,所以要将获取到的accessToken进行保存,刚好又在写小程序,觉得setStorage和getStorage很方便,所以就想写一个类似的方法。

首先,Java里有类似的机制吗?还真有,单例模式

偷懒起见,使用了hutool的单例Singleton,可自己改为饿汉,懒汉或者双重校验

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Singleton;
import lombok.Data;
import org.springframework.data.redis.core.RedisTemplate;import java.time.Duration;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;@Data
public class MyStorage
{@Data//内部类class AccessTokenStorage{//AccessToken 名字private Object token;//过期时间private LocalDateTime time;}//AccessTokenprivate Map<String, Object> map = new HashMap<>();//可换成饿汉、懒汉获取双重校验/*** 使用单例模式进行初始化* @return*/public static MyStorage init(){return Singleton.get(MyStorage.class);//单例}/*** 获取缓存* @param name* @return*/public Object getStorage(String name){if (map.containsKey(name)){return map.get(name);}return null;}/*** 存入缓存* @param name* @param obj*/public void setStorage(String name, Object obj){map.put(name, obj);}/*** 移除本地缓存中的某个缓存* @param name*/public void removeStorage(String name){map.remove(name);}/*** 拿Token* @param name* @return*/public Object getToken(String name){Object obj = getStorage(name);AccessTokenStorage storage = (AccessTokenStorage) obj;//拿到数据,判断是否过期if (BeanUtil.isNotEmpty(storage)&& BeanUtil.isNotEmpty(storage.getToken())){//存在if (storage.getTime().isAfter(LocalDateTime.now())){//没有过期return storage.getToken();//没有过期返回}//过期}return null;}/*** 存Token到本地内存中 固定过期时间* @param name* @param token*/public void setToken(String name,String token){LocalDateTime localDateTime = LocalDateTime.now().plusHours(1).plusMinutes(50);AccessTokenStorage storage = new AccessTokenStorage();storage.setToken(token);storage.setTime(localDateTime);//一小时50分,防止过期setStorage(name,storage);autoExpired(name, localDateTime);}/*** 存token到本地内存中* 自定义过期时间* @param name* @param token* @param localDateTime*/public void setToken(String name,Object token,LocalDateTime localDateTime){AccessTokenStorage storage = new AccessTokenStorage();storage.setToken(token);storage.setTime(localDateTime);//过期时间setStorage(name,storage);autoExpired(name,localDateTime);}/*** 存token到redis* @param name* @param token* @param localDateTime* @param redisTemplate*/public static void setToken(String name, Object token, LocalDateTime localDateTime, RedisTemplate redisTemplate){redisTemplate.opsForValue().set(name,token,Duration.between(LocalDateTime.now(),localDateTime).toMillis(),TimeUnit.MILLISECONDS);}/*** 从redis中取值* @param name* @param redisTemplate* @return*/public static Object getToken(String name, RedisTemplate redisTemplate){return redisTemplate.opsForValue().get(name);}/*** 测试工具,配合setTime使用,输出间隔使用时间* @param s*/public static void showTime(String s){MyStorage storage = MyStorage.init();Object storageStorage = storage.getStorage("time");if (storageStorage ==null)return;long time = (long) storageStorage;System.out.println(s+":"+(System.currentTimeMillis()-time));}/*** 记录当前时间戳*/public static void setTime(){MyStorage.init().setStorage("time",System.currentTimeMillis());}/*** 是否过期* @param name 名称* @return true过期*/public static Boolean checkExpired(String name){MyStorage storage = init();LocalDateTime localDateTime = (LocalDateTime) storage.getStorage(name);if (localDateTime==null||localDateTime.isBefore(LocalDateTime.now())){//如果时间已过期,执行更新System.out.println("已过期");storage.removeStorage(name);return true;}System.out.println("未过期");return false;}/*** 插入一个缓存,并保留过期时间* @param name* @param expiredTime*/public static void addExpired(String name,LocalDateTime expiredTime){MyStorage storage = init();storage.setStorage(name,expiredTime);storage.autoExpired(name,expiredTime);}/*** 本地缓存自动过期* @param name* @param expiredTime*/private void autoExpired(String name,LocalDateTime expiredTime) {try{MyStorage storage = init();//过期自动回收缓存ScheduledExecutorService  service = Executors.newScheduledThreadPool(1);Duration duration = Duration.between(LocalDateTime.now(), expiredTime);service.schedule(()->{storage.removeStorage(name);},duration.toMillis(),TimeUnit.MILLISECONDS);service.shutdown();}catch (Exception e){e.printStackTrace();}}
}

提供了4个方法,setStorage、getStorage和setToken、getToken

前两个就跟普通一样,只有存取,后两个存入了自定义结构AccessTokenStorage,多存了一个时间,可以判断是否过期

使用方法如下

    @Resourceprivate RedisTemplate redisTemplate;//存到本地缓存@Testpublic void expired() {System.out.println(1);MyStorage.addExpired("test", LocalDateTime.now().plusSeconds(5));MyStorage storage = MyStorage.init();storage.setToken("token",1111,LocalDateTime.now().plusSeconds(5));System.out.println(2);try {System.out.println(MyStorage.checkExpired("test"));System.out.println(storage.getToken("token"));Thread.sleep(5*1000);System.out.println(MyStorage.checkExpired("test"));System.out.println(storage.getToken("token"));}catch (InterruptedException e) {e.printStackTrace();}}//存到Redis@Testpublic void redisStorage() {String testStorage = "testStorage";MyStorage.setToken(testStorage,"YCS",LocalDateTime.now().plusSeconds(5),redisTemplate);System.out.println(MyStorage.getToken(testStorage, redisTemplate));}

更多推荐

使用Java写一个类似小程序Storage的工具类

本文发布于:2024-03-06 07:31:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1714733.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:类似   工具   程序   Java   Storage

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!