GitHub轻松阅读微服务实战项目流程详解第三天:公共模块的设计与实现

Posted Roninaxious

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GitHub轻松阅读微服务实战项目流程详解第三天:公共模块的设计与实现相关的知识,希望对你有一定的参考价值。


github地址:https://github.com/Zealon159/light-reading-cloud


该模块存放了一些公共的POJO类、工具类等

1.缓存

(1)账户中心缓存Key

public class RedisAccountKey {

    /** 图书喜欢数缓存(hash) */
    public final static String ACCOUNT_CENTER_BOOK_LIKES_COUNT = "account-center:book-likes-count";

}

(2)图书资源缓存Key

public class RedisBookKey {

    /** 图书信息缓存 */
    public static final String getBookKey(String bookId){
        return String.format("book-center:detail-%s",bookId);
    }

    /** 资源中心图书章节缓存 */
    public static final String getBookChapterKey(String bookId){
        return String.format("book-center:chapter-%s",bookId);
    }

    /** 资源中心图书章节列表缓存 */
    public static final String getBookChapterListKey(String bookId){
        return String.format("book-center:chapter-list-%s",bookId);
    }

    /** 资源中心图书章节节点缓存 */
    public static final String getBookChapterNodeKey(Integer bookId){
        return String.format("book-center:chapter-node-%s",bookId);
    }

    /** 图书资源中心feign-client缓存 */
    public static final class BookCenter {
        /** 资源中心图书缓存 */
        public static final String getFeignClientBookKey(String bookId){
            return String.format("book-center:feign-client-book-%s",bookId);
        }

    }
}

(3)精品页缓存key

public class RedisHomepageKey {

    /**
     * 主页缓存Key
     * @param type 类型1.主页 2.男生 3.女生
     * @return
     */
    public static final String getHomepageKey(Integer type){
        return String.format("home-page:index-%s", type);
    }

    /** 主页Banner缓存Key */
    public static final String getBannerVoKey(Integer bannerId){
        return String.format("home-page:banner-vo-%s", bannerId);
    }

    /** 主页书单DB缓存Key */
    public static final String getBooklistDbKey(Integer booklistId){
        return String.format("home-page:booklist-db-%s", booklistId);
    }

    /** 主页书单缓存Key */
    public static final String getBooklistVoKey(Integer booklistId){
        return String.format("home-page:booklist-vo-%s", booklistId);
    }

    /** 主页书单随机缓存Key */
    public static final String getBooklistRandomVoKey(Integer booklistId){
        return String.format("home-page:booklist-random-vo-%s", booklistId);
    }

    /** 主页书单图书分页更多 */
    public static final String getBooklistItemPagingKey(Integer booklistId){
        return String.format("home-page:booklist-item-paging-%s", booklistId);
    }
}

(4)Redis缓存有效时间工具类

/**
 * Redis 缓存有效时间(单位:秒)
 */
public class RedisExpire {

    // 1分钟
    public static final long MINUTE = 60;
    // 2分钟 60*2
    public static final long MINUTE_TWO = 120;
    // 3分钟 60*3
    public static final long MINUTE_THR = 180;
    // 5分钟 60*5
    public static final long MINUTE_FIV = 300;
    // 10分钟 60*10
    public static final long MINUTE_TEN = 600;
    // 20分钟
    public static final long MINUTE_TWENTY = 1200;
    // 30分钟 60*30
    public static final long MINUTE_THIRTY = 1800;
    // 1小时 60*60*1
    public static final long HOUR = 3600;
    // 2小时  60*60*2
    public static final long HOUR_TWO = 7200;
    // 4小时
    public static final long HOUR_FOUR = 14400;
    // 1天 60*60*24
    public static final long DAY = 86400;
    // 2天 60*60*24*2
    public static final long DAY_TWO = 172800;
    // 1周 60*60*24*7
    public static final long WEEK = 604800;
    // 1月 60*60*24*30
    public static final long MONTH = 2592000;
    // 1年 60*60*24*365
    public static final long YEAR = 31536000;

}

(5)缓存操作类

/**
 * cache 操作类
 * @author zealon
 */
@Component
public class RedisService {

    /** 日志 */
    private static final Logger LOGGER = LoggerFactory.getLogger(RedisService.class);

    /** 默认缓存时间(10分钟) */
    public static final Long DEFAULT_CACHE_TIME = RedisExpire.MINUTE_TEN;

    /** 操作字符串 */
    private ValueOperations<String, String> valueOperations;
    /** 操作hash */
    private HashOperations hashOperations;
    /** 操作list */
    private ListOperations listOperations;
    /** 操作set */
    private SetOperations setOperations;
    /** 操作有序set */
    private ZSetOperations zSetOperations;
    /** Redis模板 */
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 构造方法初始化操作类
     */
    @PostConstruct
    private void inInit() {
        valueOperations = stringRedisTemplate.opsForValue();
        hashOperations = redisTemplate.opsForHash();
        listOperations = stringRedisTemplate.opsForList();
        setOperations = stringRedisTemplate.opsForSet();
        zSetOperations = stringRedisTemplate.opsForZSet();
    }

    /************************************** 公共方法 */
    /**
     * 删除缓存
     * @param key 缓存key
     * @return Boolean 成功失败
     */
    public Boolean removeCache(String key) {
        Long begTime = System.currentTimeMillis();
        Boolean result = this.removeCacheComm(key);
        Long endTime = System.currentTimeMillis();
        LOGGER.info("删除缓存耗时 key={} time={}", key, endTime - begTime);
        return result;
    }

    /**
     * 根据Key删除缓存
     * @param key 缓存key
     * @return Boolean 成功失败
     */
    public Boolean removeCacheComm(String key) {
        Boolean hasExist = hasKey(key);
        if (hasExist) {
            return stringRedisTemplate.delete(key);
        } else {
            return true;
        }
    }

    /**
     * 删除多个key
     *
     * @param keys 缓存key
     * @return Long 删除key的数量
     */
    public Long removeList(Set<String> keys) {
        if (StringUtils.isEmpty(keys)) {
            return null;
        }
        return stringRedisTemplate.delete(keys);
    }

    /**
     * 获取匹配的key
     *
     * @param keyRegular key正则表达式
     * @return Set<String> 匹配的可以列表
     */
    public Set<String> getKeyRegualr(String keyRegular) {
        if (StringUtils.isEmpty(keyRegular)) {
            return null;
        }
        return stringRedisTemplate.keys(keyRegular);
    }

    /**
     * 设置过期时间
     *
     * @param key  缓存key
     * @param time 缓存时间
     */
    public void setExpire(final String key, Long time) {
        stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
    }

    /**
     * 获取缓存时间剩余时间
     *
     * @param key 缓存key
     * @return long 缓存剩余时间
     */
    public Long getExpire(final String key) {
        return stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);
    }

    /**
     * 判断key是否存在
     *
     * @param key 缓存key
     * @return boolean 成功失败
     */
    public Boolean hasKey(String key) {
        return stringRedisTemplate.hasKey(key);
    }
    /************************************** 公共方法 End */

    /************************************** String处理(实体转化为json字符串) */
    /**
     * 从缓存获取值
     *
     * @param key 缓存key
     * @param c   参数类型
     * @param <T> 参数对象
     * @return T 返回对象
     */
    public <T> T getCache(String key, Class<T> c) {
        String cache = getCache(key);
        return JSONObject.parseObject(cache, c);
    }

    public <T> List getCacheForList(String key, Class<T> c) {
        String cache = getCache(key);
        return JSONObject.parseArray(cache, c);
    }

    /**
     * 从缓存中获取
     *
     * @param key     缓存key
     * @param typeOff 对象类型
     * @return Object 返回实体
     */
    public Object getCache(String key, Type typeOff) {
        return JSONObject.parseObject(getCache(key), typeOff);
    }

    /**
     * 获取缓存信息
     *
     * @param key 缓存key
     * @return String
     */
    public String getCache(String key) {
        return valueOperations.get(key);
    }

    /**
     * 设置缓存值没有设置过期时间
     *
     * @param key   缓存key
     * @param value 缓存值
     */
    public void setCache(String key, String value) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
            return;
        }
        valueOperations.set(key, value);
    }

    /**
     * 设置缓存过期时间
     *
     * @param key   缓存KEY
     * @param value 缓存值
     */
    public void setExpireCacheDefault(final String key, final String value) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
            return;
        }
        valueOperations.set(key, value, DEFAULT_CACHE_TIME, TimeUnit.SECONDS);
    }

    /**
     * 设置缓存过期时间
     *
     * @param key   缓存KEY
     * @param value 缓存值
     * @param time  缓存时间
     */
    public void setExpireCache(final String key, final String value, Long time) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value) || StringUtils.isEmpty(time) || time <= 0) {
            return;
        }
        valueOperations.set(key, value, time, TimeUnit.SECONDS);
    }
    /************************************** String处理(实体转化为json字符串) End */

    /************************************** Object处理 */
    /**
     * 添加缓存
     *
     * @param key 缓存KEY
     * @param obj 缓存对象
     */
    public void setCache(String key, Object obj) {
        setCache(key, JSONObject.toJSONString(obj));
    }

    /**
     * 设置缓存并添加默认过期时间
     *
     * @param key 缓存KEY
     * @param obj 添加的缓存对象
     */
    public void setExpireCacheDefault(final String key, final Object obj) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(obj)) {
            return;
        }
        setExpireCache(key, obj, DEFAULT_CACHE_TIME);
    }

    /**
     * 设置缓存并添加缓存过期时间
     *
     * @param key  缓存KEY
     * @param obj  缓存对象
     * @param time 缓存时间
     */
    public void setExpireCache(final String key, final Object obj, Long time) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(obj) || StringUtils.isEmpty(time)) {
            return;
        }
        this.setExpireCache(key, JSONObject.toJSONString(obj), time);
    }
    /************************************** Object处理 End */

    /************************************** List处理  */
    /**
     * 添加缓存
     *
     * @param key  缓存KEY
     * @param list 缓存列表值
     */
    public void rightPushAll(String key, List list) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(list)) {
            return;
        }
        List<String> redisList = new ArrayList<>();
        if (list != null && !list.isEmpty() && list.size() > 0) {
            for (Object obj : list) {
                if (obj != null) {
                    redisList.add(JSONObject.toJSONString(obj));
                }
            }
        }
        listOperations.rightPushAll(key, redisList);
    }

    /**
     * 添加缓存并设置过期时间 有默认值
     *
     * @param key  缓存KEY
     * @param list 缓存列表值
     */
    public void rightPushAllExpireDefault(String key, List list) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(list)) {
            return;
        }
        this.rightPushAll(key, list);
        setExpire(key, DEFAULT_CACHE_TIME);
    }


    /**
     * 添加缓存并设置过期时间
     *
     * @param key  缓存KEY
     * @param list 缓存列表
     * @param time 缓存时间
     */
    public void rightPushAllExpire(String key, List list, Long time) {
        this.rightPushAll(key, list);
        setExpire(key, time);
    }

    /**
     * 添加缓存
     *
     * @param key  缓存KEY
     * @param list 缓存列表
     */
    public void leftPushAll(String key, List list) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(list)) {
            return;
        }
        List<String> redisList = new ArrayList<>();
        if (list != null && !list.isEmpty() && list.size() > 0) {
            for (Object obj : list) {
                if (obj != null) {
                    redisList.add(JSONObject.toJSONString(obj));
                }
            }
        }
        listOperations.leftPushAll(key, redisList);
    }

    /**
     * 添加缓存并设置过期时间 有默认值
     *
     * @param key  缓存KEY
     * @param list 缓存列表
     */
    public void leftPushAllExpireDefault(String key, List list) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(list)) {
            return;
        }
        this.leftPushAll(key, list);
        setExpire(key, DEFAULT_CACHE_TI

以上是关于GitHub轻松阅读微服务实战项目流程详解第三天:公共模块的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章

GitHub轻松阅读微服务实战项目流程详解第四天:账户服务的设计与实现

GitHub轻松阅读微服务实战项目流程详解第二天:API网关的设计与实现

Spring Cloud 微服务实战

SpringCloud微服务实战学习系列配置详解

Docker详解与部署微服务实战

精通系列)创建 Springboot 项目+基于 ssm 多模块项目案例+微服务实战