Nodejs Node Redis 如何进行模糊查询

Nodejs Node Redis 如何进行模糊查询

如题,使用 node-redis 模块,请问可以进行模糊查询吗,如果可以怎么做?(本人使用正则表达式不通。。)

5 回复

当然可以!在使用 node-redis 模块时,虽然 Redis 本身并不直接支持模糊查询,但你可以通过一些 Redis 提供的命令来实现类似的功能。常见的方法是使用 KEYS 命令或 SCAN 命令来进行模式匹配。

使用 KEYS 命令

KEYS 命令可以让你通过模式匹配来查找所有的键。但是需要注意的是,KEYS 命令在生产环境中不推荐使用,因为它会阻塞 Redis 服务器,尤其是在数据量较大的情况下。

示例代码:

const redis = require('redis');
const client = redis.createClient();

client.keys('prefix:*', (err, keys) => {
    if (err) throw err;
    console.log(keys);
    // 使用这些键进行后续操作
    keys.forEach(key => {
        client.get(key, (err, value) => {
            if (err) throw err;
            console.log(`Key: ${key}, Value: ${value}`);
        });
    });
});

使用 SCAN 命令

SCAN 命令是更推荐的方法,因为它不会阻塞 Redis 服务器,并且可以在遍历大量键时分批处理。SCAN 命令需要一个游标作为参数,并返回一个新的游标和匹配的键列表。

示例代码:

const redis = require('redis');
const client = redis.createClient();

function scanKeys(pattern, cursor = '0') {
    return new Promise((resolve, reject) => {
        client.scan(cursor, 'MATCH', pattern, 'COUNT', 10, (err, result) => {
            if (err) return reject(err);
            const [nextCursor, keys] = result;
            resolve({ nextCursor, keys });
        });
    });
}

async function findKeys(pattern) {
    let cursor = '0';
    let allKeys = [];
    
    do {
        const { nextCursor, keys } = await scanKeys(pattern, cursor);
        allKeys = allKeys.concat(keys);
        cursor = nextCursor;
    } while (cursor !== '0');

    console.log(allKeys);
    // 使用这些键进行后续操作
    allKeys.forEach(key => {
        client.get(key, (err, value) => {
            if (err) throw err;
            console.log(`Key: ${key}, Value: ${value}`);
        });
    });
}

findKeys('prefix:*').catch(console.error);

总结

  • KEYS 命令简单易用,但在大数据量时可能会导致性能问题。
  • SCAN 命令更高效,适用于生产环境中的大规模数据查询。

选择适合你需求的方法进行模糊查询即可。


这个能行的通吗?key-value本身就不支持,node再强大也无能啊。有没有高人做个研究啊……

redis的keys命令支持的哦 http://manual.csser.com/redis/key/keys.html 在node群里问了下才知道的

用key查询不能算是模糊查询,只是扫描了一遍keys,像mogondb或者sql对内容的查询才是模糊查询。

在 Node.js 中使用 node-redis 模块对 Redis 进行模糊查询并不是直接支持的功能,因为 Redis 本身并不提供内置的模糊查询功能。但是,你可以通过一些间接的方法来实现类似的功能。

方法一:使用 KEYS 命令

Redis 提供了一个 KEYS 命令,它可以根据模式匹配返回所有的键。例如,如果你想找到所有以 user: 开头的键,可以这样做:

const redis = require('redis');
const client = redis.createClient();

client.keys('user:*', (err, keys) => {
  if (err) throw err;
  console.log(keys);
});

方法二:使用 SCAN 命令

KEYS 命令虽然简单易用,但在数据量较大时可能会导致性能问题,因为它会阻塞 Redis 服务器。因此,推荐使用 SCAN 命令,它是一个非阻塞的迭代器命令,适用于大数据集。

const redis = require('redis');
const client = redis.createClient();

async function scanPattern(pattern) {
  const stream = client.scanStream({ match: pattern });
  stream.on('data', (keys) => {
    // 处理找到的键
    console.log(keys);
  });
}

scanPattern('user:*');

方法三:自定义索引

如果你需要更复杂的查询逻辑,可以在插入数据时创建一个额外的数据结构来存储键的索引,例如使用哈希表或有序集合。

// 插入数据时
client.hset('user:index', 'user1', 'user:user1');
client.hset('user:index', 'user2', 'user:user2');

// 查询时
client.hgetall('user:index', (err, data) => {
  if (err) throw err;
  for (let key in data) {
    console.log(data[key]);
  }
});

总结

Redis 本身不支持直接的模糊查询,但可以通过 KEYSSCAN 命令来实现简单的模式匹配。对于更复杂的需求,建议使用自定义索引或其他数据结构来实现。

回到顶部