自分の権限管理システムを実現する(十三):redisをキャッシュする
3160 ワード
一、カスタム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>() {
});
}