当前位置: 首页 > news >正文

redisson功能完整指南

Redisson功能完整指南

目录

  1. 分布式锁和同步工具
  2. 分布式数据结构
  3. 原子操作和计数器
  4. 分布式对象和缓存
  5. 消息和发布订阅
  6. 高级数据结构
  7. 分布式服务
  8. 事务和批处理
  9. 地理空间数据
  10. 时间序列数据

一、分布式锁和同步工具

1.1 RLock(可重入分布式锁)

@Service
public class InventoryService {@Autowiredprivate RedissonClient redissonClient;public boolean reduceInventory(String productId, int quantity) {RLock lock = redissonClient.getLock("inventory:lock:" + productId);try {// 尝试获取锁,最多等待10秒,锁30秒后自动释放if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {// 执行库存扣减逻辑int currentInventory = getCurrentInventory(productId);if (currentInventory >= quantity) {updateInventory(productId, currentInventory - quantity);return true;}return false;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}return false;}
}

1.2 RReadWriteLock(分布式读写锁)

@Service
public class DocumentService {@Autowiredprivate RedissonClient redissonClient;// 读操作 - 多个线程可以同时读public String readDocument(String documentId) {RReadWriteLock rwLock = redissonClient.getReadWriteLock("document:lock:" + documentId);RLock readLock = rwLock.readLock();try {if (readLock.tryLock(10, TimeUnit.SECONDS)) {// 多个读操作可以并发执行return performDocumentRead(documentId);}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (readLock.isHeldByCurrentThread()) {readLock.unlock();}}return null;}// 写操作 - 独占锁,写时不允许读public boolean updateDocument(String documentId, String content) {RReadWriteLock rwLock = redissonClient.getReadWriteLock("document:lock:" + documentId);RLock writeLock = rwLock.writeLock();try {if (writeLock.tryLock(10, TimeUnit.SECONDS)) {// 写操作是独占的,执行时会阻塞所有读写操作performDocumentWrite(documentId, content);return true;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (writeLock.isHeldByCurrentThread()) {writeLock.unlock();}}return false;}
}

1.3 RFairLock(公平分布式锁)

@Service
public class TicketBookingService {@Autowiredprivate RedissonClient redissonClient;// 公平锁确保按照请求顺序获取锁,避免线程饥饿public boolean bookTicket(String eventId, String userId) {RFairLock fairLock = redissonClient.getFairLock("ticket:booking:" + eventId);try {// 公平锁会按照请求的时间顺序分配锁if (fairLock.tryLock(30, 60, TimeUnit.SECONDS)) {// 检查票务余量int availableTickets = getAvailableTickets(eventId);if (availableTickets > 0) {// 预订票务reserveTicket(eventId, userId);updateAvailableTickets(eventId, availableTickets - 1);return true;}return false;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (fairLock.isHeldByCurrentThread()) {fairLock.unlock();}}return false;}
}

1.4 RSemaphore(分布式信号量)

@Service
public class DownloadService {@Autowiredprivate RedissonClient redissonClient;public boolean downloadFile(String fileId) {RSemaphore semaphore = redissonClient.getSemaphore("download:limit");semaphore.trySetPermits(5); // 最多允许5个并发下载try {if (semaphore.tryAcquire(2, TimeUnit.SECONDS)) {try {// 执行文件下载逻辑performDownload(fileId);return true;} finally {semaphore.release();}}return false;} catch (InterruptedException e) {Thread.currentThread().interrupt();return false;}}
}

二、分布式数据结构

2.1 RMap(分布式Map)

@Service
public class UserSessionService {@Autowiredprivate RedissonClient redissonClient;public void saveUserSession(String userId, UserSession session) {RMap<String, UserSession> sessionMap = redissonClient.getMap("user:sessions");sessionMap.put(userId, session);sessionMap.expire(Duration.ofHours(2)); // 2小时过期}public UserSession getUserSession(String userId) {RMap<String, UserSession> sessionMap = redissonClient.getMap("user:sessions");return sessionMap.get(userId);}public void removeUserSession(String userId) {RMap<String, UserSession> sessionMap = redissonClient.getMap("user:sessions");sessionMap.remove(userId);}
}

2.2 RQueue(分布式队列)

@Service
public class OrderProcessingService {@Autowiredprivate RedissonClient redissonClient;// 生产者:添加订单到队列public void submitOrder(Order order) {RQueue<Order> orderQueue = redissonClient.getQueue("orders:processing");orderQueue.offer(order);}// 消费者:处理订单队列@Scheduled(fixedDelay = 1000)public void processOrders() {RQueue<Order> orderQueue = redissonClient.getQueue("orders:processing");Order order = orderQueue.poll();if (order != null) {processOrder(order);}}
}

2.3 RDelayedQueue(延时队列)

@Service
public class DelayedNotificationService {@Autowiredprivate RedissonClient redissonClient;public void scheduleNotification(String message, int delayMinutes) {RQueue<String> destinationQueue = redissonClient.getQueue("notifications:destination");RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(destinationQueue);// 延时指定分钟后发送通知delayedQueue.offer(message, delayMinutes, TimeUnit.MINUTES);}@Scheduled(fixedDelay = 5000)public void processNotifications() {RQueue<String> destinationQueue = redissonClient.getQueue("notifications:destination");String message = destinationQueue.poll();if (message != null) {sendNotification(message);}}
}

三、原子操作和计数器

3.1 RAtomicLong(原子长整型)

@Service
public class StatisticsService {@Autowiredprivate RedissonClient redissonClient;public long incrementPageViews(String pageId) {RAtomicLong pageViews = redissonClient.getAtomicLong("page:views:" + pageId);return pageViews.incrementAndGet();}public long getPageViews(String pageId) {RAtomicLong pageViews = redissonClient.getAtomicLong("page:views:" + pageId);return pageViews.get();}public void resetPageViews(String pageId) {RAtomicLong pageViews = redissonClient.getAtomicLong("page:views:" + pageId);pageViews.set(0);}
}

3.2 RLongAdder(长整型累加器)

@Service
public class HighConcurrencyCounterService {@Autowiredprivate RedissonClient redissonClient;public void incrementCounter(String eventType) {RLongAdder counter = redissonClient.getLongAdder("events:" + eventType);counter.increment();}public long getEventCount(String eventType) {RLongAdder counter = redissonClient.getLongAdder("events:" + eventType);return counter.sum();}
}

四、分布式对象和缓存

4.1 RBucket(分布式对象桶)

@Service
public class ConfigurationService {@Autowiredprivate RedissonClient redissonClient;public void saveConfig(String key, Object config) {RBucket<Object> bucket = redissonClient.getBucket("config:" + key);bucket.set(config, Duration.ofDays(1)); // 1天过期}@SuppressWarnings("unchecked")public <T> T getConfig(String key, Class<T> type) {RBucket<T> bucket = redissonClient.getBucket("config:" + key);return bucket.get();}public boolean configExists(String key) {RBucket<Object> bucket = redissonClient.getBucket("config:" + key);return bucket.isExists();}
}

4.2 RMapCache(带过期时间的Map)

@Service
public class TokenService {@Autowiredprivate RedissonClient redissonClient;public void storeToken(String userId, String token, Duration expiry) {RMapCache<String, String> tokenCache = redissonClient.getMapCache("user:tokens");tokenCache.put(userId, token, expiry.toMillis(), TimeUnit.MILLISECONDS);}public String getToken(String userId) {RMapCache<String, String> tokenCache = redissonClient.getMapCache("user:tokens");return tokenCache.get(userId);}public void invalidateToken(String userId) {RMapCache<String, String> tokenCache = redissonClient.getMapCache("user:tokens");tokenCache.remove(userId);}
}

五、消息和发布订阅

5.1 RTopic(主题发布订阅)

@Service
public class EventPublisher {@Autowiredprivate RedissonClient redissonClient;public void publishEvent(String eventType, Object eventData) {RTopic topic = redissonClient.getTopic("events:" + eventType);topic.publish(eventData);}
}@Component
public class EventSubscriber {@Autowiredprivate RedissonClient redissonClient;@PostConstructpublic void subscribeToEvents() {RTopic topic = redissonClient.getTopic("events:user");topic.addListener(String.class, (channel, message) -> {System.out.println("收到用户事件: " + message);handleUserEvent(message);});}
}

六、高级数据结构

6.1 RBloomFilter(布隆过滤器)

@Service
public class DuplicateCheckService {@Autowiredprivate RedissonClient redissonClient;@PostConstructpublic void initBloomFilter() {RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("duplicate:check");// 初始化布隆过滤器:预期插入100万个元素,错误率0.03bloomFilter.tryInit(1000000L, 0.03);}public boolean mightContain(String item) {RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("duplicate:check");return bloomFilter.contains(item);}public void addItem(String item) {RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("duplicate:check");bloomFilter.add(item);}
}

6.2 RRateLimiter(分布式限流器)

@Service
public class ApiRateLimiter {@Autowiredprivate RedissonClient redissonClient;public boolean isAllowed(String apiKey) {RRateLimiter rateLimiter = redissonClient.getRateLimiter("api:limit:" + apiKey);// 设置每秒最多10个请求rateLimiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);// 尝试获取1个许可return rateLimiter.tryAcquire(1);}
}

Redisson功能总结表

分布式锁类型对比

锁类型特点适用场景
RLock可重入、支持超时一般业务操作
RReadWriteLock读写分离读多写少场景
RFairLock公平获取锁避免线程饥饿
RMultiLock同时锁定多个资源防止死锁的资源操作
RRedLock高安全性关键业务操作
RSpinLock减少线程切换短时间持有的操作
RFencedLock版本控制需要检测锁有效性

数据结构特点

  • RMap: 分布式HashMap,支持过期时间
  • RQueue: 分布式队列,支持阻塞操作
  • RDelayedQueue: 延时队列,适用于定时任务
  • RAtomicLong: 原子计数器,支持高并发
  • RBloomFilter: 布隆过滤器,快速去重检测
  • RRateLimiter: 限流器,API限流控制
  • RGeo: 地理位置数据,支持距离计算
  • RTimeSeries: 时间序列数据,适用于监控指标

最佳实践建议

  1. 选择合适的锁类型:根据业务场景选择最适合的锁
  2. 设置合理的超时时间:避免死锁和长时间等待
  3. 正确释放资源:使用try-finally确保锁被释放
  4. 监控性能指标:关注锁的竞争情况和持有时间
  5. 合理使用缓存:根据数据访问模式选择缓存策略

七、分布式服务

7.1 RExecutorService(分布式执行器)

@Service
public class DistributedTaskService {@Autowiredprivate RedissonClient redissonClient;public void executeDistributedTask() {RExecutorService executor = redissonClient.getExecutorService("distributed:tasks");// 提交任务到分布式执行器executor.submit(() -> {System.out.println("执行分布式任务: " + Thread.currentThread().getName());// 执行实际的业务逻辑performBusinessLogic();return "任务完成";});}
}

八、事务和批处理

8.1 RBatch(批处理操作)

@Service
public class BatchOperationService {@Autowiredprivate RedissonClient redissonClient;public void batchUpdateUsers(List<User> users) {RBatch batch = redissonClient.createBatch();for (User user : users) {RMapAsync<String, User> userMapAsync = batch.getMap("users");userMapAsync.putAsync(user.getId(), user);RAtomicLongAsync counterAsync = batch.getAtomicLong("user:count");counterAsync.incrementAndGetAsync();}// 批量执行所有操作BatchResult<?> result = batch.execute();System.out.println("批处理完成,操作数: " + result.getResponses().size());}
}

九、地理空间数据

9.1 RGeo(地理空间数据结构)

@Service
public class LocationService {@Autowiredprivate RedissonClient redissonClient;public void addLocation(String locationId, double longitude, double latitude) {RGeo<String> geo = redissonClient.getGeo("locations");geo.add(longitude, latitude, locationId);}public List<String> findNearbyLocations(double longitude, double latitude, double radius) {RGeo<String> geo = redissonClient.getGeo("locations");return geo.radius(longitude, latitude, radius, GeoUnit.KILOMETERS);}public Double getDistance(String location1, String location2) {RGeo<String> geo = redissonClient.getGeo("locations");return geo.dist(location1, location2, GeoUnit.KILOMETERS);}
}

十、时间序列数据

10.1 RTimeSeries(时间序列)

@Service
public class MetricsService {@Autowiredprivate RedissonClient redissonClient;public void recordMetric(String metricName, double value) {RTimeSeries<String, Double> timeSeries = redissonClient.getTimeSeries(metricName);timeSeries.add(System.currentTimeMillis(), value);}public Map<Long, Double> getMetricRange(String metricName, long fromTime, long toTime) {RTimeSeries<String, Double> timeSeries = redissonClient.getTimeSeries(metricName);return timeSeries.range(fromTime, toTime);}
}

高级锁特性示例

锁的高级特性

@Service
public class AdvancedLockService {@Autowiredprivate RedissonClient redissonClient;// 展示锁的高级特性:可重入、超时、异步等public void demonstrateAdvancedFeatures(String resourceId) {RLock lock = redissonClient.getLock("advanced:lock:" + resourceId);try {// 1. 检查锁状态boolean isLocked = lock.isLocked();boolean isHeldByCurrentThread = lock.isHeldByCurrentThread();// 2. 获取锁信息long remainTimeToLive = lock.remainTimeToLive();// 3. 尝试获取锁并设置自动续期if (lock.tryLock(10, 300, TimeUnit.SECONDS)) {// 4. 锁的可重入特性recursiveOperation(resourceId, 3);}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 6. 安全释放锁if (lock.isHeldByCurrentThread()) {lock.unlock();}}}// 递归操作展示锁的可重入性private void recursiveOperation(String resourceId, int depth) {if (depth <= 0) return;RLock lock = redissonClient.getLock("advanced:lock:" + resourceId);try {// 同一线程可以多次获取同一个锁(可重入)if (lock.tryLock(5, TimeUnit.SECONDS)) {System.out.println("递归深度: " + depth + ", 持有计数: " + lock.getHoldCount());// 执行一些操作Thread.sleep(100);// 递归调用recursiveOperation(resourceId, depth - 1);}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}}
}

CMS系统综合应用示例

页面管理综合服务

@Service
public class EnhancedPageManagementService {@Autowiredprivate RedissonClient redissonClient;// 综合页面管理:使用多种Redisson功能public void managePageLifecycle(Long pageId) {// 1. 使用分布式锁确保操作原子性RLock lock = redissonClient.getLock("page:manage:" + pageId);try {if (lock.tryLock(10, TimeUnit.SECONDS)) {// 2. 增加页面处理计数RAtomicLong processCount = redissonClient.getAtomicLong("page:process:count");processCount.incrementAndGet();// 3. 更新页面状态到活跃集合RSet<Long> activePages = redissonClient.getSet("pages:active");activePages.add(pageId);// 4. 缓存页面配置RMapCache<String, Object> configCache = redissonClient.getMapCache("page:config");configCache.put("page:" + pageId, getPageConfig(pageId), Duration.ofHours(1));// 5. 发布页面变更事件RTopic statusTopic = redissonClient.getTopic("page:lifecycle:events");statusTopic.publish(Map.of("pageId", pageId, "action", "managed"));// 6. 添加到处理队列RQueue<Long> processQueue = redissonClient.getQueue("pages:process:queue");processQueue.offer(pageId);}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}}}
}
http://www.dtcms.com/a/365993.html

相关文章:

  • 【OpenGL】LearnOpenGL学习笔记19 - 几何着色器 Geometry Shader
  • 【机器学习深度学习】RAG边界处理策略
  • Vision Pro图像处理工具全解析
  • ClickHouse使用Docker部署
  • 刷新记录:TapData Oracle 日志同步性能达 80K TPS,重塑实时同步新标准
  • mysy2使用
  • Windows 开发环境这么难配,为什么还有那么多人在用?
  • Axure文件上传高保真交互原型:实现Web端真实上传体验
  • 机器能否真正语言?人工智能NLP面临的“理解鸿沟与突破
  • 深度学习---pytorch卷积神经网络保存和使用最优模型
  • awk相关知识
  • C++完美转发
  • 【FastDDS】Layer DDS之Domain ( 04-DomainParticipantFactory)
  • 专项智能练习(Photoshop软件基础)
  • 智能高效内存分配器测试报告
  • 【CMake】message函数
  • C++对象构造与析构
  • numpy meshgrid 转换成pygimli规则网格
  • cppreference_docs
  • 稳居全球TOP3:鹏辉能源“3+N” 布局,100Ah/50Ah等户储电芯产品筑牢市场优势
  • 【C++】Vector核心实现:类设计到迭代器陷阱
  • MySQL:表的约束上
  • C# 代码中的“熵增”概念
  • 单片机:GPIO、按键、中断、定时器、蜂鸣器
  • 《单链表经典问题全解析:5 大核心题型(移除元素 / 反转 / 找中点 / 合并 / 回文判断)实现与详解》
  • 【面试题】词汇表大小如何选择?
  • PS大神级AI建模技巧!效率翻倍工作流,悄悄收藏!
  • 本地化AI问答:告别云端依赖,用ChromaDB + HuggingFace Transformers 搭建离线RAG检索系统
  • OpenCV的阈值处理
  • ChartView的基本介绍与使用