Nodejs+redis+sqlserver应用实例

Nodejs+redis+sqlserver应用实例

打算用nodejs到redis里面取静态页上的一些动态数据,取不到则走sqlserver数据库查询。 目前nodejs连接redis自己已经ok,只是sqlserver因为无法安装msnodesql连接不上,有一个大神给出了思路,但是我现在主要是因为没有用node和.net配合开发过,有诸多担心,所以想找一个小demo自己借鉴一下。 谁能给一个简单的示例,重赏啊,有北京的朋友我请大餐。

2 回复

当然可以。这里我们将创建一个简单的 Node.js 应用程序,该应用程序使用 Redis 缓存从 SQL Server 数据库获取的数据。如果 Redis 中不存在所需的数据,则从 SQL Server 查询数据并将其存储在 Redis 中。

首先,确保你已经安装了以下依赖项:

  • express: 用于创建 HTTP 服务器
  • redis: 用于与 Redis 进行交互
  • mssql: 用于与 SQL Server 进行交互

你可以通过运行以下命令来安装这些依赖项:

npm install express redis mssql

接下来,我们需要配置数据库连接。这里我们假设你已经有了一个 SQL Server 数据库,并且知道如何连接它。我们将使用 mssql 包进行连接。

const sql = require('mssql');

const config = {
    server: 'your_server',
    database: 'your_database',
    authentication: {
        type: 'default',
        options: {
            userName: 'your_username',
            password: 'your_password'
        }
    },
    options: {
        encrypt: true // 使用加密连接(对于 Azure SQL)
    }
};

现在我们可以创建一个简单的 Express 应用来处理请求。我们将检查 Redis 是否存在所需的数据。如果存在,我们将直接返回它;否则,我们将从 SQL Server 查询数据,然后将结果存储在 Redis 中。

const express = require('express');
const redis = require('ioredis');
const app = express();

// 创建 Redis 客户端
const redisClient = new redis({
    host: 'localhost',
    port: 6379
});

app.get('/data', async (req, res) => {
    const key = 'someKey'; // 假设这是我们要查找的键

    try {
        // 尝试从 Redis 获取数据
        const cachedData = await redisClient.get(key);

        if (cachedData) {
            console.log('数据从 Redis 获取');
            return res.json(JSON.parse(cachedData));
        }

        // 如果 Redis 中没有数据,则从 SQL Server 查询
        await sql.connect(config);
        const result = await sql.query`SELECT * FROM your_table WHERE someColumn = ${'someValue'}`;
        const data = result.recordset;

        // 将数据存储在 Redis 中
        await redisClient.set(key, JSON.stringify(data));

        console.log('数据从 SQL Server 获取并存储在 Redis 中');
        res.json(data);
    } catch (err) {
        console.error(err);
        res.status(500).send('Internal Server Error');
    } finally {
        await sql.close();
    }
});

app.listen(3000, () => {
    console.log('服务器运行在 http://localhost:3000');
});

这段代码展示了如何结合使用 Node.js、Redis 和 SQL Server 来实现缓存机制。当用户访问 /data 路径时,应用程序会先尝试从 Redis 中获取数据。如果数据存在,则直接返回。如果数据不存在,则从 SQL Server 查询数据,并将结果存储在 Redis 中以供将来使用。


可以理解你的需求。你需要一个Node.js应用,该应用从Redis中读取数据,如果Redis中不存在所需的数据,则转而查询SQL Server。这里我将提供一个简单的示例来说明如何实现这一流程。

首先,确保你已经安装了必要的依赖包。你可以使用npm安装这些库:

npm install redis mssql

接下来是代码示例:

const redis = require('redis');
const sql = require('mssql');

// Redis配置
const redisClient = redis.createClient({
    host: 'your-redis-host',
    port: your-redis-port,
});

// SQL Server配置
const config = {
    user: 'your-username',
    password: 'your-password',
    server: 'your-sql-server-host',
    database: 'your-database-name'
};

async function fetchData(key) {
    return new Promise((resolve, reject) => {
        redisClient.get(key, (err, data) => {
            if (err) return reject(err);
            if (data) return resolve(JSON.parse(data));

            // 如果Redis中没有数据,则查询SQL Server
            sql.connect(config).then(() => {
                new sql.Request().query(`SELECT * FROM YourTable WHERE Key='${key}'`)
                    .then(result => {
                        const dataFromSql = result.recordset[0];
                        redisClient.setex(key, 3600, JSON.stringify(dataFromSql)); // 将结果存入Redis,并设置过期时间1小时
                        resolve(dataFromSql);
                    })
                    .catch(err => {
                        sql.close();
                        reject(err);
                    });
            }).catch(err => {
                reject(err);
            });
        });
    });
}

// 使用示例
fetchData('someKey').then(data => console.log(data)).catch(console.error);

在这个示例中,fetchData 函数尝试从Redis获取数据。如果找不到数据,它将通过SQL Server查询并返回结果,同时将查询结果存储到Redis中以便后续请求更快地访问。

请注意,这只是一个基本示例。在生产环境中,你应该考虑错误处理、日志记录、安全性和性能优化等更多方面。

回到顶部