有人使用过memcached没? Nodejs环境下如何集成和使用

有人使用过memcached没? Nodejs环境下如何集成和使用

memcached可不可以按条件模糊查找?

比如说我的key为abc_123,abc_234,abc_345 我搜索abc就能把这三条数据全部查询到,且效率不低?

2 回复

当然可以!memcached 是一个高性能的分布式内存对象缓存系统,通常用于加速动态Web应用程序。虽然 memcached 本身并不支持复杂的查询操作,如模糊查找或通配符匹配,但它可以通过一些技巧来实现类似的功能。

如何在 Node.js 环境下集成和使用 Memcached

首先,你需要安装 node-memcached 模块来与 memcached 服务器进行交互。你可以通过 npm 安装该模块:

npm install memcached

接下来,我们来看一下如何连接到 memcached 并存储/检索数据。

示例代码

  1. 连接到 Memcached
const Memcached = require('memcached');
const memcached = new Memcached('localhost:11211');

// 检查连接是否成功
memcached.get('status', (err, data) => {
    if (err) throw err;
    console.log('Memcached is running:', data);
});
  1. 存储数据
const keyPrefix = 'abc_';

// 存储多个键值对
const keys = [
    { key: keyPrefix + '123', value: 'Data for abc_123' },
    { key: keyPrefix + '234', value: 'Data for abc_234' },
    { key: keyPrefix + '345', value: 'Data for abc_345' }
];

keys.forEach(keyObj => {
    memcached.set(keyObj.key, keyObj.value, 3600, (err) => {
        if (err) throw err;
        console.log(`Stored key ${keyObj.key}`);
    });
});
  1. 模糊查找数据

由于 memcached 不直接支持模糊查找,我们可以手动遍历所有可能的键,并检查它们是否存在。

function searchKeys(pattern) {
    memcached.keys((err, keys) => {
        if (err) throw err;

        const matchingKeys = keys.filter(key => key.startsWith(pattern));

        const results = {};
        matchingKeys.forEach(key => {
            memcached.get(key, (err, value) => {
                if (err) throw err;
                results[key] = value;
            });
        });

        console.log('Matching keys and values:', results);
    });
}

// 使用示例
searchKeys('abc_');

解释

  • 连接:使用 new Memcached('localhost:11211') 创建一个连接实例。
  • 存储数据:使用 memcached.set() 方法将数据存储到 memcached 中。
  • 模糊查找:通过遍历所有键并检查它们是否以指定模式开头来模拟模糊查找。这需要手动处理,但可以满足基本需求。

这种方法虽然不是最高效的方式,但在某些情况下可以满足你的需求。如果你需要更复杂的功能,可能需要考虑使用其他数据库系统,如 Redis,它提供了更多的查询功能。


在Node.js环境下集成和使用Memcached是完全可行的。为了实现您的需求(即按条件模糊查找),您需要了解一些背景信息,因为Memcached本身并不支持直接的模糊查询。不过,您可以采取一些策略来实现类似的功能。

集成和使用Memcached

首先,安装必要的库。可以使用memcached模块:

npm install memcached

然后,创建一个简单的Memcached客户端实例:

const Memcached = require('memcached');
const memcached = new Memcached('localhost:11211');

示例代码

这里是一个基本的示例,展示如何设置、获取和删除键值对:

// 设置一个键值对
memcached.set('abc_123', 'data1', 60, (err) => {
    if (err) console.log(err);
});

// 获取键值对
memcached.get('abc_123', (err, data) => {
    if (err) console.log(err);
    console.log(data); // 输出 'data1'
});

// 删除键值对
memcached.del('abc_123', (err) => {
    if (err) console.log(err);
});

模糊查询的解决方案

由于Memcached不支持直接的模糊查询,您可以采取以下两种方法之一:

  1. 手动遍历所有可能的键

    • 如果您知道可能的键模式(例如abc_*),则可以通过循环生成所有可能的键并检查它们是否存在。
    const keys = ['abc_123', 'abc_234', 'abc_345'];
    let results = {};
    for (let key of keys) {
        memcached.get(key, (err, data) => {
            if (!err && data) {
                results[key] = data;
            }
        });
    }
    
  2. 使用二级索引或映射表

    • 创建一个额外的键,该键存储了与您的查询条件匹配的所有键列表。例如,可以创建一个键为abc_all的条目,其值为包含所有匹配键的数组。

结论

虽然Memcached本身不支持模糊查询,但通过上述方法,您可以有效地模拟这一功能。根据具体需求选择最合适的方法。

回到顶部