Nodejs 将connect改为使用memcache存取session

Nodejs 将connect改为使用memcache存取session

使用connect发现其session很鸡肋, 没法和其他的语言共享, 索性修改了connect的存取为memcache, 序列化为php_serialize, 反序列化为php_unserialize 实现了和php的session共享, 稍后会放出, 目前还有些改动 顺便推荐一个灰常好的网站 嘎嘎 http://phpjs.org

3 回复

Node.js 将 connect 改为使用 Memcached 存取 Session

在使用 Node.js 进行开发时,有时我们需要将 session 数据存储在一个可以跨语言共享的存储系统中。Memcached 是一种高性能的分布式内存对象缓存系统,它非常适合用来存储 session 数据。本文将介绍如何将现有的 Connect 中间件替换成使用 Memcached 来存储 session 数据,并实现与 PHP 的 session 共享。

安装依赖

首先,你需要安装 connectmemcached-session-store 这两个模块:

npm install connect memcached-session-store --save

配置 Memcached 作为 Session Store

接下来,你需要配置你的应用来使用 Memcached 作为 session store。你可以通过以下代码来实现:

const express = require('express');
const session = require('express-session');
const MemcachedStore = require('memcached-session-store')(session);

const app = express();

app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    store: new MemcachedStore({
        hosts: ['127.0.0.1:11211'], // Memcached 服务器地址
        namespace: 'nodejs_session', // 分隔 key 的命名空间
        phpCompatibility: true // 设置为 true 以兼容 PHP 序列化
    })
}));

app.get('/', (req, res) => {
    if (!req.session.views) {
        req.session.views = 0;
    }
    req.session.views++;
    res.send(`你已经访问了此页面 ${req.session.views} 次`);
});

app.listen(3000, () => {
    console.log('App is running on port 3000');
});

序列化和反序列化

为了实现与 PHP 的 session 兼容,你需要确保 session 数据能够被 PHP 的 unserialize 函数正确解析。你可以使用 php-serialize 包来处理序列化:

npm install php-serialize --save

然后在代码中进行相应的配置:

const { serialize, unserialize } = require('php-serialize');

app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    store: new MemcachedStore({
        hosts: ['127.0.0.1:11211'],
        namespace: 'nodejs_session',
        phpCompatibility: true,
        serializer: {
            serialize: data => serialize.serialize(data),
            deserialize: data => unserialize.unserialize(data)
        }
    })
}));

这样,你就可以实现 Node.js 与 PHP 的 session 兼容了。

结论

通过上述步骤,你可以轻松地将现有的 Connect 应用中的 session 存储方式改为使用 Memcached。这种方式不仅提高了性能,还实现了跨语言的 session 共享。希望这些代码和说明对你有所帮助!


redis可以很好的实现

要在Node.js中将Connect的Session存储方式从默认的内存存储改为Memcached,可以使用memcached-session-store这样的第三方库来实现。这个过程包括安装必要的依赖包、配置Memcached客户端以及设置Session中间件。

以下是如何做到这一点的示例:

  1. 首先,确保已经安装了Node.js和npm。
  2. 安装必要的包:
    npm install express connect-memcached
    
  3. 在你的Express应用中,配置并使用Memcached作为Session存储。下面是一段简单的示例代码:
const express = require('express');
const session = require('express-session');
const MemcachedStore = require('connect-memcached')(session);

const app = express();

app.use(session({
    secret: 'your-secret-key',
    store: new MemcachedStore({
        hosts: ['localhost:11211'], // Memcached服务器地址
        secret: 'your-secret-key', // 如果需要的话,用于加密session数据
        prefix: 'sess_' // session key的前缀
    }),
    resave: false,
    saveUninitialized: true
}));

app.get('/', (req, res) => {
    req.session.views = (req.session.views || 0) + 1;
    res.send(`You visited this page ${req.session.views} times`);
});

app.listen(3000);

上述代码首先引入了所需的模块,并创建了一个Express应用实例。然后,通过express-sessionconnect-memcached模块配置了使用Memcached作为Session存储的方式。最后,定义了一个路由处理函数来展示访问次数。

这段代码展示了如何将Node.js应用中的Session存储切换到Memcached上。这样做的好处是可以让不同语言编写的程序(如PHP)也能访问相同的Session数据,从而实现了跨语言的Session共享。

注意,如果你需要实现与PHP的session共享,可能还需要考虑序列化和反序列化格式的问题。上面的例子没有涉及到这部分内容,因为connect-memcached库默认使用的序列化方法可能与PHP不兼容。如果需要与PHP共享session数据,可能需要自己处理序列化和反序列化的逻辑。

回到顶部