springboot项目实战---使用redis进行缓存

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值