springboot使用scan命令实现redis模糊匹配分页查询(附代码)

本文介绍如何使用Redis的SCAN命令进行模糊匹配和分页查询,通过游标机制避免系统阻塞,提升数据检索效率。适用于需要高效查询大量数据的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.scan前言

  • 从Redis v2.8开始,SCAN命令已经可用,它允许使用游标从keyspace中检索键。
    对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险,从而也让一些操作可以放在主节点上执行。

二. 需求说明

  • 公司项目是内网系统,没有并发量,由于第三方接口响应太慢,该接口的数据需频繁查询使用。所以以效率换内存空间,于是就有了将接口数据的所需字段存入redis中。

三.使用scan命令实现redis模糊匹配分页查询

  • 根据查询关键字分页获取key集合
/**
     * 根据查询关键字分页获取key集合
     * @param patternKey 查询关键字,模糊匹配的key
     * @param pageNum 页号
     * @param pageSize 页大小
     * @return 匹配到的keys
     */
    private List<String> findKeysForPage(String patternKey, int pageNum, int pageSize) {
        ScanOptions options = ScanOptions.scanOptions().match(patternKey).count(10000).build();
        RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
        RedisConnection rc = factory.getConnection();
        Cursor<byte[]> cursor = rc.scan(options);
        List<String> result = new ArrayList<String>(pageSize);
        int tmpIndex = 0;
        int startIndex = (pageNum - 1) * pageSize;  // 开始节点
        int end = pageNum * pageSize;   // 去redis中找的次数,结束节点
        while (cursor.hasNext()) {
            if (tmpIndex >= startIndex && tmpIndex < end) {
                byte[] key = cursor.next();
                if (key == null || key.length == 0) {
                    break;
                }
                String keyStr = new String(key);
                result.add(keyStr);
                tmpIndex++;
                continue;
            }
            // 要获取总条数, 就注释掉
            if (tmpIndex >= end) {
                break;
            }

            tmpIndex++;
            cursor.next();
        }
        try {
            cursor.close();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("cursor.close(); redis连接关闭异常 {}", e.getMessage());
        }

        try {
            RedisConnectionUtils.releaseConnection(rc, factory);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(" RedisConnectionUtils.releaseConnection(rc, factory); redis连接关闭异常 {}", e.getMessage());
        }
        return result;
    }
  • 根据keys获取数据列表
/**
     * 根据keys获取数据列表
     * @param keyList
     * @return List
     */
    public List getListByKeys(List keyList) {
        return redisTemplate.opsForValue().multiGet(keys);
    }
<think>嗯,用户想了解如何将Spring Boot服务部署到ARM架构的开发板上,并实现蓝牙数据的收发。首先,我需要理清楚整个流程的大致步骤,可能用户对Spring Boot和ARM开发板有一定的了解,但具体操作步骤可能不太清楚。 首先,用户可能已经有一个ARM开发板,比如树莓派或者类似的设备,这些通常运行Linux系统,比如Raspbian或Ubuntu。所以第一步应该是确保开发板的系统是准备好的,安装必要的依赖,比如Java环境,因为Spring Boot是基于Java的。需要确认用户使用的JDK版本是否支持ARM架构,现在大多数JDK都有ARM版本,比如OpenJDK或者Oracle的版本。 接下来,Spring Boot应用的打包。通常Spring Boot会打包成可执行的JAR文件,但需要考虑ARM架构下的兼容性。用户可能需要用Maven或Gradle构建项目时指定正确的平台,或者确保所有依赖库都有ARM的支持。这里可能需要交叉编译或者在ARM设备上直接构建,不过交叉编译可能复杂一些,建议在ARM设备上直接编译,避免兼容性问题。 然后是将打包好的JAR文件部署到开发板上,可以通过SCP或者FTP等方式传输。之后运行JAR文件,可能需要调整启动参数,比如指定端口或者配置文件的位置,特别是如果蓝牙服务需要特定的配置的话。 接下来是蓝牙数据收发的实现。这里可能需要使用Linux下的蓝牙工具,比如bluez栈,或者使用Java库来操作蓝牙。Java的话,可能需要依赖像BlueCove这样的库,不过BlueCove在ARM上的支持可能会有问题,或者版本不兼容。另外,可能需要直接调用系统命令,比如使用hciconfig、hcitool、rfcomm等工具,或者通过DBus与蓝牙服务交互。 另一个可能性是使用Python脚本或其他语言编写蓝牙通信部分,然后通过Spring Boot调用外部脚本。这种方法可能更灵活,特别是如果Java的蓝牙库支持有限的话。需要考虑到进程管理和数据传递的方式,比如通过标准输入输出或者Socket通信。 用户可能需要配置蓝牙设备,启用SPP(串行端口协议)或者BLE(蓝牙低功耗),这取决于具体的硬件和需求。如果是SPP,可能需要配置RFCOMM通道,创建虚拟串口,然后通过Java的串口通信库如RXTX来读写数据。但RXTX在ARM上的安装和配置可能需要额外步骤,比如安装本地库。 另外,权限问题也是一个需要注意的地方。运行Spring Boot应用的用户是否有权限访问蓝牙设备?可能需要将用户加入bluetooth组,或者调整sudoers设置,避免需要root权限运行。 还有,蓝牙服务的稳定性需要考虑,比如自动重连、错误处理等。Spring Boot应用中可能需要编写服务层来管理蓝牙连接,处理数据接收和发送,可能需要多线程或者异步处理,以避免阻塞主应用。 测试环节也很重要,用户可能需要先单独测试蓝牙功能,再集成到Spring Boot中。例如,使用命令行工具发送和接收数据,确保硬件和基础配置没问题,然后再处理应用层的逻辑。 可能遇到的挑战包括:蓝牙库在Java中的支持不足,需要依赖本地库或外部程序;ARM架构下的性能问题,尤其是如果处理大量数据时;以及跨平台编译的复杂性。这时候可能需要分步骤指导用户,先确保Java环境正确,再处理蓝牙配置,最后整合到Spring Boot应用中。 总结一下,步骤大概是:准备ARM开发板环境(安装Java,配置蓝牙工具),编写或调整Spring Boot应用以支持蓝牙通信(可能通过外部调用或特定Java库),打包部署应用,处理权限和依赖问题,测试蓝牙功能,最后集成到服务中。需要详细说明每个步骤的具体操作,以及可能遇到的问题和解决方法。将</think>Spring Boot服务部署到ARM架构开发板(如树莓派、Rock Pi等)并实现蓝牙数据收发,需结合嵌入式Linux环境配置、Java应用部署及蓝牙协议开发。以下是分步骤指南: --- ### **1. 环境准备** - **开发板系统配置** - 安装ARM兼容的Linux系统(如Raspbian、Ubuntu Core)。 - 更新系统:`sudo apt update && sudo apt upgrade` - 安装Java环境: ```bash sudo apt install openjdk-17-jdk # 根据Spring Boot版本选择JDK ``` - **蓝牙驱动与工具** - 安装蓝牙协议栈BlueZ: ```bash sudo apt install bluez bluez-tools bluetooth ``` - 启动蓝牙服务: ```bash sudo systemctl start bluetooth sudo systemctl enable bluetooth ``` --- ### **2. Spring Boot应用开发** - **项目依赖** 在`pom.xml`中添加必要依赖(如Web、数据处理库),若需操作蓝牙硬件,可能需要调用本地命令或集成JNI库: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` - **打包为ARM兼容JAR** - 使用Maven/Gradle构建: ```bash mvn clean package -DskipTests ``` - 确保依赖的本地库(如通过JNI)支持ARM架构。 --- ### **3. 蓝牙通信实现** #### **方案一:调用系统命令(推荐)** 通过Java执行Linux蓝牙工具命令(如`hciconfig`, `bluetoothctl`, `gatttool`等),适合简单收发。 - **示例代码(扫描设备)**: ```java public String scanDevices() { try { Process process = Runtime.getRuntime().exec("hcitool scan"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); return reader.lines().collect(Collectors.joining("\n")); } catch (IOException e) { return "Scan failed: " + e.getMessage(); } } ``` #### **方案二:使用Java蓝牙库** - **BlueCove(可能需手动编译)** 部分老旧库可能不支持ARM,需自行交叉编译。 - **SmartGattLib(BLE专用)** 适合低功耗蓝牙(BLE)协议。 #### **方案三:Python脚本桥接** 用Python脚本处理蓝牙通信(通过`pybluez`库),Spring Boot调用脚本: ```python # ble_scan.py import bluetooth print(bluetooth.discover_devices()) ``` Java调用: ```java Process process = Runtime.getRuntime().exec("python3 ble_scan.py"); ``` --- ### **4. 部署与运行** - **传输JAR文件到开发板** 使用`scp`或SFTP工具: ```bash scp target/your-ip:/home/user ``` - **运行应用** ```bash java -jar your-app.jar ``` -aG bluetooth pi # 将用户加入bluetooth组 ``` --- ### **5. 蓝牙数据收发示例(基于RFCOMM)** - **配置RFCOMM服务** 修改`/etc/bluetooth/rfcomm.conf`,绑定设备为虚拟串口: ```conf rfcomm0 { bind yes; device 00:11:22:33:44:55; # 目标设备地址 channel 1; } ``` 重启服务: ```bash sudo rfcomm bind rfcomm0 ``` - **Java读取串口数据** 使用`RXTX`或`jSerialComm`库: ```java import com.fazecast.jSerialComm.*; public class SerialReader { public static void main(String[] args) { SerialPort port = SerialPort.getCommPort("/dev/rfcomm0"); port.openPort(); port.addDataListener(new SerialPortDataListener() { @Override public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; } @Override public void serialEvent(SerialPortEvent event) { byte[] data = new byte[port.bytesAvailable()]; port.readBytes(data, data.length); System.out.println("Received: " + new String(data)); } }); } } ``` --- ### **6. 调试与优化** - **日志监控** 使用`journalctl`查看蓝牙服务日志: ```bash journalctl - **防火墙与端口** 确保开发板防火墙开放Spring Boot应用端口(默认8080)。 - **资源限制** ARM设备资源有限,优化JVM参数: ```bash java -Xmx256m -Xms128m -jar your-app.jar ``` --- ### **常见问题** 1. **蓝牙权限不足** 解决方案:将用户加入`bluetooth`组,或使用`sudo`运行应用。 2. **Java库兼容性** 测试依赖库在ARM的兼容性,优先选用纯Java实现或已验证的本地库。 3. **连接不稳定** 增加重试机制,或使用心跳包保持长连接。 通过以上步骤,可实现Spring Boot在ARM开发板上的部署及蓝牙数据交互。实际开发中需根据硬件型号调整驱动和协议细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值