业务背景:客户端请求的快慢查询速度排序,本地服务器内存缓存 > redis等缓存 >数据库查询,因此一些业务是可以缓存在本地内存的,而java自带的Map,CurrentHashMap则需要进行各种判断,而Guaua的Cache提供了各种API,方便开发者使用,因此使用Guaua的Cache缓存会更加适用。
@Autowired private RedisTemplate<String, Object> redisTemplate; /** * redis自增数缓存的key */ private static final String DEVICE_INC_COUNT = "device_inc_count"; /** * redis设备编码对应自增数的hash缓存key */ private static final String DEVICE_INC_VALUE = "device_inc_value"; private Cache<String, Object> localCache = CacheBuilder.newBuilder() .concurrencyLevel(16) // 并发级别 .initialCapacity(1000) // 初始容量 .maximumSize(10000) // 缓存最大长度 .expireAfterAccess(30, TimeUnit.MINUTES) // 缓存30分钟没被使用就过期 .build(); public Object getInc(String deviceCode) throws ExecutionException { Object inc = localCache.getIfPresent(deviceCode); if(inc != null) { return inc; } // 2.本地缓存未命中,从redis的hash缓存获取 inc = (Integer)redisTemplate.opsForHash().get(DEVICE_INC_VALUE, deviceCode); // 3. redis的hash缓存中没有,说明是新设备,先为设备生成一个自增号 if(inc == null) { inc = redisTemplate.opsForValue().increment(DEVICE_INC_COUNT); // 添加到redis hash缓存 redisTemplate.opsForHash().put(DEVICE_INC_VALUE, deviceCode, inc); } // 4.添加到本地缓存 localCache.put(deviceCode, inc); return 0; } public Object getObject(String key) throws ExecutionException { Object count = localCache.getIfPresent(key); return count; } public void putObject(String key,Object value){ localCache.put(key,value); }