自分の権限管理システムを実現する(十三):redisをキャッシュする


一、カスタムKEY

@Getter
public enum CacheKeyConstants {

    SYSTEM_ACLS,

    USER_ACLS;

}

二、実現


1、まずkeyを生成する
2、接続池を手に入れる
3、redisを呼び出す方法
public class SysCacheService {

    @Resource(name = "redisPool")
    private RedisPool redisPool;
    //CacheKeyConstants    ,    
    public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix) {
        saveCache(toSavedValue, timeoutSeconds, prefix, null);
    }
    //     
    public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix, String... keys) {
        if (toSavedValue == null) {
            return;
        }
        ShardedJedis shardedJedis = null;
        try {
            //    key
            String cacheKey = generateCacheKey(prefix, keys);
            //    
            shardedJedis = redisPool.instance();
            //  redis  
            shardedJedis.setex(cacheKey, timeoutSeconds, toSavedValue);
        } catch (Exception e) {
            log.error("save cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);
        } finally {
            redisPool.safeClose(shardedJedis);
        }
    }

    public String getFromCache(CacheKeyConstants prefix, String... keys) {
        ShardedJedis shardedJedis = null;
        String cacheKey = generateCacheKey(prefix, keys);
        try {
            shardedJedis = redisPool.instance();
            String value = shardedJedis.get(cacheKey);
            return value;
        } catch (Exception e) {
            log.error("get from cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);
            return null;
        } finally {
            redisPool.safeClose(shardedJedis);
        }
    }
    //  CacheKey  
    private String generateCacheKey(CacheKeyConstants prefix, String... keys) {
        String key = prefix.name();
        if (keys != null && keys.length > 0) {
            key += "_" + Joiner.on("_").join(keys);
        }
        return key;
    }
}

三、キャッシュはどこに入れますか。


キャッシュはデータの遅延をもたらします:特定のシーンが必要です(ブロックに追加すると、ブロックは複数回データベースを調べ、更新するとキャッシュは管理者に困惑し、更新したかどうか分かりません)


たとえば、クエリーの現在のユーザーのすべての権限をロードすると、ユーザーのアクセスごとに、この権限があるかどうかを調べることができます.ここに追加して、データベース・クラスの圧力を緩和することができます.
public List getCurrentUserAclListFromCache() {
        int userId = RequestHolder.getCurrentUser().getId();
        String cacheValue = sysCacheService.getFromCache(CacheKeyConstants.USER_ACLS, String.valueOf(userId));
        //     
        if (StringUtils.isBlank(cacheValue)) {
            //    
            List aclList = getCurrentUserAclList();
            if (CollectionUtils.isNotEmpty(aclList)) {
                sysCacheService.saveCache(JsonMapper.obj2String(aclList), 600, CacheKeyConstants.USER_ACLS, String.valueOf(userId));
            }
            return aclList;
        }
        return JsonMapper.string2Obj(cacheValue, new TypeReference>() {
        });
    }