一、Redis的Java客户端
模糊的目标,要不断去解释它们,把他们转化成一个更具体的内容,这样才能够找到途径。
常用客户端介绍
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空间,手动进行序列化。
一、Redis的Java客户端的更多相关文章
- 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...
- Redis(九):Redis的Java客户端Jedis
Redis的Java客户端Jedis导航目录: 安装JDK 安装Eclipse Jedis所需要的Jar包 Jedis常用操作 JedisPool 安装JDK tar -zxvf jdk-7u67-l ...
- Tedis:淘宝的Redis的Java客户端开发包
Tedis:淘宝的Redis的Java客户端开发包 http://www.open-open.com/lib/view/open1389880631976.html Tedis Tedis是另 ...
- 9.Redis的Java客户端Jedis
Redis的Java客户端Jedis Jedis所需jar包 commons-pool-1.6.jar jedis-2.1.0.jar 1.Jedis常用操作(jedis中的api 和 我们在 l ...
- Redis解读(2):Redis的Java客户端
Redis的Java客户端 Redis不仅使用命令客户端来操作,而且可以使用程序客户端操作,其实配置和实现起来也非常容易. 现在基本上主流的语言都有客户端支持,比如Java.C.C#.C++.php. ...
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...
- 使用Redis的Java客户端Jedis
转载自:http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 前一篇文章<Redis命令指南>讲解了通过命令行 ...
- [转载] 使用Redis的Java客户端Jedis
转载自http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 在实际的项目开发中,各种语言是使用Redis的客户端库来与Re ...
- Redis的java客户端jedis
导包:Jedis需要的jar包 >Commons-pool-1.6.jar >Jedis-2.1.0.jar 配置:linux防火墙设置,不会设置就关闭. 停止防火墙 systemctl ...
- Redis之Java客户端Jedis
导读 Redis不仅使用命令客户端来操作,而且可以使用程序客户端操作. 现在基本上主流的语言都有客户端支持,比如Java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Java ...
随机推荐
- Linux的OpenLava配置
OpenLava OpenLava是基于LSF早期的开源版本发展而来,其免费.开源.兼容IBM LSF的工作负载调度器.当你需要执行某项业务时候(比如跑渲染之类的),当有服务器处于空闲状态时候,可以直 ...
- KingbaseES 工具sys_dump,sys_restore使用介绍
说明: KingbaseES V8R6版本中自带数据库备份导出sys_dump,和备份恢复sys_restore工具. sys_dump:把KingbaseES数据库抽取为一个脚本文件或其他归档文件. ...
- 手写tomcat——编写一个提供servlet能力的 http服务器
点击查看代码 package com.grady.diytomcat; import com.grady.diytomcat.handler.RequestHandler; import org.do ...
- ACVF of ARMA(1, 1)
\(ARMA(1, ~ 1)\) process is a time series \(\left\{ X_{t} \right\}\) defined as: \[X_{t} - \phi X_{t ...
- Go工程化 - 依赖注入
我们在微服务框架kratos v2的默认项目模板中kratos-layout使用了google/wire进行依赖注入,也建议开发者在维护项目时使用该工具. wire 乍看起来比较违反直觉,导致很多同学 ...
- Logstash:Grok filter 入门
转载自: https://blog.csdn.net/UbuntuTouch/article/details/105922198 Logstash模式:https://www.elastic.co/g ...
- 3.Ceph 基础篇 - RBD 块存储使用
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485253&idx=1&sn=24d9b06a ...
- linux软链接的创建、修改和删除
创建 ln -s [源文件或目录] [目标文件或目录] 修改 ln –snf [新的源文件或目录] [目标文件或目录] 删除 rm –rf 软链接名称 注意,上面这种形式可能会让人产生担忧,害怕删除的 ...
- 在 CentOS 8/RHEL 8 上安装和使用 Cockpit
Cockpit 是一个基于 Web 的服务器管理工具,可用于 CentOS 和 RHEL 系统.最近发布的 CentOS 8 和 RHEL 8,其中 cockpit 是默认的服务器管理工具.它的软件包 ...
- js从数组中找到某个对象
handel(ide) { let that = this; console.log(that.goodCaseList); let detailData = that.goodCaseList.fi ...