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 这个接口,不用关心用的是 Redisson、Lettuce 还是别的。 */ public interface IRedisService { //基本 KV /** * 设置指定 key 的值 * * @param key 键 * @param value 值 */ void setValue(String key, T value); /** * 设置指定 key 的值 * * @param key 键 * @param value 值 * @param expired 过期时间 */ void setValue(String key, T value, long expired); /** * 获取指定 key 的值 * * @param key 键 * @return 值 */ T getValue(String key); /** * 移除指定 key 的值 * * @param key 键 */ void remove(String key); /** * 判断指定 key 的值是否存在 * * @param key 键 * @return true/false */ boolean isExists(String key); //队列 /** * 获取普通队列 非阻塞的先进先出队列 * * @param key 键 * @param 泛型 * @return 队列 */ RQueue getQueue(String key); /** * 加锁队列 消费者可以阻塞等待队列元素。 * * @param key 键 * @param 泛型 * @return 队列 */ RBlockingQueue getBlockingQueue(String key); /** * 延迟队列 把消息延后放到阻塞队列中,适合定时任务、重试机制。 * * @param rBlockingQueue 加锁队列 * @param 泛型 * @return 队列 */ RDelayedQueue getDelayedQueue(RBlockingQueue rBlockingQueue); //数值计数器,原子自增/自减计数器,适合做分布式编号、PV/UV 统计、限流计数等。 /** * 设置值 * * @param key key 键 * @param value 值 */ void setAtomicLong(String key, long value); /** * 获取值 * * @param key key 键 */ Long getAtomicLong(String key); /** * 自增 Key 的值;1、2、3、4 * * @param key 键 * @return 自增后的值 */ long incr(String key); /** * 指定值,自增 Key 的值;1、2、3、4 * * @param key 键 * @return 自增后的值 */ long incrBy(String key, long delta); /** * 自减 Key 的值;1、2、3、4 * * @param key 键 * @return 自增后的值 */ long decr(String key); /** * 指定值,自增 Key 的值;1、2、3、4 * * @param key 键 * @return 自增后的值 */ long decrBy(String key, long delta); //集合 /** * 将指定的值添加到集合中 * * @param key 键 * @param value 值 */ void addToSet(String key, String value); /** * 判断指定的值是否是集合的成员 * * @param key 键 * @param value 值 * @return 如果是集合的成员返回 true,否则返回 false */ boolean isSetMember(String key, String value); //列表 /** * 将指定的值添加到列表中 * * @param key 键 * @param value 值 */ void addToList(String key, String value); /** * 获取列表中指定索引的值 * * @param key 键 * @param index 索引 * @return 值 */ String getFromList(String key, int index); //映射/哈希 /** * 获取Map * * @param key 键 * @return 值 */ RMap 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 值 */ V getFromMap(String key, K field); //有序集合 /** * 将指定的值添加到有序集合中 * * @param key 键 * @param value 值 */ void addToSortedSet(String key, String value); //分布式同步原语 /** * 获取 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 过期信号量 *

* 基于Redis的Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。 * 同时还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。 * * @param key 键 * @return RPermitExpirableSemaphore */ RPermitExpirableSemaphore getPermitExpirableSemaphore(String key); /** * 闭锁 * * @param key 键 * @return RCountDownLatch */ RCountDownLatch getCountDownLatch(String key); //实现分布式锁 Boolean setNx(String key); Boolean setNx(String key, long expired, TimeUnit timeUnit); //布隆过滤器 /** * 布隆过滤器 ,海量元素去重或判定“可能存在” * * @param key 键 * @param 存放对象 * @return 返回结果 */ RBloomFilter getBloomFilter(String key); //位图 RBitSet getBitSet(String key); /** * 将userId 映射到一个哈希值,指定需存入位图的位置 * @param userId * @return */ 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); } } }