| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893 | package com.genersoft.iot.vmp.utils.redis;import com.alibaba.fastjson2.JSONObject;import com.genersoft.iot.vmp.utils.SpringBeanFactory;import org.springframework.data.redis.core.*;import org.springframework.util.CollectionUtils;import java.util.*;import java.util.concurrent.TimeUnit;/**     * Redis工具类 * @author swwheihei * @date 2020年5月6日 下午8:27:29 */@SuppressWarnings(value = {"rawtypes", "unchecked"})public class RedisUtil {    private static RedisTemplate redisTemplate;    static {        redisTemplate = SpringBeanFactory.getBean("redisTemplate");    }	/**     * 指定缓存失效时间     * @param key 键     * @param time 时间(秒)     * @return true / false     */    public static boolean expire(String key, long time) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            if (time > 0) {                redisTemplate.expire(key, time, TimeUnit.SECONDS);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 根据 key 获取过期时间     * @param key 键     */    public static long getExpire(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.getExpire(key, TimeUnit.SECONDS);    }    /**     * 判断 key 是否存在     * @param key 键     * @return true / false     */    public static boolean hasKey(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.hasKey(key);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 删除缓存     * @SuppressWarnings("unchecked") 忽略类型转换警告     * @param key 键(一个或者多个)     */    public static boolean del(String... key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }    	try {    		if (key != null && key.length > 0) {                if (key.length == 1) {                    redisTemplate.delete(key[0]);                } else {//                    传入一个 Collection<String> 集合                    redisTemplate.delete(CollectionUtils.arrayToList(key));                }            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }//    ============================== String ==============================    /**     * 普通缓存获取     * @param key 键     * @return 值     */    public static Object get(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return key == null ? null : redisTemplate.opsForValue().get(key);    }    /**     * 普通缓存放入     * @param key 键     * @param value 值     * @return true / false     */    public static boolean set(String key, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForValue().set(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 普通缓存放入并设置时间     * @param key 键     * @param value 值     * @param time 时间(秒),如果 time < 0 则设置无限时间     * @return true / false     */    public static boolean set(String key, Object value, long time) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            if (time > 0) {                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);            } else {                set(key, value);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 递增     * @param key 键     * @param delta 递增大小     * @return     */    public static long incr(String key, long delta) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        if (delta < 0) {            throw new RuntimeException("递增因子必须大于 0");        }        return redisTemplate.opsForValue().increment(key, delta);    }    /**     * 递减     * @param key 键     * @param delta 递减大小     * @return     */    public static long decr(String key, long delta) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        if (delta < 0) {            throw new RuntimeException("递减因子必须大于 0");        }        return redisTemplate.opsForValue().increment(key, delta);    }//    ============================== Map ==============================    /**     * HashGet     * @param key 键(no null)     * @param item 项(no null)     * @return 值     */    public static Object hget(String key, String item) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForHash().get(key, item);    }    /**     * 获取 key 对应的 map     * @param key 键(no null)     * @return 对应的多个键值     */    public static Map<Object, Object> hmget(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForHash().entries(key);    }    /**     * HashSet     * @param key 键     * @param map 值     * @return true / false     */    public static boolean hmset(String key, Map<Object, Object> map) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForHash().putAll(key, map);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * HashSet 并设置时间     * @param key 键     * @param map 值     * @param time 时间     * @return true / false     */    public static boolean hmset(String key, Map<?, ?> map, long time) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForHash().putAll(key, map);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 向一张 Hash表 中放入数据,如不存在则创建     * @param key 键     * @param item 项     * @param value 值     * @return true / false     */    public static boolean hset(String key, String item, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForHash().put(key, item, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 向一张 Hash表 中放入数据,并设置时间,如不存在则创建     * @param key 键     * @param item 项     * @param value 值     * @param time 时间(如果原来的 Hash表 设置了时间,这里会覆盖)     * @return true / false     */    public static boolean hset(String key, String item, Object value, long time) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForHash().put(key, item, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 删除 Hash表 中的值     * @param key 键     * @param item 项(可以多个,no null)     */    public static void hdel(String key, Object... item) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        redisTemplate.opsForHash().delete(key, item);    }    /**     * 判断 Hash表 中是否有该键的值     * @param key 键(no null)     * @param item 值(no null)     * @return true / false     */    public static boolean hHasKey(String key, String item) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForHash().hasKey(key, item);    }    /**     * Hash递增,如果不存在则创建一个,并把新增的值返回     * @param key 键     * @param item 项     * @param by 递增大小 > 0     * @return     */    public static Double hincr(String key, String item, Double by) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForHash().increment(key, item, by);    }    /**     * Hash递减     * @param key 键     * @param item 项     * @param by 递减大小     * @return     */    public static Double hdecr(String key, String item, Double by) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForHash().increment(key, item, -by);    }//    ============================== Set ==============================    /**     * 根据 key 获取 set 中的所有值     * @param key 键     * @return 值     */    public static Set<Object> sGet(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForSet().members(key);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * 从键为 key 的 set 中,根据 value 查询是否存在     * @param key 键     * @param value 值     * @return true / false     */    public static boolean sHasKey(String key, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForSet().isMember(key, value);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 将数据放入 set缓存     * @param key 键值     * @param values 值(可以多个)     * @return 成功个数     */    public static long sSet(String key, Object... values) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForSet().add(key, values);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    /**     * 将数据放入 set缓存,并设置时间     * @param key 键     * @param time 时间     * @param values 值(可以多个)     * @return 成功放入个数     */    public static long sSet(String key, long time, Object... values) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            long count = redisTemplate.opsForSet().add(key, values);            if (time > 0) {                expire(key, time);            }            return count;        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    /**     * 获取 set缓存的长度     * @param key 键     * @return 长度     */    public static long sGetSetSize(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForSet().size(key);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    /**     * 移除 set缓存中,值为 value 的     * @param key 键     * @param values 值     * @return 成功移除个数     */    public static long setRemove(String key, Object... values) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForSet().remove(key, values);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }//    ============================== ZSet ==============================    /**     * 添加一个元素, zset与set最大的区别就是每个元素都有一个score,因此有个排序的辅助功能;  zadd     *     * @param key     * @param value     * @param score     */    public static void zAdd(Object key, Object value, double score) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        redisTemplate.opsForZSet().add(key, value, score);    }    /**     * 删除元素 zrem     *     * @param key     * @param value     */    public static void zRemove(Object key, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        redisTemplate.opsForZSet().remove(key, value);    }    /**     * score的增加or减少 zincrby     *     * @param key     * @param value     * @param delta -1 表示减 1 表示加1     */    public static Double zIncrScore(Object key, Object value, double delta) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().incrementScore(key, value, delta);    }    /**     * 查询value对应的score   zscore     *     * @param key     * @param value     * @return     */    public static Double zScore(Object key, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().score(key, value);    }    /**     * 判断value在zset中的排名  zrank     *     * @param key     * @param value     * @return     */    public static Long zRank(Object key, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().rank(key, value);    }    /**     * 返回集合的长度     *     * @param key     * @return     */    public static Long zSize(Object key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().zCard(key);    }    /**     * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容  zrange     *     * 返回有序的集合,score小的在前面     *     * @param key     * @param start     * @param end     * @return     */    public static Set<Object> zRange(Object key, int start, int end) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().range(key, start, end);    }    /**     * 查询集合中指定顺序的值和score,0, -1 表示获取全部的集合内容     *     * @param key     * @param start     * @param end     * @return     */    public static Set<ZSetOperations.TypedTuple<String>> zRangeWithScore(Object key, int start, int end) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().rangeWithScores(key, start, end);    }    /**     * 查询集合中指定顺序的值  zrevrange     *     * 返回有序的集合中,score大的在前面     *     * @param key     * @param start     * @param end     * @return     */    public static Set<String> zRevRange(Object key, int start, int end) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().reverseRange(key, start, end);    }    /**     * 根据score的值,来获取满足条件的集合  zrangebyscore     *     * @param key     * @param min     * @param max     * @return     */    public static Set<String> zSortRange(Object key, int min, int max) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForZSet().rangeByScore(key, min, max);    }//    ============================== List ==============================    /**     * 获取 list缓存的内容     * @param key 键     * @param start 开始     * @param end 结束(0 到 -1 代表所有值)     * @return     */    public static List<Object> lGet(String key, long start, long end) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForList().range(key, start, end);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * 获取 list缓存的长度     * @param key 键     * @return 长度     */    public static long lGetListSize(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForList().size(key);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    /**     * 根据索引 index 获取键为 key 的 list 中的元素     * @param key 键     * @param index 索引     *              当 index >= 0 时 {0:表头, 1:第二个元素}     *              当 index < 0 时 {-1:表尾, -2:倒数第二个元素}     * @return 值     */    public static Object lGetIndex(String key, long index) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForList().index(key, index);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * 将值 value 插入键为 key 的 list 中,如果 list 不存在则创建空 list     * @param key 键     * @param value 值     * @return true / false     */    public static boolean lSet(String key, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForList().rightPush(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 将值 value 插入键为 key 的 list 中,并设置时间     * @param key 键     * @param value 值     * @param time 时间     * @return true / false     */    public static boolean lSet(String key, Object value, long time) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForList().rightPush(key, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 将 values 插入键为 key 的 list 中     * @param key 键     * @param values 值     * @return true / false     */    public static boolean lSetList(String key, List<Object> values) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForList().rightPushAll(key, values);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 将 values 插入键为 key 的 list 中,并设置时间     * @param key 键     * @param values 值     * @param time 时间     * @return true / false     */    public static boolean lSetList(String key, List<Object> values, long time) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForList().rightPushAll(key, values);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 根据索引 index 修改键为 key 的值     * @param key 键     * @param index 索引     * @param value 值     * @return true / false     */    public static boolean lUpdateIndex(String key, long index, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            redisTemplate.opsForList().set(key, index, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 在键为 key 的 list 中删除值为 value 的元素     * @param key 键     * @param count 如果 count == 0 则删除 list 中所有值为 value 的元素     *              如果 count > 0 则删除 list 中最左边那个值为 value 的元素     *              如果 count < 0 则删除 list 中最右边那个值为 value 的元素     * @param value     * @return     */    public static long lRemove(String key, long count, Object value) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            return redisTemplate.opsForList().remove(key, count, value);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    /**     * 在键为 key 的 list中移除第一个元素     * @param key 键     * @return     */    public static Object lLeftPop(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForList().leftPop(key);    }    /**     * 在键为 key 的 list中移除、最后一个元素     * @param key 键     * @return     */    public static Object lrightPop(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        return redisTemplate.opsForList().rightPop(key);    }    /**     * 模糊查询     * @param key 键     * @return true / false     */    public static List<Object> keys(String key) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        try {            Set<String> set = redisTemplate.keys(key);            return new ArrayList<>(set);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * 模糊查询     * @param query 查询参数     * @return     *///    public static List<Object> scan(String query) {//        List<Object> result = new ArrayList<>();//        try {//            Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("field",//                    ScanOptions.scanOptions().match(query).count(1000).build());//            while (cursor.hasNext()) {//                Map.Entry<Object,Object> entry = cursor.next();//                result.add(entry.getKey());//                Object key = entry.getKey();//                Object valueSet = entry.getValue();//            }//            //关闭cursor//            cursor.close();//        } catch (Exception e) {//            e.printStackTrace();//        }//        return result;//    }    /**     * 模糊查询     * @param query 查询参数     * @return     */    public static List<Object> scan(String query) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        Set<String> resultKeys = (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> {            ScanOptions scanOptions = ScanOptions.scanOptions().match("*" + query + "*").count(1000).build();            Cursor<byte[]> scan = connection.scan(scanOptions);            Set<String> keys = new HashSet<>();            while (scan.hasNext()) {                byte[] next = scan.next();                keys.add(new String(next));            }            return keys;        });        return new ArrayList<>(resultKeys);    }    //    ============================== 消息发送与订阅 ==============================    public static void convertAndSend(String channel, JSONObject msg) {        if (redisTemplate == null) {            redisTemplate = SpringBeanFactory.getBean("redisTemplate");        }        redisTemplate.convertAndSend(channel, msg);    }}
 |