Loading

一、Redis的Java客户端

模糊的目标,要不断去解释它们,把他们转化成一个更具体的内容,这样才能够找到途径。

常用客户端介绍

Jedis客户端

基本使用(直连)
  1. 引入对应依赖

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version></version>
</dependency>
  1. 建立与Redis服务器的连接

private Jedis jedis;
// 建立连接
jedis =  new Jedis("ip", port);
// 设置密码
jedis.auth("");
// 选择库
jedis.select(0);
  1. 业务操作

jedis.set("name", "张三");
String name = jedis.get("name");
  1. 关闭连接

if (jedis != null) {
jedis.close();
}
Jedis连接池

Jedis本身是不安全的,并且频繁的创建和销毁连接会有性能损耗。因此,使用Jedis连接池代替Jedis直连。

public class JedisConnectionFactory {
private static final JedisPool jedisPool;

static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接数
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接
jedisPoolConfig.setMinIdle(0);
// 最长等待时间,ms
jedisPoolConfig.setMaxWaitMillis(1000);
jedisPool = new JedisPool(jedisPoolConfig, "ip", port, 1000, "password");
}

// 获取jedis对象
public static Jedis getJedis() {
return jedisPool.getResource();
}
}

SpringDataRedis

springData是Spring中数据操作的模块,包含对各种数据库的集成,其中Redis的集成模块就叫做SpringDataRedis。

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)

  • 提供了RedisTemplate统一API来操作Redis

  • 支持Redis的发布订阅模型

  • 支持Redis哨兵和Redis集群

  • 支持基于Lettuce的响应式编程

  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化

  • 支持基于Redis的JDKCollection实现

RedisTemplate工具类

SpringBoot整合Redis

  1. 引入对应依赖

<!-- json解析库fastjson,用于序列化 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>

<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- <exclusions>-->
<!-- &lt;!&ndash; 高并发下OOM异常,断连 &ndash;&gt;-->
<!-- <exclusion>-->
<!-- <groupId>io.lettuce</groupId>-->
<!-- <artifactId>lettuce-core</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
</dependency>
<!-- 排除默认使用的lettuce,使用jedis代替 -->
<!-- <dependency>-->
<!-- <groupId>redis.clients</groupId>-->
<!-- <artifactId>jedis</artifactId>-->
<!-- </dependency>-->

默认情况下使用lettuce,你也可以手动排除,使用Jedis客户端。

  1. Redis配置类编写

package com.example.wvpdisassembly.conf;

import com.alibaba.fastjson.parser.ParserConfig;
import com.example.wvpdisassembly.utils.redis.FastJsonRedisSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
* @Description redis配置类
* @Author LH
* @Date 2022/11/14 11:11
**/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

   @Bean
   public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
       RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
       // 使用fastJson序列化,自定义实现
       FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
       // value值的序列化采用fastJsonRedisSerializer
       redisTemplate.setValueSerializer(fastJsonRedisSerializer);
       redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
       // 全局开启AutoType,不建议使用
       ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
       // key的序列化采用StringRedisSerializer
       redisTemplate.setKeySerializer(new StringRedisSerializer());
       redisTemplate.setHashKeySerializer(new StringRedisSerializer());
       redisTemplate.setConnectionFactory(redisConnectionFactory);
       return redisTemplate;
  }

}
自定义序列化类
package com.example.wvpdisassembly.utils.redis;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;

import java.nio.charset.Charset;

/**
* @Description 使用fastjson实现redis的序列化
* @Author LH
* @Date 2022/11/14 13:59
**/
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {

   public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

   private Class<T> clazz;

   public FastJsonRedisSerializer(Class<T> clazz) {
       super();
       this.clazz = clazz;
  }

   @Override
   public byte[] serialize(T t) throws SerializationException {
       if (t == null) {
           return new byte[0];
      }
       return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
  }

   @Override
   public T deserialize(byte[] bytes) throws SerializationException {
       if (bytes == null || bytes.length <= 0) {
           return null;
      }
       String str = new String(bytes, DEFAULT_CHARSET);
       return (T) JSON.parseObject(str, clazz);
  }
}
Redis工具类
package com.example.wvpdisassembly.utils.redis;

import com.alibaba.fastjson.JSONObject;
import com.example.wvpdisassembly.utils.SpringBeanUtil;
import org.springframework.data.redis.core.*;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
* @Description Redis工具类
* @Author LH
* @Date 2022/11/14 14:00
**/
@SuppressWarnings(value = {"rawtypes", "unchecked"})
public class RedisUtil {

   private static RedisTemplate redisTemplate;

   static {
       redisTemplate = SpringBeanUtil.getBean("redisTemplate");
  }

   /**
    * 指定缓存失效时间
    *
    * @param key 键
    * @param time 时间(秒)
    * @return true / false
    */
   public static boolean expire(String key, long time) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.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 = SpringBeanUtil.getBean("redisTemplate");
      }
       return redisTemplate.getExpire(key, TimeUnit.SECONDS);
  }

   /**
    * 判断 key 是否存在
    *
    * @param key 键
    * @return true / false
    */
   public static boolean hasKey(String key) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.getBean("redisTemplate");
      }
       try {
           return redisTemplate.hasKey(key);
      } catch (Exception e) {
           e.printStackTrace();
           return false;
      }
  }

   /**
    * 删除缓存
    *
    * @param key 键(一个或者多个)
    * @SuppressWarnings("unchecked") 忽略类型转换警告
    */
   public static boolean del(String... key) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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<Object, Object> map, long time) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.getBean("redisTemplate");
      }
       return redisTemplate.opsForZSet().rank(key, value);
  }

   /**
    * 返回集合的长度
    *
    * @param key
    * @return
    */
   public static Long zSize(Object key) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.getBean("redisTemplate");
      }
       return redisTemplate.opsForZSet().zCard(key);
  }

   /**
    * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容 zrange
    * <p>
    * 返回有序的集合,score小的在前面
    *
    * @param key
    * @param start
    * @param end
    * @return
    */
   public static Set<Object> zRange(Object key, int start, int end) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.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 = SpringBeanUtil.getBean("redisTemplate");
      }
       return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
  }

   /**
    * 查询集合中指定顺序的值 zrevrange
    * <p>
    * 返回有序的集合中,score大的在前面
    *
    * @param key
    * @param start
    * @param end
    * @return
    */
   public static Set<String> zRevRange(Object key, int start, int end) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.getBean("redisTemplate");
      }
       return redisTemplate.opsForList().leftPop(key);
  }

   /**
    * 在键为 key 的 list中移除、最后一个元素
    *
    * @param key 键
    * @return
    */
   public static Object lrightPop(String key) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.getBean("redisTemplate");
      }
       return redisTemplate.opsForList().rightPop(key);
  }

   /**
    * 模糊查询
    *
    * @param key 键
    * @return true / false
    */
   public static List<Object> keys(String key) {
       if (redisTemplate == null) {
           redisTemplate = SpringBeanUtil.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 = SpringBeanUtil.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 = SpringBeanUtil.getBean("redisTemplate");
      }
       redisTemplate.convertAndSend(channel, msg);
  }

}

为了节省Redis空间,手动进行序列化。

posted @ 2022-11-15 08:37  你比从前快乐;  阅读(64)  评论(0编辑  收藏  举报