redis 缓存数据
个人商城系统为提升访问速度,可将不经常变更的数据缓存到redis。
如:商品分类数据
redis配置文件
– springboot配置文件 application.yml 中添加redis配置文件
redis:
host: localhost
port: 6379
timeout: 3
poolMaxTotal: 10
poolMaxIdle: 10
poolMaxWait: 3
新建一个redis的文件夹,用来存放redis相关代码
动态读取redis配置
RedisConfig.class
@Component
@ConfigurationProperties(prefix = "redis") //读取配置文件中redis相关参数
@Data
public class RedisConfig {
private String host;
private int port;
private int timeout;
private int poolMaxTotal;
private int poolMaxIdle;
private int poolMaxWait;
}
redis连接池
RedisPoolFactory.class
@Service
public class RedisPoolFactory {
@Autowired
RedisConfig redisConfig;
@Bean
public JedisPool jedisPoolFactory(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(redisConfig.getPoolMaxIdle());
config.setMaxTotal(redisConfig.getPoolMaxTotal());
config.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);
JedisPool jp = new JedisPool(config,redisConfig.getHost(),redisConfig.getPort(),
redisConfig.getTimeout()*1000,null,0);
return jp;
}
}
redis服务
```RedisService.class```
```java
@Service
public class RedisService {
@Autowired
JedisPool jedisPool;
/**
* 从redis连接池获取redis实例
* @param prefix
* @param key
* @param clazz
* @param <T>
* @return
*/
public <T> T get(KeyPrefix prefix,String key, Class<T> clazz){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
//对key增加前缀,可用于分类,避免key重复
String realKey=prefix.getPrefix() + key;
String str = jedis.get(realKey);
T t = stringToBean(str,clazz);
return t;
}finally {
returnToPool(jedis);
}
}
/**
* 存储对象
* @param prefix
* @param key
* @param value
* @param <T>
* @return
*/
public <T> Boolean set(KeyPrefix prefix,String key,T value){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String str = beanToString(value);
if (str == null || str.length() <=0){
return false;
}
String realKey = prefix.getPrefix() + key;
int seconds = prefix.expireSeconds(); //获取过期时间
if (seconds <= 0 ){
jedis.set(realKey,str);
}else {
jedis.setex(realKey,seconds,str);
}
return true;
}finally {
returnToPool(jedis);
}
}
/**
* 删除
* @param prefix
* @param key
* @return
*/
public boolean delete(KeyPrefix prefix,String key){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix() + key;
long ret = jedis.del(realKey);
return ret>0;
}finally {
returnToPool(jedis);
}
}
/**
* 判断key是否存在
* @param prefix
* @param key
* @param <T>
* @return
*/
public <T> boolean exists(KeyPrefix prefix,String key){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix() + key;
return jedis.exists(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* 判断key对应的value是否存在
* @param prefix
* @param key
* @param field
* @return
*/
public boolean existsValue(KeyPrefix prefix,String key,String field){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realkey = prefix.getPrefix() + key;
Boolean result = jedis.hexists(realkey,field);
return result;
}finally {
returnToPool(jedis);
}
}
/**
* 增加值
* @param prefix
* @param key
* @param <T>
* @return
*/
public <T> Long incr(KeyPrefix prefix,String key){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix()+key;
return jedis.incr(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* 减少值
* @param prefix
* @param key
* @param <T>
* @return
*/
public <T> Long decr(KeyPrefix prefix,String key){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix()+key;
return jedis.decr(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* 返回指定字段的值
* @param prefix
* @param key
* @param filed
* @param <T>
* @return
*/
public <T> String hget(KeyPrefix prefix,String key,String filed){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix()+key;
return jedis.hget(realKey,filed);
}finally {
returnToPool(jedis);
}
}
/**
*
* @param prefix
* @param key
* @param field
* @param value
* @param <T>
* @return
*/
public<T> Long hset(KeyPrefix prefix,String key,String field,String value){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix()+key;
return jedis.hset(realKey,field,value);
}finally {
returnToPool(jedis);
}
}
/**
* 获取列表数值
* @param prefix
* @param key
* @return
*/
public List<String> hvals(KeyPrefix prefix,String key){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix()+key;
return jedis.hvals(realKey);
}finally {
returnToPool(jedis);
}
}
/**
* 删除值
* @param prefix
* @param key
* @param field
* @return
*/
public Long hdel(KeyPrefix prefix,String key,String field){
Jedis jedis = new Jedis();
try {
jedis = jedisPool.getResource();
String realKey = prefix.getPrefix()+key;
return jedis.hdel(realKey,field);
}finally {
returnToPool(jedis);
}
}
public static <T> String beanToString(T value){
if (value ==null){
return null;
}
Class<?> clazz = value.getClass();
if (clazz ==int.class || clazz ==Integer.class){
return String.valueOf(value);
}else if(clazz ==long.class || clazz == Long.class){
return String.valueOf(value);
}else if (clazz ==String.class){
return (String) value;
}else{
return JSON.toJSONString(value);
}
}
// 将string类型转换为实体类
public static <T> T stringToBean(String str,Class<T> clazz){
if (str == null || str.length() <=0 || clazz==null){
return null;
}
if (clazz ==int.class || clazz == Integer.class){
return (T) Integer.valueOf(str);
}else if(clazz == long.class || clazz ==Long.class){
return (T) Long.valueOf(str);
}else if (clazz == String.class){
return (T) str;
}else {
return JSON.toJavaObject(JSON.parseObject(str),clazz);
}
}
private void returnToPool(Jedis jedis){
if(jedis != null){
jedis.close();
}
}
}
定义redis中数据的别名和过期时间
KeyPrefix.class
public interface KeyPrefix {
/**
* 有效期
* @return
*/
public int expireSeconds();
/**
* key前缀,防止其他的人使用redis时覆盖
* @return
*/
public String getPrefix();
}
BasePrefix.class
public abstract class BasePrefix implements KeyPrefix {
private int expireSeconds;
private String prefix;
// 0表示不过期
public BasePrefix(String prefix){
this(0,prefix);
}
public BasePrefix(int expireSeconds,String prefix){
this.expireSeconds = expireSeconds;
this.prefix = prefix;
}
@Override
public int expireSeconds(){
return expireSeconds;
}
@Override
public String getPrefix(){
String className = getClass().getSimpleName();//拿到参数类类名
return className+":"+prefix;
}
}
设置商品分类的别名
GoodsKey.class
public class GoodsKey extends BasePrefix{
private GoodsKey(int expireSeconds,String prefix){
super(expireSeconds,prefix);
}
public static GoodsKey getGoodsList = new GoodsKey(600,"gl");
}
最后就是实现接口:
@GetMapping("/category/list_all")
public Object categoryAll() {
try {
/**从缓存中读取**/
String cacheProductCategory = redisService.get(GoodsKey.getGoodsList, "", String.class);
if (!StringUtils.isEmpty(cacheProductCategory)) {
//string转jsonObject,jsonObject再转实体类对象
JSONObject cacheProductCategoryObject = JSONObject.parseObject(cacheProductCategory);
ProductCategoryDto cacheProductCategoryDto = JSON.toJavaObject(cacheProductCategoryObject, ProductCategoryDto.class);
//拼接缓存中的数据
Map<String, Object> cacheMap = new HashMap<>();
cacheMap.put("productcategory_list", cacheProductCategoryDto.getProductCategoryList());
return ResultUtil.ok(cacheMap);
}
ProductCategoryDto productCategoryDto = productCategoryServer.getProductCategoryAll();
//存入缓存
try {
redisService.set(GoodsKey.getGoodsList, "", productCategoryDto);
} catch (Exception e) {
log.error("缓存存入失败 error{}", e.getMessage());
}
Map<String, Object> map = new HashMap<>();
map.put("productcategory_list", productCategoryDto.getProductCategoryList());
return ResultUtil.ok(map);
} catch (Exception e) {
log.error("商品分类 error{}", e.getMessage());
return ResultUtil.fail();
}
}
商城项目地址 https://github.com/627886474/sneaker
欢迎start,如有不足,还请指教。
深圳内推群号:854444922