zoukankan      html  css  js  c++  java
  • SpringBoot Redis工具类封装

    1.接口类

    package com.sze.redis.util;
    
    import java.util.List;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 
     * <br>类 名: RedisCachesManager 
     * <br>描 述: 缓存管理类
     * <br>作 者: shizhenwei 
     * <br>创 建: 2017年5月31日 
     * <br>版 本: v0.0.2 
     * <br>
     * <br>历 史: (版本) 作者 时间 注释
     */
    public interface RedisCachesManager {
    
        public static final String ID = "redisCachesManager";
        
        /**
         * 在默认缓存空间内加入和更新缓存信息
         * @param key
         * @param value
         */
        void put(String key, Object value);
        
        /**
         * 在默认缓存空间内加入和更新缓存信息
         * @param key
         * @param value
         */
        void put(String key, Object value, long timeout, TimeUnit unit);
        
        /**
         * 在指定缓存空间内加入或更新缓存信息
         * @param namespace
         * @param timeout 有效时长
         * @param unit 有效时长单位
         */
        void put(String namespace, String key, Object value);
        
        /**
         * 在指定缓存空间内加入或更新缓存信息
         * @param namespace
         * @param key
         * @param value
         * @param timeout 有效时长
         * @param unit 有效时长单位
         */
        void put(String namespace, String key, Object value, long timeout, TimeUnit unit);
        
        /**
         * 在默认缓存空间内获取缓存信息
         * 如果信息不存在这遍历其他缓存空间
         * @param key
         * @return
         */
        <T> T get(String key);
        
        /**
         * 获取缓存信息
         * @param namespace
         * @param key
         */
        <T> T get(String namespace, String key);
           
        /**
         * 在所有缓存空间删除缓存信息
         * @param key
         */
        void remove(String key);
        
        /**
         * 在指定空间内删除缓存信息
         * @param namespace
         * @param key
         */
        void remove(String namespace, String key);
        
        /**
         * 创建缓存空间
         * @param namespace
         */
        void createNamespace(String namespace);
        
        /**
         * 删除缓存空间
         * @param namespace
         */
        void deleteNamespace(String namespace);
        
        /**
         * 获取全部缓存空间名字
         * @return
         */
        List<String> namespaces();
        
        /**
         * 获取所有keys
         * @param namespace
         * @return
         */
        Set<String> keys();
        
        /**
         * 获取指定空间所有keys
         * @param namespace
         * @return
         */
        Set<String> keys(String namespace);
        
        /**
         * 慎用 正常这个方法不会公开,都是通过xshell操作
         * 清空所有缓存
         */
        void clearAll();
        
        /**
         * 慎用 正常这个方法不会公开,都是通过xshell操作
         * 清空所有书库key
         */
        void clearDb();
    }

    2.实现类

    package com.sze.redis.util;
    
    import java.util.List;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import javax.annotation.PostConstruct;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.ListOperations;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    /**
     * 
     * <br>类 名: RedisCachesManager//避免 RedisCacheManager类冲突
     * <br>描 述: 缓存工具类 
     * <br>作 者: shizhenwei 
     * <br>创 建: 2017年5月31日 
     * <br>版 本: v0.0.2 
     * <br>
     * <br>历 史: (版本) 作者 时间 注释
     */
    @Component(RedisCachesManager.ID)
    public class RedisCachesManagerImpl implements RedisCachesManager {
        
        @Autowired
        private StringRedisTemplate redisTemplate;
        
        private ValueOperations<String, String> stringRedis;
        
        private ListOperations<String, String> listRedis;
        
        /**
         * <br>描 述: 初始化时赋值
         * <br>作 者: shizhenwei 
         * <br>历 史: (版本) 作者 时间 注释
         */
        @PostConstruct
        private void init(){
            stringRedis = redisTemplate.opsForValue();
            listRedis = redisTemplate.opsForList();
        }
    
        @Override
        public void put(String key, Object value) {
            put(CacheContents.DEFAULT_CONTEXT,key, value);
        }
    
        @Override
        public void put(String key, Object value, long timeout, TimeUnit unit) {
            put(CacheContents.DEFAULT_CONTEXT,key, value,timeout,unit);
        }
        
        @Override
        public void put(String namespace, String key, Object value) {
            AssertUtils.assertNotEmpty(namespace, "put缓存namespace");
            AssertUtils.assertNotEmpty(key, "put缓存key");
            AssertUtils.assertNotEmpty(value, "put缓存value");
            createNamespace(namespace);
            
            String className = value.getClass().getName();
            JSONObject json = new JSONObject();
            json.put("class", className);
            json.put("data", JSON.toJSONString(value));
            
            stringRedis.set(fullKey(namespace, key), json.toJSONString());
        }
    
        @Override
        public void put(String namespace, String key, Object value, long timeout, TimeUnit unit) {
            AssertUtils.assertNotEmpty(namespace, "put缓存namespace");
            AssertUtils.assertNotEmpty(key, "put缓存key");
            AssertUtils.assertNotEmpty(value, "put缓存value");
            AssertUtils.assertNotEmpty(unit, "put缓存unit"); 
            
            createNamespace(namespace);
            
            String className = value.getClass().getName();
            JSONObject json = new JSONObject();
            json.put("class", className);
            json.put("data", JSON.toJSONString(value));
            
            stringRedis.set(fullKey(namespace, key), json.toJSONString(),timeout,unit);
        }
    
        @Override
        public <T> T get(String key) {
            return get(CacheContents.DEFAULT_CONTEXT, key);
        }
    
        @Override
        public <T> T get(String namespace, String key) {
            AssertUtils.assertNotEmpty(namespace, "get缓存namespace");
            AssertUtils.assertNotEmpty(key, "get缓存key");
            
            String value = stringRedis.get(fullKey(namespace, key));
            if(!StringUtils.hasText(value)) {
                return null;
            }
            
            JSONObject json = JSON.parseObject(value);
            String className = json.getString("class");
            if(!StringUtils.hasText(className)) {
                return null;
            }
            
            Class<?> clazz;
            try {
                clazz = Class.forName(className);
                T rs = JSON.parseObject(json.getString("data"), clazz);
                return rs;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public void remove(String key) {
            remove(CacheContents.DEFAULT_CONTEXT, key);
        }
    
        @Override
        public void remove(String namespace, String key) {
            AssertUtils.assertNotEmpty(namespace, "remove缓存namespace");
            AssertUtils.assertNotEmpty(key, "remove缓存key");
            redisTemplate.delete(fullKey(namespace, key));
        }
    
        @Override
        public void createNamespace(String namespace) {
            AssertUtils.assertNotEmpty(namespace, "createNamespace缓存namespace");
            if(!namespaces().contains(namespace)){
                listRedis.leftPush(CacheContents.NAMESPACE_LIST, namespace);
            }
        }
        
        @Override
        public void deleteNamespace(String namespace) {
            AssertUtils.assertNotEmpty(namespace, "deleteNamespace缓存namespace");
            int index = namespaces().indexOf(namespace);
            if(-1 != index){
                listRedis.remove(CacheContents.NAMESPACE_LIST, index, namespace);
            }
            redisTemplate.delete(keys(namespace));
            
        }
    
        @Override
        public List<String> namespaces() {
            //无值返回[]非null
            return listRedis.range(CacheContents.NAMESPACE_LIST, 0, -1);
        }
    
        @Override
        public Set<String> keys() {
            //无值返回[]非null
            return redisTemplate.keys("*");
        }
        
        @Override
        public Set<String> keys(String namespace) {
            AssertUtils.assertNotEmpty(namespace, "keys缓存namespace");
            if(null==namespace){
                namespace = CacheContents.DEFAULT_CONTEXT;
            }
            //无值返回[]非null
            return redisTemplate.keys(namespace+":*");
        }
    
        @Override
        public void clearAll() {
            redisTemplate.getConnectionFactory().getConnection().flushAll();
        }
        
        @Override
        public void clearDb() {
            redisTemplate.getConnectionFactory().getConnection().flushDb();
        }
        
        /**
         * <br>描 述: redis里可没什么命名空间
         * <br>作 者: shizhenwei 
         */
        private String fullKey(String namespace,String key){
            return namespace+":"+key;
        }
    }

    3.常量类

    package com.sze.redis.util;
    /**
     * 
     * <br>类 名: CacheContents 
     * <br>描 述: 缓存常量 
     * <br>作 者: shizhenwei 
     * <br>创 建: 2017年5月31日 
     * <br>版 本: v0.0.2 
     * <br>
     * <br>历 史: (版本) 作者 时间 注释
     */
    public interface CacheContents {
        /**
         * 存放所有的命名空间
         */
        String NAMESPACE_LIST = "_namespace_list_";
        
        /**
         * 默认存储空间
         */
        String DEFAULT_CONTEXT = "_defualt_context_";
        
        
        /**
         * Session信息空间
         */
        String SESSION_CONTEXT = "_session_context_";
        
        /**
         * 用户登录信息空间
         */
        String USER_CONTEXT = "_user_context_";
        
    }

    4.断言类

    package com.sze.redis.util;
    
    import java.util.Collection;
    import java.util.Map;
    
    import com.sze.redis.exception.SzwRunTimeException;
    
    /**
     * <br>类 名: AssertUtils 
     * <br>描 述: 断言 校验类
     * <br>作 者: shizhenwei 
     * <br>创 建: 2017年9月12日 
     * <br>版 本: v1.0.0 
     * <br>
     * <br>历 史: (版本) 作者 时间 注释
     */
    public class AssertUtils {
    
        /**
         * 判断是否为NULL
         * @param obj
         * @param label
         */
        public static void assertNotNull(Object obj, String label) {
            if(null == obj){
                throw new SzwRunTimeException(label + "不能为空");
            }
        }
        
        /**
         * 判断是否为空
         * @param obj
         * @param label
         */
        public static void assertNotEmpty(Object obj, String label) {
            if(null != obj){
                if(obj instanceof String){
                    String string = (String) obj;
                    if("".equals(string.trim())){
                        throw new SzwRunTimeException(label + "不能为空");
                    }
                }else if(obj.getClass().isArray()){
                    if(((Object[])obj).length<1){
                        throw new SzwRunTimeException(label + "不能为空");
                    }
                }else if(obj instanceof Collection){
                    if(((Collection<?>)obj).size()<1){
                        throw new SzwRunTimeException(label + "不能为空");
                    }
                }else if(obj instanceof Map){
                    if(((Map<?, ?>)obj).size()<1){
                        throw new SzwRunTimeException(label + "不能为空");
                    }
                }
            }else{
                throw new SzwRunTimeException(label + "不能为NULL");
            }
        }
        
        
        
        /**
         * 判断数组不能为空
         * @param array
         * @param label
         */
        public static <T> void assertArrayNotEmpty(T[] array, String label){
            if(null!=array){
                if(array.length<1){
                    throw new SzwRunTimeException(label + "不能为空");
                }
            }else{
                throw new SzwRunTimeException(label + "不能为NULL");
            }
        }
        
        /**
         * 判断集合不能为空
         * @param array
         * @param label
         */
        public static <T> void assertCollectionNotEmpty(Collection<T> collection, String label){
            if(null!=collection){
                if(collection.size()<1){
                    throw new SzwRunTimeException(label + "不能为空");
                }
            }else{
                throw new SzwRunTimeException(label + "不能为NULL");
            }
        }
        
        /**
         * 判断Map不能为空
         * @param array
         * @param label
         */
        public static <E, T> void assertMapNotEmpty(Map<E, T> map, String label) {
            if(null!=map){
                if(map.size()<1){
                    throw new SzwRunTimeException(label + "不能为空");
                }
            }else{
                throw new SzwRunTimeException(label + "不能为NULL");
            }
        }
    }

    5.自定义异常类

    package com.sze.redis.exception;
    
    public class SzwRunTimeException extends RuntimeException{
    
        /** **/
        private static final long serialVersionUID = 8924997566380919394L;
    
        public SzwRunTimeException() {
            super();
        }
    
        public SzwRunTimeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
        }
    
        public SzwRunTimeException(String message, Throwable cause) {
            super(message, cause);
        }
    
        public SzwRunTimeException(String message) {
            super(message);
        }
    
        public SzwRunTimeException(Throwable cause) {
            super(cause);
        }
    
    }
  • 相关阅读:
    js 脚本学习 索引
    nodejs 学习索引
    oracle 学习 笔记
    githut 的 管理 使用
    sublime text 插件记录
    web 学习 相关索引
    wpf 自定义 无边框 窗体 resize 实现
    vs 效率工具
    ANDROID开发实用小工具
    iOS开发之Core Animation
  • 原文地址:https://www.cnblogs.com/zwcry/p/8482615.html
Copyright © 2011-2022 走看看