304 lines
6.8 KiB
Java
Raw Normal View History

2025-06-26 13:02:00 +08:00
package edu.whut.infrastructure.redis;
import org.redisson.api.*;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;
/**
* Redis 服务 统一方法名上层业务只依赖 IRedisService 这个接口不用关心用的是 RedissonLettuce 还是别的
*/
public interface IRedisService {
2025-06-27 13:19:13 +08:00
//基本 KV
2025-06-26 13:02:00 +08:00
/**
* 设置指定 key 的值
*
* @param key
* @param value
*/
<T> void setValue(String key, T value);
/**
* 设置指定 key 的值
*
* @param key
* @param value
* @param expired 过期时间
*/
<T> void setValue(String key, T value, long expired);
/**
* 获取指定 key 的值
*
* @param key
* @return
*/
<T> T getValue(String key);
/**
2025-06-27 13:19:13 +08:00
* 移除指定 key 的值
*
* @param key
*/
void remove(String key);
/**
* 判断指定 key 的值是否存在
*
* @param key
* @return true/false
*/
boolean isExists(String key);
//队列
/**
* 获取普通队列 非阻塞的先进先出队列
2025-06-26 13:02:00 +08:00
*
* @param key
* @param <T> 泛型
* @return 队列
*/
<T> RQueue<T> getQueue(String key);
/**
2025-06-27 13:19:13 +08:00
* 加锁队列 消费者可以阻塞等待队列元素
2025-06-26 13:02:00 +08:00
*
* @param key
* @param <T> 泛型
* @return 队列
*/
<T> RBlockingQueue<T> getBlockingQueue(String key);
/**
2025-06-27 13:19:13 +08:00
* 延迟队列 把消息延后放到阻塞队列中适合定时任务重试机制
2025-06-26 13:02:00 +08:00
*
* @param rBlockingQueue 加锁队列
* @param <T> 泛型
* @return 队列
*/
<T> RDelayedQueue<T> getDelayedQueue(RBlockingQueue<T> rBlockingQueue);
2025-06-27 13:19:13 +08:00
//数值计数器,原子自增/自减计数器适合做分布式编号、PV/UV 统计、限流计数等。
2025-06-26 13:02:00 +08:00
/**
* 设置值
*
* @param key key
* @param value
*/
void setAtomicLong(String key, long value);
/**
* 获取值
*
* @param key key
*/
Long getAtomicLong(String key);
/**
* 自增 Key 的值1234
*
* @param key
* @return 自增后的值
*/
long incr(String key);
/**
* 指定值自增 Key 的值1234
*
* @param key
* @return 自增后的值
*/
long incrBy(String key, long delta);
/**
* 自减 Key 的值1234
*
* @param key
* @return 自增后的值
*/
long decr(String key);
/**
* 指定值自增 Key 的值1234
*
* @param key
* @return 自增后的值
*/
long decrBy(String key, long delta);
2025-06-27 13:19:13 +08:00
//集合
2025-06-26 13:02:00 +08:00
/**
* 将指定的值添加到集合中
*
* @param key
* @param value
*/
void addToSet(String key, String value);
/**
* 判断指定的值是否是集合的成员
*
* @param key
* @param value
* @return 如果是集合的成员返回 true否则返回 false
*/
boolean isSetMember(String key, String value);
2025-06-27 13:19:13 +08:00
//列表
2025-06-26 13:02:00 +08:00
/**
* 将指定的值添加到列表中
*
* @param key
* @param value
*/
void addToList(String key, String value);
/**
* 获取列表中指定索引的值
*
* @param key
* @param index 索引
* @return
*/
String getFromList(String key, int index);
2025-06-27 13:19:13 +08:00
//映射/哈希
2025-06-26 13:02:00 +08:00
/**
* 获取Map
*
* @param key
* @return
*/
<K, V> RMap<K, V> getMap(String key);
/**
* 将指定的键值对添加到哈希表中
*
* @param key
* @param field 字段
* @param value
*/
void addToMap(String key, String field, String value);
/**
* 获取哈希表中指定字段的值
*
* @param key
* @param field 字段
* @return
*/
String getFromMap(String key, String field);
/**
* 获取哈希表中指定字段的值
*
* @param key
* @param field 字段
* @return
*/
<K, V> V getFromMap(String key, K field);
2025-06-27 13:19:13 +08:00
//有序集合
2025-06-26 13:02:00 +08:00
/**
* 将指定的值添加到有序集合中
*
* @param key
* @param value
*/
void addToSortedSet(String key, String value);
2025-06-27 13:19:13 +08:00
//分布式同步原语
2025-06-26 13:02:00 +08:00
/**
* 获取 Redis 可重入锁
*
* @param key
* @return Lock
*/
RLock getLock(String key);
/**
* 获取 Redis 公平锁
*
* @param key
* @return Lock
*/
RLock getFairLock(String key);
/**
* 获取 Redis 读写锁
*
* @param key
* @return RReadWriteLock
*/
RReadWriteLock getReadWriteLock(String key);
/**
* 获取 Redis 信号量
*
* @param key
* @return RSemaphore
*/
RSemaphore getSemaphore(String key);
/**
* 获取 Redis 过期信号量
* <p>
* 基于Redis的Redisson的分布式信号量SemaphoreJava对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法
* 同时还提供了异步Async反射式Reactive和RxJava2标准的接口
*
* @param key
* @return RPermitExpirableSemaphore
*/
RPermitExpirableSemaphore getPermitExpirableSemaphore(String key);
/**
* 闭锁
*
* @param key
* @return RCountDownLatch
*/
RCountDownLatch getCountDownLatch(String key);
2025-06-27 13:19:13 +08:00
//实现分布式锁
Boolean setNx(String key);
Boolean setNx(String key, long expired, TimeUnit timeUnit);
//布隆过滤器
2025-06-26 13:02:00 +08:00
/**
2025-06-27 13:19:13 +08:00
* 布隆过滤器 海量元素去重或判定可能存在
2025-06-26 13:02:00 +08:00
*
* @param key
* @param <T> 存放对象
* @return 返回结果
*/
<T> RBloomFilter<T> getBloomFilter(String key);
2025-06-27 13:19:13 +08:00
//位图
2025-06-26 13:02:00 +08:00
RBitSet getBitSet(String key);
/**
* 将userId 映射到一个哈希值指定需存入位图的位置
* @param userId
* @return
*/
2025-06-26 13:02:00 +08:00
default int getIndexFromUserId(String userId) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashBytes = md.digest(userId.getBytes(StandardCharsets.UTF_8));
// 将哈希字节数组转换为正整数
BigInteger bigInt = new BigInteger(1, hashBytes);
// 取模以确保索引在合理范围内
return bigInt.mod(BigInteger.valueOf(Integer.MAX_VALUE)).intValue();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 algorithm not found", e);
}
}
}