最近做项目过程中。发现一个问题:
就是本人在做短信验证码的时候,本来用的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);
最后就没了。