perf: 优化缓存模块

提升可读性 & 减小内存占用
This commit is contained in:
xiongxiaoyang
2025-07-25 17:03:46 +08:00
parent 7e27456a65
commit c24c68ecaf
14 changed files with 173 additions and 130 deletions

View File

@@ -8,7 +8,7 @@ public interface CacheKey {
/**
* 首页小说设置
* */
String INDEX_BOOK_SETTINGS_KEY = "indexBookSettingsKey";
String INDEX_BOOK_SETTINGS_KEY = "indexBookSettingsKey:v2";
/**
* 首页新闻

View File

@@ -1,55 +1,61 @@
package com.java2nb.novel.core.cache;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.util.List;
/**
* @author 11797
*/
public interface CacheService {
/**
* 根据key获取缓存的String类型数据
*/
String get(String key);
/**
* 根据key获取缓存的String类型数据
*/
String get(String key);
/**
* 设置String类型的缓存
*/
void set(String key, String value);
/**
* 设置String类型的缓存
*/
void set(String key, String value);
/**
* 设置一个有过期时间的String类型的缓存,单位秒
*/
void set(String key, String value, long timeout);
/**
* 根据key获取缓存的Object类型数据
*/
Object getObject(String key);
/**
* 设置Object类型的缓存
*/
void setObject(String key, Object value);
/**
* 设置一个有过期时间的Object类型的缓存,单位秒
*/
/**
* 设置一个有过期时间的String类型的缓存,单位秒
*/
void set(String key, String value, long timeout);
/**
* 根据key获取缓存的Object类型数据
*/
<T> T getObject(String key, Class<T> clazz);
<T> List<T> getList(String key, Class<T> clazz);
/**
* 设置Object类型的缓存
*/
void setObject(String key, Object value);
/**
* 设置一个有过期时间的Object类型的缓存,单位秒
*/
void setObject(String key, Object value, long timeout);
/**
* 根据key删除缓存的数据
*/
void del(String key);
/**
* 根据key删除缓存的数据
*/
void del(String key);
/**
* 判断是否存在一个key
* */
boolean contains(String key);
/**
* 设置key过期时间
* */
void expire(String key, long timeout);
/**
* 判断是否存在一个key
*/
boolean contains(String key);
/**
* 设置key过期时间
*/
void expire(String key, long timeout);
}

View File

@@ -1,23 +1,35 @@
package com.java2nb.novel.core.cache.impl;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.java2nb.novel.core.cache.CacheService;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @author xxy
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class RedisServiceImpl implements CacheService {
private final StringRedisTemplate stringRedisTemplate;
private final RedisTemplate<Object, Object> redisTemplate;
private ObjectMapper objectMapper;
@PostConstruct
public void init() {
objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
@Override
@@ -37,34 +49,66 @@ public class RedisServiceImpl implements CacheService {
}
@Override
public Object getObject(String key) {
return redisTemplate.opsForValue().get(key);
public <T> T getObject(String key, Class<T> clazz) {
String result = get(key);
if (result != null) {
try {
return objectMapper.readValue(result, clazz);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
return null;
}
@Override
public <T> List<T> getList(String key, Class<T> clazz) {
String result = get(key);
if (result != null) {
try {
return objectMapper.readValue(result,
objectMapper.getTypeFactory().constructCollectionType(List.class, clazz));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
return null;
}
@Override
public void setObject(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
if (value != null) {
try {
set(key, objectMapper.writeValueAsString(value));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void setObject(String key, Object value, long timeout) {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
if (value != null) {
try {
set(key, objectMapper.writeValueAsString(value), timeout);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void del(String key) {
redisTemplate.delete(key);
stringRedisTemplate.delete(key);
}
@Override
public boolean contains(String key) {
return redisTemplate.hasKey(key) || stringRedisTemplate.hasKey(key);
return stringRedisTemplate.hasKey(key);
}
@Override
public void expire(String key, long timeout) {
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}