|
|
|
@ -11,34 +11,46 @@ import redis.clients.jedis.ShardedJedis;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 缓存中心
|
|
|
|
|
*
|
|
|
|
|
* 该类主要用于提供与 Redis 缓存相关的操作服务,是对 Redis 功能的一层封装,方便在项目中统一管理和使用缓存功能。
|
|
|
|
|
*/
|
|
|
|
|
@Service("cacheService")
|
|
|
|
|
public class CacheService {
|
|
|
|
|
|
|
|
|
|
// 定义一个常量作为 Redis 中键的前缀,用于区分不同项目或者模块在 Redis 中的数据,统一添加前缀便于管理和识别。
|
|
|
|
|
private final static String REDIS_PRE_KEY = "TAMGUO:";
|
|
|
|
|
// 创建一个用于对象序列化和反序列化的工具类实例,用于处理需要存入 Redis 的对象,使其能以合适的格式在 Redis 中存储和读取。
|
|
|
|
|
private SerializeTranscoder objectSerialize = new ObjectUtil();
|
|
|
|
|
|
|
|
|
|
// 通过 Spring 的依赖注入,自动装配 RedisXMLConfigure 实例,该实例可能用于配置 Redis 连接相关信息以及获取和关闭连接等操作。
|
|
|
|
|
@Autowired
|
|
|
|
|
private RedisXMLConfigure redisXMLConfigure;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据传入的键获取对应的值,如果键在 Redis 中存在,则返回对应的值,否则返回 null。
|
|
|
|
|
*
|
|
|
|
|
* @Title: get @Description: @param @return String 返回类型 @throws
|
|
|
|
|
* @param key 要获取值的键,在实际操作前会先添加 REDIS_PRE_KEY 前缀。
|
|
|
|
|
* @return 返回对应键在 Redis 中存储的字符串值,如果不存在则返回 null。
|
|
|
|
|
*/
|
|
|
|
|
public String get(String key) {
|
|
|
|
|
// 给传入的键添加前缀,使其符合项目在 Redis 中键的规范格式。
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
// 通过 RedisXMLConfigure 获取 Redis 连接对象,ShardedJedis 通常用于在 Redis 集群等场景下获取连接进行操作。
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 使用获取到的连接对象,调用 get 方法从 Redis 中获取对应键的值。
|
|
|
|
|
return conn.get(key);
|
|
|
|
|
} finally {
|
|
|
|
|
// 无论是否成功获取到值,都需要关闭 Redis 连接,通过 RedisXMLConfigure 提供的方法来关闭连接,释放资源。
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将键值对存入 Redis 中,如果键已存在则覆盖原有值。
|
|
|
|
|
*
|
|
|
|
|
* @Title: set @Description: @param @return void 返回类型 @throws
|
|
|
|
|
* @param key 要存入的键,同样会先添加前缀。
|
|
|
|
|
* @param value 要存入的字符串值。
|
|
|
|
|
*/
|
|
|
|
|
public void set(String key, String value) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
@ -52,16 +64,12 @@ public class CacheService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* set 设置带过期时间的字符缓存
|
|
|
|
|
* 设置键值对存入 Redis 中,并指定过期时间,一旦超过过期时间,对应键值对将自动从 Redis 中删除。
|
|
|
|
|
*
|
|
|
|
|
* @param key
|
|
|
|
|
* @param value
|
|
|
|
|
* @param time
|
|
|
|
|
* 过期时间,秒
|
|
|
|
|
* @description
|
|
|
|
|
* @exception @since
|
|
|
|
|
* 1.0.0
|
|
|
|
|
* @param key 要存入的键,会先添加前缀。
|
|
|
|
|
* @param value 要存入的字符串值。
|
|
|
|
|
* @param time 过期时间,单位为秒,表示键值对在 Redis 中有效的时长。
|
|
|
|
|
*/
|
|
|
|
|
public void set(String key, String value, int time) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
@ -69,6 +77,7 @@ public class CacheService {
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
conn.set(key, value);
|
|
|
|
|
// 在设置完键值对后,调用 expire 方法设置对应键的过期时间。
|
|
|
|
|
conn.expire(key, time);
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
@ -77,17 +86,21 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* redis中存放对象
|
|
|
|
|
* 将可序列化的对象存入 Redis 中,通过 SerializeTranscoder 将对象进行序列化后再存入,以便能在 Redis 中存储对象类型的数据。
|
|
|
|
|
*
|
|
|
|
|
* @param key 对象key
|
|
|
|
|
* @param value 可序列化的对象
|
|
|
|
|
* @param key 对象键,同样会先添加前缀,用于在 Redis 中唯一标识该对象。
|
|
|
|
|
* @param value 可序列化的对象,即需要实现了序列化接口的对象,才能正确存入 Redis。
|
|
|
|
|
*/
|
|
|
|
|
public void setObject(String key, Object value) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 将键转换为字节数组形式(因为 Redis 的底层存储很多操作是基于字节数组的),
|
|
|
|
|
// 并使用 objectSerialize 工具类将对象序列化后存入 Redis。
|
|
|
|
|
conn.set(key.getBytes(), objectSerialize.serialize(value));
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
// 如果在序列化或者存入过程中出现异常,打印异常堆栈信息,方便排查问题。
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
@ -96,22 +109,26 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置过期时间存储对象
|
|
|
|
|
* 将可序列化的对象存入 Redis 中,并同时指定过期时间,在过期时间后对象将自动从 Redis 中删除。
|
|
|
|
|
*
|
|
|
|
|
* @param key 对象key
|
|
|
|
|
* @param value 对象值
|
|
|
|
|
* @param time 过期时间 秒
|
|
|
|
|
* @param key 对象键,先添加前缀后用于存储。
|
|
|
|
|
* @param value 对象值,需要是可序列化的对象。
|
|
|
|
|
* @param time 过期时间,单位为秒,控制对象在 Redis 中的有效时长。
|
|
|
|
|
*/
|
|
|
|
|
public void setObject(String key, Object value, int time) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 使用 setex 方法,它可以在设置对象值的同时直接指定过期时间,一次性完成存储和过期时间设置操作,
|
|
|
|
|
// 先将键转换为字节数组,再将序列化后的对象存入 Redis,并设置过期时间。
|
|
|
|
|
conn.setex(key.getBytes(), time, objectSerialize.serialize(value));
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -120,18 +137,26 @@ public class CacheService {
|
|
|
|
|
* @param key 对象key
|
|
|
|
|
* @return 存储的对象
|
|
|
|
|
*/
|
|
|
|
|
// 根据给定的键从Redis中获取对应的对象。先对键添加前缀处理,然后通过Redis连接获取对象数据,若获取到数据则进行反序列化后返回,若出现异常或未获取到数据则返回null。
|
|
|
|
|
public Object getObject(String key) {
|
|
|
|
|
// 给传入的键添加前缀,使其符合项目在Redis中键的规范格式,便于统一管理和准确获取对应的数据。
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
// 通过RedisXMLConfigure获取Redis连接对象,ShardedJedis用于在Redis集群等场景下进行操作,以便后续与Redis进行交互。
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 从Redis中获取以字节数组形式存储的对象数据,因为Redis底层很多操作基于字节数组来处理数据存储和读取。
|
|
|
|
|
byte[] obj = conn.get(key.getBytes());
|
|
|
|
|
// 如果获取到的字节数组为null,说明Redis中不存在对应键的数据,直接返回null。
|
|
|
|
|
if (null == obj)
|
|
|
|
|
return null;
|
|
|
|
|
// 使用objectSerialize工具类对获取到的字节数组进行反序列化操作,将其转换为原始的对象形式并返回。
|
|
|
|
|
return objectSerialize.deserialize(obj);
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
// 如果在获取数据或者反序列化过程中出现异常,打印异常堆栈信息,方便排查问题所在。
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
|
} finally {
|
|
|
|
|
// 无论是否成功获取到对象,都需要关闭Redis连接,通过RedisXMLConfigure提供的方法来关闭连接,释放相关资源。
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
@ -139,15 +164,19 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 删除一个对象
|
|
|
|
|
* 该方法用于从Redis中删除指定键对应的对象数据,先对键添加前缀处理,然后尝试通过Redis连接执行删除操作,
|
|
|
|
|
* 如果删除操作成功(即返回值表示删除的键数量为1)则返回true,若出现异常或删除失败则返回false。
|
|
|
|
|
*
|
|
|
|
|
* @param key 对象key值
|
|
|
|
|
* @return
|
|
|
|
|
* @param key 对象key值,即要删除的对象在Redis中对应的键。
|
|
|
|
|
* @return 返回一个布尔值,表示是否成功删除对象,true表示删除成功,false表示删除失败或出现异常情况。
|
|
|
|
|
*/
|
|
|
|
|
public boolean deleteObject(String key) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用Redis连接对象的del方法,传入要删除的对象键的字节数组形式,尝试删除对应的数据。
|
|
|
|
|
// 该方法返回被删除键的数量,若返回值等于1L,表示成功删除了1个键(即对应要删除的对象键),则返回true,否则返回false。
|
|
|
|
|
return conn.del(key.getBytes()) == 1L;
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
@ -158,15 +187,21 @@ public class CacheService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断key是否存在
|
|
|
|
|
* 通过给定的键,先添加前缀使其符合项目规范后,尝试从Redis中查询该键是否存在,
|
|
|
|
|
* 如果存在则返回true,若出现异常或键不存在则返回false。
|
|
|
|
|
*
|
|
|
|
|
* @Title: isExist @Description: 判断key是否存在 @param @return boolean
|
|
|
|
|
* 返回类型 @throws
|
|
|
|
|
* @Title: isExist
|
|
|
|
|
* @Description: 判断key是否存在
|
|
|
|
|
* @param key 要检查是否存在的键。
|
|
|
|
|
* @return 返回一个布尔值,表示键是否存在于Redis中,true表示存在,false表示不存在或者出现异常情况。
|
|
|
|
|
*/
|
|
|
|
|
public boolean isExist(String key) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用Redis连接对象的exists方法,传入要检查的键,该方法会在Redis中查询该键是否存在,存在则返回true,不存在返回false。
|
|
|
|
|
return conn.exists(key);
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
@ -176,15 +211,19 @@ public class CacheService {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 对isExist方法的结果取反,用于判断给定的键在Redis中是否不存在,返回值为true表示键不存在,false表示键存在。
|
|
|
|
|
public boolean notExist(String key) {
|
|
|
|
|
return!isExist(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从Redis中删除指定的键及其对应的数据,先对键添加前缀处理,然后通过Redis连接执行删除操作,
|
|
|
|
|
// 如果删除操作成功(即返回值表示删除的键数量为1)则返回true,若出现异常或删除失败则返回false。
|
|
|
|
|
public boolean delete(String key) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用Redis连接对象的del方法,传入要删除的键,该方法返回被删除键的数量,若返回值等于1,表示成功删除了1个键(即对应要删除的键),则返回true,否则返回false。
|
|
|
|
|
return conn.del(key) == 1;
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
@ -201,47 +240,59 @@ public class CacheService {
|
|
|
|
|
* @param value
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
// 将指定的值插入到以给定键标识的列表(List)的末尾,并返回插入操作后列表的长度。
|
|
|
|
|
// 先对键添加前缀进行规范处理,然后通过获取的 Redis 连接执行插入操作,最后返回列表长度。
|
|
|
|
|
public long putToListEnd(String key, String value) {
|
|
|
|
|
// 给传入的键添加前缀,使其符合项目在 Redis 中键的规范格式,便于准确操作对应的列表数据。
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
// 通过 RedisXMLConfigure 获取 Redis 连接对象,用于后续与 Redis 进行交互操作。
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 rpush 方法,将指定的值插入到键对应的列表末尾,
|
|
|
|
|
// 该方法会返回操作后列表的长度,即元素个数,然后将此长度返回给调用者。
|
|
|
|
|
long length = conn.rpush(key, value);
|
|
|
|
|
return length;
|
|
|
|
|
} finally {
|
|
|
|
|
// 无论插入操作是否成功,都需要关闭 Redis 连接,通过 RedisXMLConfigure 提供的方法来关闭连接,释放资源。
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将value插入集合key的尾部, 并设置过期时间
|
|
|
|
|
* 该方法用于将给定的值插入到有序集合(Sorted Set)中,并为该有序集合设置过期时间,
|
|
|
|
|
* 实际调用了 addToSortedSet 方法进行插入操作,传入合适的参数来实现带过期时间的插入功能。
|
|
|
|
|
*
|
|
|
|
|
* @author zhangxin
|
|
|
|
|
* @param key
|
|
|
|
|
* @param value
|
|
|
|
|
* @param seconds
|
|
|
|
|
* @param score
|
|
|
|
|
* @return long 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员
|
|
|
|
|
* @param key 有序集合对应的键,用于在 Redis 中唯一标识该有序集合。
|
|
|
|
|
* @param value 要插入到有序集合中的值。
|
|
|
|
|
* @param seconds 过期时间,单位为秒,表示有序集合在 Redis 中有效的时长,超过该时间后集合将自动被删除。
|
|
|
|
|
* @param score 用于给插入的元素设置一个分数(score),有序集合会根据元素的分数来进行排序。
|
|
|
|
|
* @return long 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员,这里返回值实际上是调用 addToSortedSet 方法后的返回结果。
|
|
|
|
|
*/
|
|
|
|
|
public long addToSortedSetAndExpire(String key, String value, int seconds, double score) {
|
|
|
|
|
return addToSortedSet(key, value, seconds, true, score);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将value插入集合key的尾部 增加value的score
|
|
|
|
|
* 此方法用于将给定的值插入到有序集合(Sorted Set)的末尾,并增加该值对应的分数(score),
|
|
|
|
|
* 通过获取 Redis 连接,调用相应的 Redis 命令来实现该功能,最后返回更新后的分数值。
|
|
|
|
|
*
|
|
|
|
|
* @author zhangxin
|
|
|
|
|
* @param key
|
|
|
|
|
* @param value
|
|
|
|
|
* @param score
|
|
|
|
|
* @return long 被成功添加的新成员的分数
|
|
|
|
|
* @param key 有序集合对应的键,用于在 Redis 中唯一标识该有序集合。
|
|
|
|
|
* @param value 要插入到有序集合中的值。
|
|
|
|
|
* @param score 要增加的分数值,用于更新该值在有序集合中的排序位置等相关逻辑。
|
|
|
|
|
* @return long 被成功添加的新成员的分数,这里返回的是操作后该成员对应的新分数值,通过 Redis 的 zincrby 命令返回的结果转换得到。
|
|
|
|
|
*/
|
|
|
|
|
public double addToSortedSetScore(String key, String value, double score) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 zincrby 方法,将指定的值插入到键对应的有序集合中,并按照给定的分数增量(score)增加其分数,
|
|
|
|
|
// 该方法返回更新后的分数值(以 Double 类型表示),然后将此分数值返回给调用者。
|
|
|
|
|
Double zincrby = conn.zincrby(key, score, value);
|
|
|
|
|
return zincrby;
|
|
|
|
|
} finally {
|
|
|
|
@ -251,15 +302,20 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取member的Score
|
|
|
|
|
* @param key
|
|
|
|
|
* @param value
|
|
|
|
|
* @return
|
|
|
|
|
* 用于获取给定成员(member)在指定有序集合(以键 key 标识)中的分数(score)值,
|
|
|
|
|
* 如果成员不存在于有序集合中,则返回默认值 0,否则返回其实际的分数值。
|
|
|
|
|
*
|
|
|
|
|
* @param key 有序集合对应的键,用于在 Redis 中唯一标识该有序集合。
|
|
|
|
|
* @param value 有序集合中的成员,即要获取其分数值的元素。
|
|
|
|
|
* @return 返回该成员对应的分数值,如果成员不存在则返回 0,通过 Redis 的 zscore 命令获取并进行相应的返回值处理。
|
|
|
|
|
*/
|
|
|
|
|
public Double getMemberScore(String key, String member) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 zscore 方法,尝试获取指定成员在键对应的有序集合中的分数值,
|
|
|
|
|
// 该方法返回的分数值可能为 null(表示成员不存在),若为 null 则返回默认值 0,否则返回实际的分数值。
|
|
|
|
|
Double zscore = conn.zscore(key, member);
|
|
|
|
|
return zscore == null? 0 : zscore;
|
|
|
|
|
} finally {
|
|
|
|
@ -267,31 +323,36 @@ public class CacheService {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将value插入集合key的尾部, 不设置过期时间
|
|
|
|
|
* 此方法用于将给定的值插入到有序集合(Sorted Set)的末尾,不设置过期时间,
|
|
|
|
|
* 实际是调用 addToSortedSet 方法并传入合适的参数来实现不带过期时间的插入功能,返回插入操作后成功添加的新成员数量。
|
|
|
|
|
*
|
|
|
|
|
* @author zhangxin
|
|
|
|
|
* @param key
|
|
|
|
|
* @param value
|
|
|
|
|
* @param score
|
|
|
|
|
* @return long 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员
|
|
|
|
|
* @param key 有序集合对应的键,用于在 Redis 中唯一标识该有序集合。
|
|
|
|
|
* @param value 要插入到有序集合中的值。
|
|
|
|
|
* @param score 用于给插入的元素设置一个分数(score),有序集合会根据元素的分数来进行排序。
|
|
|
|
|
* @return long 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员,这里返回值实际上是调用 addToSortedSet 方法后的返回结果。
|
|
|
|
|
*/
|
|
|
|
|
public long addToSortedSet(String key, String value, double score) {
|
|
|
|
|
return addToSortedSet(key, value, -1, false, score);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断member在集合里是否存在
|
|
|
|
|
* 通过检查给定成员(member)在指定有序集合(以键 key 标识)中的排名(rank)情况,
|
|
|
|
|
* 来判断该成员是否存在于有序集合中,若排名不为 null,则表示成员存在,返回 true,否则返回 false。
|
|
|
|
|
*
|
|
|
|
|
* @return isExist 存在 true 不存在
|
|
|
|
|
* @return isExist 存在 true 不存在 false,表示给定成员是否存在于指定的有序集合中。
|
|
|
|
|
*/
|
|
|
|
|
public boolean isExistSortedSet(String key, String member) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 zrank 方法,获取指定成员在键对应的有序集合中的排名,
|
|
|
|
|
// 如果成员存在于集合中,该方法返回其排名(Long 类型),若不存在则返回 null,
|
|
|
|
|
// 根据返回值是否为 null 来判断成员是否存在,并返回相应的布尔值结果。
|
|
|
|
|
Long zrank = conn.zrank(key, member);
|
|
|
|
|
return zrank!= null;
|
|
|
|
|
} finally {
|
|
|
|
@ -304,30 +365,45 @@ public class CacheService {
|
|
|
|
|
*
|
|
|
|
|
* @return isExist 存在 true 不存在
|
|
|
|
|
*/
|
|
|
|
|
// 从指定的有序集合(Sorted Set)中删除给定的成员(member),并根据删除操作的结果返回一个布尔值表示是否删除成功。
|
|
|
|
|
// 成功删除至少一个成员时返回 true,否则返回 false。先对键添加前缀规范处理,再通过 Redis 连接执行删除操作并判断结果。
|
|
|
|
|
public boolean delSortedSetMember(String key, String[] member) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 zrem 方法,传入有序集合的键和要删除的成员数组,尝试从有序集合中删除这些成员。
|
|
|
|
|
// 该方法返回被成功删除的成员数量(Long 类型),通过判断返回值是否大于等于 1 来确定是否至少成功删除了一个成员,进而返回相应的布尔值结果。
|
|
|
|
|
Long zrem = conn.zrem(key, member);
|
|
|
|
|
return zrem >= 1;
|
|
|
|
|
} finally {
|
|
|
|
|
// 无论删除操作是否成功,都要关闭 Redis 连接,通过 RedisXMLConfigure 提供的方法来释放资源。
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将value插入集合key的尾部, 对于setExpire为false的情况, seconds无效
|
|
|
|
|
* 此方法是一个私有方法,用于将给定的值插入到有序集合(Sorted Set)中,并可根据参数决定是否设置过期时间。
|
|
|
|
|
* 返回值为被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
|
|
|
|
|
*
|
|
|
|
|
* @return 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员
|
|
|
|
|
* @param key 有序集合对应的键,用于在 Redis 中唯一标识该有序集合。
|
|
|
|
|
* @param value 要插入到有序集合中的值。
|
|
|
|
|
* @param seconds 过期时间,单位为秒,当 setExpire 参数为 true 时,此参数用于设置有序集合的过期时间,否则无效。
|
|
|
|
|
* @param setExpire 布尔值,表示是否设置过期时间,为 true 时设置过期时间,为 false 则不设置。
|
|
|
|
|
* @param score 用于给插入的元素设置一个分数(score),有序集合会根据元素的分数来进行排序。
|
|
|
|
|
* @return long 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员,通过 Redis 的 zadd 命令插入元素后返回相应的添加数量结果。
|
|
|
|
|
*/
|
|
|
|
|
private long addToSortedSet(String key, String value, int seconds, boolean setExpire, double score) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 zadd 方法,将指定的值按照给定的分数(score)插入到键对应的有序集合中,
|
|
|
|
|
// 该方法返回成功添加的新成员数量(不包含已存在被更新的成员情况),将此数量赋值给 addNum 变量。
|
|
|
|
|
long addNum = conn.zadd(key, score, value);
|
|
|
|
|
if (setExpire) {
|
|
|
|
|
// 如果 setExpire 参数为 true,调用 Redis 连接对象的 expire 方法,为有序集合设置过期时间(以 seconds 参数指定的秒数为准)。
|
|
|
|
|
conn.expire(key, seconds);
|
|
|
|
|
}
|
|
|
|
|
return addNum;
|
|
|
|
@ -338,28 +414,34 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 按score降序分页获取有序集合中内容
|
|
|
|
|
* 按照分数(score)降序的顺序,对指定的有序集合进行分页查询,获取对应页面范围的成员内容,返回以字符串集合(Set<String>)形式表示的结果。
|
|
|
|
|
*
|
|
|
|
|
* @author zhangxin
|
|
|
|
|
* @param key
|
|
|
|
|
* @param pageNo
|
|
|
|
|
* 首页从1开始
|
|
|
|
|
* @param pageSize
|
|
|
|
|
* @return Set<String>
|
|
|
|
|
* @param key 有序集合对应的键,用于在 Redis 中唯一标识该有序集合。
|
|
|
|
|
* @param pageNo 页码,首页从 1 开始,表示要获取第几页的数据,若传入小于 1 的值,则会自动修正为 1。
|
|
|
|
|
* @param pageSize 每页显示的记录数量,若传入小于 1 的值,则会自动修正为 1。
|
|
|
|
|
* @return Set<String> 返回对应页面范围内的有序集合成员内容,以集合形式返回,如果出现异常则返回 null。
|
|
|
|
|
*/
|
|
|
|
|
public Set<String> getSortedSetByPage(String key, int pageNo, int pageSize) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
// 对传入的页码进行合法性校验,如果小于 1,则将其修正为 1,确保页码从 1 开始计数。
|
|
|
|
|
if (pageNo < 1) {
|
|
|
|
|
pageNo = 1;
|
|
|
|
|
}
|
|
|
|
|
// 对传入的每页记录数量进行合法性校验,如果小于 1,则将其修正为 1,确保每页至少有 1 条记录。
|
|
|
|
|
if (pageSize < 1) {
|
|
|
|
|
pageSize = 1;
|
|
|
|
|
}
|
|
|
|
|
// 根据页码和每页记录数量计算出在有序集合中查询的起始索引位置,用于分页获取数据。
|
|
|
|
|
int start = (pageNo - 1) * pageSize;
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 zrevrange 方法,按照分数降序的顺序,从指定的有序集合中获取从起始索引到结束索引(通过计算得出)范围内的成员内容,
|
|
|
|
|
// 并将结果以集合形式返回,集合中的元素为有序集合的成员(以字符串形式表示)。
|
|
|
|
|
return conn.zrevrange(key, start, start + pageSize - 1);
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
// 如果在获取数据过程中出现异常,打印异常堆栈信息,方便排查问题,然后返回 null。
|
|
|
|
|
ex.printStackTrace();
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
@ -367,13 +449,17 @@ public class CacheService {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从以给定键标识的列表(List)头部获取元素,返回获取到的元素列表(List<String>),如果列表为空或者获取操作出现异常则返回 null。
|
|
|
|
|
public List<String> getListHead(String key) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 blpop 方法,尝试从列表头部获取元素,传入超时时间(这里是 1000 毫秒)和列表键,
|
|
|
|
|
// 该方法会阻塞等待元素出现,直到超时或者获取到元素,返回获取到的元素列表(可能包含一个或多个元素,以 List<String> 形式表示)。
|
|
|
|
|
List<String> result = conn.blpop(1000, key);
|
|
|
|
|
|
|
|
|
|
// 如果获取到的结果为 null 或者结果列表大小为 0(即没有获取到元素),则返回 null,表示列表为空或获取失败。
|
|
|
|
|
if (null == result || result.size() == 0)
|
|
|
|
|
return null;
|
|
|
|
|
return result;
|
|
|
|
@ -384,59 +470,77 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 存储map
|
|
|
|
|
* 此方法用于将单个键值对存储到 Redis 的哈希(Hash)数据结构中,对应的键(key)下的指定字段(field)中,
|
|
|
|
|
* 返回值表示如果字段已存在则返回 0,否则返回 1,表示插入操作的结果情况。
|
|
|
|
|
*
|
|
|
|
|
* @param key 键值
|
|
|
|
|
* @param field map field
|
|
|
|
|
* @param value map value
|
|
|
|
|
* @return if filed exist return 0 else return 1
|
|
|
|
|
* @param key 键值,用于在 Redis 中定位到对应的哈希数据结构所在的位置,类似哈希表的名称。
|
|
|
|
|
* @param field map field,哈希表中的字段名,用于在对应的哈希结构下唯一标识一个键值对。
|
|
|
|
|
* @param value map value,要存储到指定字段下的值,即哈希表中字段对应的值内容。
|
|
|
|
|
* @return if filed exist return 0 else return 1,表示如果指定的字段在哈希表中已存在,则返回 0,若不存在则返回 1,根据 Redis 的 hset 命令的返回规则确定。
|
|
|
|
|
*/
|
|
|
|
|
public Long hset(String key, String field, String value) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 hset 方法,将指定的键(key)、字段(field)和值(value)存储到 Redis 的哈希数据结构中,
|
|
|
|
|
// 该方法会根据字段是否已存在返回相应的结果(已存在返回 0,不存在返回 1),将此结果返回给调用者。
|
|
|
|
|
return conn.hset(key, field, value);
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 存储map
|
|
|
|
|
// 此方法用于将整个映射(Map)存储到 Redis 的哈希(Hash)数据结构中,以给定的键(key)作为哈希表的标识,一次性存储多个键值对。
|
|
|
|
|
// 返回值为存储操作后的结果信息(具体含义可能取决于 Redis 底层实现对应的返回值情况)。
|
|
|
|
|
public String hset(String key, Map<String, String> values) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 hmset 方法,将给定的映射(包含多个键值对的 Map)存储到指定键对应的哈希数据结构中,
|
|
|
|
|
// 该方法会执行批量存储操作,并返回相应的结果信息(通常用于表示操作是否成功等情况),将此结果返回给调用者。
|
|
|
|
|
return conn.hmset(key, values);
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将给定的映射(Map)存储到 Redis 的哈希(Hash)数据结构中,并为该哈希数据结构设置过期时间。
|
|
|
|
|
// 先获取 Redis 连接,执行存储操作后设置过期时间,最后返回存储操作的结果信息。
|
|
|
|
|
public String hset(String key, Map<String, String> values, int time) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 hmset 方法,将包含多个键值对的映射(values)存储到以 key 为标识的哈希数据结构中,
|
|
|
|
|
// 该方法执行存储操作后会返回相应的结果信息(通常用于表示操作是否成功等情况),将此结果暂存到 hmset 变量中。
|
|
|
|
|
String hmset = conn.hmset(key, values);
|
|
|
|
|
// 调用 Redis 连接对象的 expire 方法,为以 key 为标识的哈希数据结构设置过期时间,单位为秒,由 time 参数指定。
|
|
|
|
|
conn.expire(key, time);
|
|
|
|
|
return hmset;
|
|
|
|
|
} finally {
|
|
|
|
|
// 无论存储和设置过期时间操作是否成功,都要关闭 Redis 连接,通过 RedisXMLConfigure 提供的方法来释放资源。
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 得到map中存储的field值
|
|
|
|
|
* 此方法用于从 Redis 的哈希(Hash)数据结构中,根据给定的键(key)和字段(field)获取对应的值,返回获取到的字符串值。
|
|
|
|
|
*
|
|
|
|
|
* @param key 键值
|
|
|
|
|
* @param field map field
|
|
|
|
|
* @return
|
|
|
|
|
* @param key 键值,用于在 Redis 中定位到对应的哈希数据结构所在的位置,类似哈希表的名称。
|
|
|
|
|
* @param field map field,哈希表中的字段名,用于在对应的哈希结构下唯一标识一个键值对,通过该字段名获取对应的值。
|
|
|
|
|
* @return 返回在指定哈希数据结构中,对应字段存储的字符串值,如果字段不存在则返回 null(取决于 Redis 的 hget 方法返回值情况)。
|
|
|
|
|
*/
|
|
|
|
|
public String hget(String key, String field) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 hget 方法,从以 key 为标识的哈希数据结构中获取指定字段(field)对应的字符串值,
|
|
|
|
|
// 并将获取到的值直接返回给调用者。
|
|
|
|
|
return conn.hget(key, field);
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
@ -445,15 +549,18 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 名称为key的string减1操作
|
|
|
|
|
* 对 Redis 中以给定键(key)标识的字符串类型的值执行减 1 操作,返回操作后的结果值(以 Long 类型表示)。
|
|
|
|
|
*
|
|
|
|
|
* @param key
|
|
|
|
|
* @return
|
|
|
|
|
* @param key 要进行减 1 操作的键,对应 Redis 中存储的字符串类型的数据的键名。
|
|
|
|
|
* @return 返回减 1 操作后的结果值(Long 类型),如果键对应的值不存在,则 Redis 会按照默认规则进行处理(通常初始化为 0 后再减 1),返回相应的结果。
|
|
|
|
|
*/
|
|
|
|
|
public Long decr(String key) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 decr 方法,对以 key 为标识的字符串值执行减 1 操作,
|
|
|
|
|
// 该方法会自动将字符串值转换为数字类型(如果能转换成功)进行减 1 操作,并返回操作后的结果(以 Long 类型表示),将此结果返回给调用者。
|
|
|
|
|
return conn.decr(key);
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
@ -462,21 +569,26 @@ public class CacheService {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 名称为key的string加1操作
|
|
|
|
|
* 对 Redis 中以给定键(key)标识的字符串类型的值执行加 1 操作,返回操作后的结果值(以 Long 类型表示)。
|
|
|
|
|
*
|
|
|
|
|
* @param key
|
|
|
|
|
* @return
|
|
|
|
|
* @param key 要进行加 1 操作的键,对应 Redis 中存储的字符串类型的数据的键名。
|
|
|
|
|
* @return 返回加 1 操作后的结果值(Long 类型),如果键对应的值不存在,则 Redis 会按照默认规则进行处理(通常初始化为 0 后再加 1),返回相应的结果。
|
|
|
|
|
*/
|
|
|
|
|
public Long incr(String key) {
|
|
|
|
|
key = getPreKey(key);
|
|
|
|
|
ShardedJedis conn = null;
|
|
|
|
|
try {
|
|
|
|
|
conn = redisXMLConfigure.getConnection();
|
|
|
|
|
// 调用 Redis 连接对象的 incr 方法,对以 key 为标识的字符串值执行加 1 操作,
|
|
|
|
|
// 该方法会自动将字符串值转换为数字类型(如果能转换成功)进行加 1 操作,并返回操作后的结果(以 Long 类型表示),将此结果返回给调用者。
|
|
|
|
|
return conn.incr(key);
|
|
|
|
|
} finally {
|
|
|
|
|
redisXMLConfigure.closeConnection(conn);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取处理后的键,用于在 Redis 操作前统一添加前缀,使键符合项目在 Redis 中的命名规范。
|
|
|
|
|
// 如果通过 redisXMLConfigure 获取到的前缀为空,则使用类中定义的默认前缀(REDIS_PRE_KEY)与传入的键拼接,否则使用获取到的前缀与键拼接。
|
|
|
|
|
private String getPreKey(String key) {
|
|
|
|
|
String temp_pre = redisXMLConfigure.getPreKey();
|
|
|
|
|
if (null == temp_pre) {
|
|
|
|
@ -484,5 +596,3 @@ public class CacheService {
|
|
|
|
|
}
|
|
|
|
|
return temp_pre + key;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|