SpringBoot中RedisCluster的scan命令实践

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 线上环境redis key过期一直很头疼,自动过期用户可能会给用户展示过期数据无法忍受,可是又无法掌握固定的key,redis给我们提供了高性能的scan操作,可千万不能用keys * 了!SpringBoot2.0升级使用lettuce替换了jedis为默认的reids连接工具。

为什么要用 scan 获取key

redis作为缓存服务应用非常广泛,保证应用有较强的响应性能缓存是会大量使用的,同时也就造成了redis中的缓存key非常之多,集群中几十万key更是常有,由于redis是单线程模型应用(redis并不是单线程,只是某个阶段只有一个线程,命令接收、命令处理、结果响应都是各一个线程)一个复杂操作直接会阻塞后续命令的执行,于是诞生了scan命令。

什么场景使用

对缓存key进行批量过期但是无法知道具体的key值,此时可以使用scan扫描出具体key后进行统一过期。

如何使用

之前在网上找了很多关于springboot reidsTemplete的scan操作代码,遗憾的是有很多操作都是无法在集群环境进行scan操作的。

上面咱们有有说到springboot2.0后使用lettuce作为redis连接工具,lettuce十分强大并且已经实现RedisCluster的scan操作(底层实现是逐个扫描分片),已阅读源代码,同时支持单机、主从及集群模式。

直接上代码

Set<String> keys = redisTemplate.execute((RedisConnection connection) -> {
    Set<String> keySet = CollUtil.newHashSet();
    //定义起始游标,获取lettuce原生引用,定义scan参数
    ScanCursor scanCursor = ScanCursor.INITIAL;
    RedisKeyAsyncCommands commands = (RedisKeyAsyncCommands) connection.getNativeConnection();
    ScanArgs scanArgs = ScanArgs.Builder.limit(1000).match(patternKey);
    try {
        do {
            //最少scan一次,当返回不为空时将扫描到的key添加到统一key列表中
            KeyScanCursor<byte[]> keyScanCursor = (KeyScanCursor) commands.scan(scanCursor, scanArgs).get();
            if (keyScanCursor != null) {
                if (CollUtil.isNotEmpty(keyScanCursor.getKeys())) {
                    keyScanCursor.getKeys().forEach(b -> keySet.add(new String(b)));
                }
                scanCursor = keyScanCursor;
            } else {
                scanCursor = ScanCursor.FINISHED;
            }
        } while (!scanCursor.isFinished());
    } catch (Exception e) {
        LOG.error("redisClient scanKey fail patternKey:[{}]", patternKey, e);
    }
    return keySet;
});
目录
相关文章
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
847 0
|
6月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
785 0
|
6月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
193 0
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
831 2
|
6月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
1752 2
|
8月前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
1457 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
10月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
553 5
|
11月前
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
299 5
|
11月前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
528 5
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
268 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。

热门文章

最新文章