一、Redis的Java客户端
2024-08-21 16:17:42
模糊的目标,要不断去解释它们,把他们转化成一个更具体的内容,这样才能够找到途径。
常用客户端介绍
Jedis客户端
基本使用(直连)
引入对应依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version></version>
</dependency>
建立与Redis服务器的连接
private Jedis jedis;
// 建立连接
jedis = new Jedis("ip", port);
// 设置密码
jedis.auth("");
// 选择库
jedis.select(0);
业务操作
jedis.set("name", "张三");
String name = jedis.get("name");
关闭连接
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
引入对应依赖
<!-- 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>-->
<!-- <!– 高并发下OOM异常,断连 –>-->
<!-- <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客户端。
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空间,手动进行序列化。
最新文章
- 2016网易春招Java在线笔试回忆录
- django(3) 一对多跨表查询、ajax、多对多
- C++实现邮件群发的方法
- 阴影 box-shadow
- node.js中module.export与export的区别。
- Tomcat部署记事
- 重新想象 Windows 8 Store Apps (45) - 多线程之异步编程: IAsyncAction, IAsyncOperation, IAsyncActionWithProgress, IAsyncOperationWithProgress
- angularJs自定义指令时的绑定
- lintcode:数字组合 II
- gulp+browserSync+nodemon 实现express 全端自动刷新的实践
- 使用ASP在IIS创建WEB站点的函数
- list类型for遍历
- Chapter 1 First Sight——25
- MySQL优化之——备份和恢复
- GeoHash原理和可视化显示
- C#DateTime好用但不常用的用法
- <;转>;HTML、CSS、font-family:中文字体的英文名称
- 《DSP using MATLAB》Problem 3.7
- Spring 相关注解
- Opencv中Rect类