Guava缓存工具

最近做项目过程中。发现一个问题:

        就是本人在做短信验证码的时候,本来用的session缓存,将手机号作为key,验证码作为value,设置过期时间为30分钟,放进session里面,然后判断在有效期内验证码是否失效。在项目冒烟测试,白盒测试时未发现问题,直到发布到生产测试时发现session获取不到,究其原因,是因为在冒烟测试,白盒测试均用的本地项目,session当然没有问题了,上生产之后,由于涉及到服务器问题,session经过跨域等一系列我不知道的原因之后就找不到了。我们开发老大给我提出两个解决方法:1、是用Redis缓存。2、就是用Guava(我读的是瓜娃)缓存。老大建议我用Guava,可怜我一个菜鸟就用过Redis,Guava是什么都没听过,然后老大细心了给了我一个地址(https://www.yiibai.com/guava/guava_caching_utilities.html),给我参考,然后自行修炼。

       经过我一系列的百度,百度,再百度,自己终于领悟其招式(当然还要感谢另一位技术比较厉害的小伙伴的指导)。

       guava和ehcache一样也是本地缓存,虽然都是本地缓存,但是有着不同的使用场景。guava是谷歌提供的一个Java工具包,而Guava的Cache部分提供了一套分词完善的本地存储缓存机制,在Guave之前ConcurrentMap,因为能友好的支持并发而经常被用作本地缓存,但它毕竟不具备缓存的一些特性,比如缓存过期,缓存数据加载和刷新等。

具体原理什么的我也不怎么清楚,关键的是知道怎么用,在什么情况下用,至于原理什么的,若干年后我会再写一篇博客来补充的,希望到时候我还在做开发。

在这里我引用的jar包为:

compile group: 'com.google.guava', name: 'guava', version: "${guavaVersion}"

guavaVersion = "20.0"

configurations {
    all*.exclude group: 'com.google.guava', module: 'guava:18.0'
}(这句话是为了将老版本的给干掉)

首先定义一个类,即为Guava的实现类,里面提供了3个方法,即put,get,del

package com.qqgyl.tmstrad.carriage.util;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

@Slf4j
public class SMSCacheUtil {
   private static Cache<String, String> loadingCache = CacheBuilder.newBuilder()
            /*设置缓存容器的初始容量大小为10*/
            .initialCapacity(10)
            /*设置缓存容器的最大容量大小为100*/
            .maximumSize(100)
            /*设置记录缓存命中率*/
            .recordStats()
            /*设置并发级别为8,智并发基本值可以同事些缓存的线程数*/
            .concurrencyLevel(8)
            /*设置过期时间为2秒*/
            .expireAfterAccess(100, TimeUnit.SECONDS).build();

            public static void setKeyVal(String key, String value){
                loadingCache.put(key, value);
            }

            public static String getValByKey(String key){
                String value = loadingCache.getIfPresent(key);
                return value;
            }
            public static void delKey(String key){
                loadingCache.invalidate(key);
            }
}
然后在你用到的地方调用:
SMSCacheUtil.setKeyVal(phone,vcode);

然后根据手机号获取验证码

String cachVerificationCode = SMSCacheUtil.getValByKey(phone);

判断是否为空。就OK了

当然最好在你用完的时候del一下

SMSCacheUtil.delKey(phone);

最后就没了。

展开阅读全文

没有更多推荐了,返回首页