|
@@ -0,0 +1,558 @@
|
|
|
+package com.zcxk.core.utils.util;
|
|
|
+
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.data.redis.connection.RedisServerCommands;
|
|
|
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
|
|
|
+import org.springframework.data.redis.core.HashOperations;
|
|
|
+import org.springframework.data.redis.core.ListOperations;
|
|
|
+import org.springframework.data.redis.core.RedisCallback;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.data.redis.serializer.RedisSerializer;
|
|
|
+import org.springframework.data.redis.support.atomic.RedisAtomicLong;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.nio.charset.Charset;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description Redis工具类
|
|
|
+ */
|
|
|
+@Component
|
|
|
+@Slf4j
|
|
|
+public class RedisUtil {
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认编码
|
|
|
+ */
|
|
|
+ private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Spring Redis Template
|
|
|
+ */
|
|
|
+ private RedisTemplate<String, String> redisTemplate;
|
|
|
+
|
|
|
+ private JedisConnectionFactory jedisConnectionFactory;
|
|
|
+
|
|
|
+ public RedisUtil(RedisTemplate<String, String> redisTemplate) {
|
|
|
+ this.redisTemplate = redisTemplate;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加到带有 过期时间的 缓存
|
|
|
+ *
|
|
|
+ * @param key redis主键
|
|
|
+ * @param value 值
|
|
|
+ * @param time 过期时间
|
|
|
+ */
|
|
|
+ public void setExpire(final byte[] key, final byte[] value, final long time) {
|
|
|
+ redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ connection.set(key, value);
|
|
|
+ connection.expire(key, time);
|
|
|
+ log.info("[redisTemplate redis]放入 缓存 url:{} ========缓存时间为{}秒", key, time);
|
|
|
+ return 1L;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ public void setExpire(final byte[] key, final byte[] value) {
|
|
|
+ redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ connection.set(key, value);
|
|
|
+ log.info("[redisTemplate redis]放入 缓存 url:{} ========", key);
|
|
|
+ return 1L;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setExpire(String key,final long time) {
|
|
|
+ redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ RedisSerializer<String> serializer = getRedisSerializer();
|
|
|
+ connection.expire(serializer.serialize(key), time);
|
|
|
+ log.info("[redisTemplate redis]放入 缓存 url:{} ========缓存时间为{}秒", key, time);
|
|
|
+ return 1L;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 添加到带有 过期时间的 缓存
|
|
|
+ *
|
|
|
+ * @param key redis主键
|
|
|
+ * @param value 值
|
|
|
+ * @param time 过期时间
|
|
|
+ */
|
|
|
+ public void setExpire(final String key, final String value, final long time) {
|
|
|
+ redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ RedisSerializer<String> serializer = getRedisSerializer();
|
|
|
+ byte[] keys = serializer.serialize(key);
|
|
|
+ byte[] values = serializer.serialize(value);
|
|
|
+ connection.set(keys, values);
|
|
|
+ connection.expire(keys, time);
|
|
|
+ log.info("[redisTemplate redis]放入 缓存 url:{} ========缓存时间为{}秒", key, time);
|
|
|
+ return 1L;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 一次性添加数组到 过期时间的 缓存,不用多次连接,节省开销
|
|
|
+ *
|
|
|
+ * @param keys redis主键数组
|
|
|
+ * @param values 值数组
|
|
|
+ * @param time 过期时间
|
|
|
+ */
|
|
|
+ public void setExpire(final String[] keys, final String[] values, final long time) {
|
|
|
+ redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ RedisSerializer<String> serializer = getRedisSerializer();
|
|
|
+ for (int i = 0; i < keys.length; i++) {
|
|
|
+ byte[] bKeys = serializer.serialize(keys[i]);
|
|
|
+ byte[] bValues = serializer.serialize(values[i]);
|
|
|
+ connection.set(bKeys, bValues);
|
|
|
+ connection.expire(bKeys, time);
|
|
|
+ log.info("[redisTemplate redis]放入 缓存 url:{} ========缓存时间为:{}秒", keys[i], time);
|
|
|
+ }
|
|
|
+ return 1L;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 一次性添加数组到 过期时间的 缓存,不用多次连接,节省开销
|
|
|
+ *
|
|
|
+ * @param keys the keys
|
|
|
+ * @param values the values
|
|
|
+ */
|
|
|
+ public void set(final String[] keys, final String[] values) {
|
|
|
+ redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ RedisSerializer<String> serializer = getRedisSerializer();
|
|
|
+ for (int i = 0; i < keys.length; i++) {
|
|
|
+ byte[] bKeys = serializer.serialize(keys[i]);
|
|
|
+ byte[] bValues = serializer.serialize(values[i]);
|
|
|
+ connection.set(bKeys, bValues);
|
|
|
+ log.info("[redisTemplate redis]放入 缓存 url:{}", keys[i]);
|
|
|
+ }
|
|
|
+ return 1L;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加到缓存
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param value the value
|
|
|
+ */
|
|
|
+ public void set(final String key, final String value) {
|
|
|
+ redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ RedisSerializer<String> serializer = getRedisSerializer();
|
|
|
+ byte[] keys = serializer.serialize(key);
|
|
|
+ byte[] values = serializer.serialize(value);
|
|
|
+ connection.set(keys, values);
|
|
|
+ log.info("[redisTemplate redis]放入 缓存 url:{}", key);
|
|
|
+ return 1L;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询在这个时间段内即将过期的key
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param time the time
|
|
|
+ * @return the list
|
|
|
+ */
|
|
|
+ public List<String> willExpire(final String key, final long time) {
|
|
|
+ final List<String> keysList = new ArrayList<>();
|
|
|
+ redisTemplate.execute((RedisCallback<List<String>>) connection -> {
|
|
|
+ Set<String> keys = redisTemplate.keys(key + "*");
|
|
|
+ for (String key1 : keys) {
|
|
|
+ Long ttl = connection.ttl(key1.getBytes(DEFAULT_CHARSET));
|
|
|
+ if (0 <= ttl && ttl <= 2 * time) {
|
|
|
+ keysList.add(key1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return keysList;
|
|
|
+ });
|
|
|
+ return keysList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询在以keyPatten的所有 key
|
|
|
+ *
|
|
|
+ * @param keyPatten the key patten
|
|
|
+ * @return the set
|
|
|
+ */
|
|
|
+ public Set<String> keys(final String keyPatten) {
|
|
|
+ return redisTemplate.execute((RedisCallback<Set<String>>) connection -> redisTemplate.keys(keyPatten + "*"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据key获取对象
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the byte [ ]
|
|
|
+ */
|
|
|
+ public byte[] get(final byte[] key) {
|
|
|
+ byte[] result = redisTemplate.execute((RedisCallback<byte[]>) connection -> connection.get(key));
|
|
|
+ //log.info("[redisTemplate redis]取出 缓存 url:{} ", key);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据key获取对象
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the string
|
|
|
+ */
|
|
|
+ public String get(final String key) {
|
|
|
+ String resultStr = redisTemplate.execute((RedisCallback<String>) connection -> {
|
|
|
+ RedisSerializer<String> serializer = getRedisSerializer();
|
|
|
+ byte[] keys = serializer.serialize(key);
|
|
|
+ byte[] values = connection.get(keys);
|
|
|
+ return serializer.deserialize(values);
|
|
|
+ });
|
|
|
+ //log.info("[redisTemplate redis]取出 缓存 url:{} ", key);
|
|
|
+ return resultStr;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据key获取对象
|
|
|
+ *
|
|
|
+ * @param keyPatten the key patten
|
|
|
+ * @return the keys values
|
|
|
+ */
|
|
|
+ public Map<String, String> getKeysValues(final String keyPatten) {
|
|
|
+ log.info("[redisTemplate redis] getValues() patten={} ", keyPatten);
|
|
|
+ return redisTemplate.execute((RedisCallback<Map<String, String>>) connection -> {
|
|
|
+ RedisSerializer<String> serializer = getRedisSerializer();
|
|
|
+ Map<String, String> maps = new HashMap<>();
|
|
|
+ Set<String> keys = redisTemplate.keys(keyPatten + "*");
|
|
|
+ for (String key : keys) {
|
|
|
+ byte[] bKeys = serializer.serialize(key);
|
|
|
+ byte[] bValues = connection.get(bKeys);
|
|
|
+ String value = serializer.deserialize(bValues);
|
|
|
+ maps.put(key, value);
|
|
|
+ }
|
|
|
+ return maps;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Ops for hash hash operations.
|
|
|
+ *
|
|
|
+ * @return the hash operations
|
|
|
+ */
|
|
|
+ public HashOperations<String, String, String> opsForHash() {
|
|
|
+ return redisTemplate.opsForHash();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对HashMap操作
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param hashKey the hash key
|
|
|
+ * @param hashValue the hash value
|
|
|
+ */
|
|
|
+ public void putHashValue(String key, String hashKey, String hashValue) {
|
|
|
+ log.info("[redisTemplate redis] putHashValue() key={},hashKey={},hashValue={} ", key, hashKey, hashValue);
|
|
|
+ opsForHash().put(key, hashKey, hashValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取单个field对应的值
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param hashKey the hash key
|
|
|
+ * @return the hash values
|
|
|
+ */
|
|
|
+ public Object getHashValues(String key, String hashKey) {
|
|
|
+ log.info("[redisTemplate redis] getHashValues() key={},hashKey={}", key, hashKey);
|
|
|
+ return opsForHash().get(key, hashKey);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据key值删除
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param hashKeys the hash keys
|
|
|
+ */
|
|
|
+ public void delHashValues(String key, Object... hashKeys) {
|
|
|
+ log.info("[redisTemplate redis] delHashValues() key={}", key);
|
|
|
+ opsForHash().delete(key, hashKeys);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * key只匹配map
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the hash value
|
|
|
+ */
|
|
|
+ public Map<String, String> getHashValue(String key) {
|
|
|
+ log.info("[redisTemplate redis] getHashValue() key={}", key);
|
|
|
+ return opsForHash().entries(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量添加
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param map the map
|
|
|
+ */
|
|
|
+ public void putHashValues(String key, Map<String, String> map) {
|
|
|
+ opsForHash().putAll(key, map);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 集合数量
|
|
|
+ *
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public long dbSize() {
|
|
|
+ return redisTemplate.execute(RedisServerCommands::dbSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清空redis存储的数据
|
|
|
+ *
|
|
|
+ * @return the string
|
|
|
+ */
|
|
|
+ public String flushDB() {
|
|
|
+ return redisTemplate.execute((RedisCallback<String>) connection -> {
|
|
|
+ connection.flushDb();
|
|
|
+ return "ok";
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断某个主键是否存在
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the boolean
|
|
|
+ */
|
|
|
+ public boolean exists(final String key) {
|
|
|
+ return redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.exists(key.getBytes(DEFAULT_CHARSET)));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除key
|
|
|
+ *
|
|
|
+ * @param keys the keys
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public long del(final String... keys) {
|
|
|
+ return redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ long result = 0;
|
|
|
+ for (String key : keys) {
|
|
|
+ result = connection.del(key.getBytes(DEFAULT_CHARSET));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除key
|
|
|
+ *
|
|
|
+ * @param keys the keys
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public long del(final byte[]... keys) {
|
|
|
+ return redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ long result = 0;
|
|
|
+ for (byte[] key : keys) {
|
|
|
+ result = connection.del(key);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取 RedisSerializer
|
|
|
+ *
|
|
|
+ * @return the redis serializer
|
|
|
+ */
|
|
|
+ protected RedisSerializer<String> getRedisSerializer() {
|
|
|
+ return redisTemplate.getStringSerializer();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对某个主键对应的值加一,value值必须是全数字的字符串
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public long incr(final String key) {
|
|
|
+ return redisTemplate.execute((RedisCallback<Long>) connection -> {
|
|
|
+ RedisSerializer<String> redisSerializer = getRedisSerializer();
|
|
|
+ return connection.incr(redisSerializer.serialize(key));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List 引擎
|
|
|
+ *
|
|
|
+ * @return the list operations
|
|
|
+ */
|
|
|
+ public ListOperations<String, String> opsForList() {
|
|
|
+ return redisTemplate.opsForList();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 将一个或多个值 value 插入到列表 key 的表头
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param value the value
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public Long leftPush(String key, String value) {
|
|
|
+ return opsForList().leftPush(key, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 移除并返回列表 key 的头元素
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the string
|
|
|
+ */
|
|
|
+ public String leftPop(String key) {
|
|
|
+ return opsForList().leftPop(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 :将一个或多个值 value 插入到列表 key 的表尾(最右边)。
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param value the value
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public Long in(String key, String value) {
|
|
|
+ return opsForList().rightPush(key, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 移除并返回列表 key 的末尾元素
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the string
|
|
|
+ */
|
|
|
+ public String rightPop(String key) {
|
|
|
+ return opsForList().rightPop(key);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 返回列表 key 的长度 ; 如果 key 不存在,则 key 被解释为一个空列表,返回 0 ; 如果 key 不是列表类型,返回一个错误。
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public Long length(String key) {
|
|
|
+ return opsForList().size(key);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 根据参数 i 的值,移除列表中与参数 value 相等的元素
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param i the
|
|
|
+ * @param value the value
|
|
|
+ */
|
|
|
+ public void remove(String key, long i, String value) {
|
|
|
+ opsForList().remove(key, i, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 将列表 key 下标为 index 的元素的值设置为 value
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param index the index
|
|
|
+ * @param value the value
|
|
|
+ */
|
|
|
+ public void set(String key, long index, String value) {
|
|
|
+ opsForList().set(key, index, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 end 指定。
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param start the start
|
|
|
+ * @param end the end
|
|
|
+ * @return the list
|
|
|
+ */
|
|
|
+ public List<String> getList(String key, int start, int end) {
|
|
|
+ return opsForList().range(key, start, end);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 批量存储
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param list the list
|
|
|
+ * @return the long
|
|
|
+ */
|
|
|
+ public Long leftPushAll(String key, List<String> list) {
|
|
|
+ return opsForList().leftPushAll(key, list);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * redis List数据结构 : 将值 value 插入到列表 key 当中,位于值 index 之前或之后,默认之后。
|
|
|
+ *
|
|
|
+ * @param key the key
|
|
|
+ * @param index the index
|
|
|
+ * @param value the value
|
|
|
+ */
|
|
|
+ public void insert(String key, long index, String value) {
|
|
|
+ opsForList().set(key, index, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 利用redis的单线程原子自增性保证数据自增的唯一性
|
|
|
+ *
|
|
|
+ * @param key
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public RedisAtomicLong getRedisAtomicLong(String key) {
|
|
|
+ return new RedisAtomicLong(key, jedisConnectionFactory);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ZINCRBY key increment member
|
|
|
+ *
|
|
|
+ * @param key
|
|
|
+ * @param increment
|
|
|
+ * @param member
|
|
|
+ */
|
|
|
+ public void doZincrby(String key, Integer increment, String member) {
|
|
|
+ redisTemplate.execute((RedisCallback<Double>) connection -> {
|
|
|
+ RedisSerializer<String> redisSerializer = getRedisSerializer();
|
|
|
+ return connection.zIncrBy(redisSerializer.serialize(key), increment, redisSerializer.serialize(member));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ZREVRANGE key start stop [WITHSCORES]
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<String> doZrevrange(String key, Integer start, Integer end) {
|
|
|
+ List<String> stringList = new ArrayList<>();
|
|
|
+ RedisSerializer<String> redisSerializer = getRedisSerializer();
|
|
|
+ Set<byte[]> strBytes = redisTemplate.execute((RedisCallback<Set<byte[]>>) connection -> connection.zRevRange(redisSerializer.serialize(key), start, end));
|
|
|
+ Iterator byteIter = strBytes.iterator();
|
|
|
+ while (byteIter.hasNext()) {
|
|
|
+ stringList.add(redisSerializer.deserialize((byte[]) byteIter.next()));
|
|
|
+ }
|
|
|
+ return stringList;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setAdd(final String key, final String value) {
|
|
|
+ redisTemplate.opsForSet().add(key, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setRemove(final String key, final String value) {
|
|
|
+ redisTemplate.opsForSet().remove(key, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Set<String> members(final String key) {
|
|
|
+ return redisTemplate.opsForSet().members(key);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|