uni-app 使用支付宝小程序云时 redis服务提示无法使用keys

发布于 1周前 作者 bupafengyu 来自 uni-app

uni-app 使用支付宝小程序云时 redis服务提示无法使用keys

产品分类

uniCloud/支付宝小程序云

示例代码

redis.keys(‘abc*’)

操作步骤

预期结果

实际结果

无法使用keys模糊搜索模式

bug描述

“data”: { “errDetail”: (忽略部分内容)User Function Code Logic Error, Please Check Function Code: 400: {“code”:“400”,“message”:“error: ERR unknown command ‘KEYS’. stack: ReplyError: ERR unknown command ‘KEYS’ at /var/task/code/@common_modules/uni-cloud-redis/index.js:1:31090 at _ (/var/task/code/@common_modules/uni-cloud-redis/index.js:1:31099)”}, “errCode”: “40000”, “errMsg”: “用户函数代码语法或逻辑异常” }


3 回复

我也遇到了,然后我改成用scan()替代。但是得循环非常多次才能读完,QPS时不时会爆,勉强用着。


支付宝云不支持keys命令,生产环境建议试用scan代替keys命令。

在uni-app中使用支付宝小程序云提供的Redis服务时,如果遇到keys命令无法使用的情况,这通常是因为支付宝小程序云对Redis的某些命令进行了限制或优化,以提高性能和安全性。keys命令由于会扫描整个数据库,可能导致性能问题,因此很多托管Redis服务会限制或不建议使用。

为了绕过这个限制,并有效管理Redis中的键,你可以考虑以下几种替代方案,这里提供相关的代码示例,主要使用Redis的SCAN命令来替代keys

使用SCAN命令替代keys

SCAN命令是一个基于游标的迭代器,用于逐步迭代一组键,相比于keys,它更加高效且不会阻塞Redis服务器。

示例代码(Node.js环境)

假设你已经在uni-app后端(可能是Node.js环境)中连接到了支付宝小程序云的Redis服务,以下是如何使用SCAN命令的示例:

const redis = require('redis');
const client = redis.createClient({
    // 配置你的Redis连接信息
    host: 'your-redis-host',
    port: 6379,
    password: 'your-redis-password'
});

async function scanKeys(pattern = '*', count = 10) {
    let cursor = '0';
    let keys = [];

    do {
        const [replyCursor, replyKeys] = await new Promise((resolve, reject) => {
            client.scan(cursor, { MATCH: pattern, COUNT: count }, (err, res) => {
                if (err) reject(err);
                resolve(res);
            });
        });

        cursor = replyCursor;
        keys = keys.concat(replyKeys);
    } while (cursor !== '0');

    return keys;
}

// 使用示例
scanKeys('*myPattern*').then(keys => {
    console.log('Found keys:', keys);
}).catch(err => {
    console.error('Error scanning keys:', err);
});

注意事项

  1. 性能考虑:虽然SCANkeys更友好,但在大数据集上仍然可能涉及多次迭代,影响性能。
  2. 错误处理:确保在生产代码中妥善处理Redis连接和命令执行中的错误。
  3. 连接管理:根据应用需求管理Redis连接池,避免资源泄露。

通过上述方法,你可以在uni-app中有效地使用Redis服务,同时避免直接使用keys命令可能带来的问题。

回到顶部