基于Redis的登录应用实践(redis 登录应用)

基于Redis的登录应用实践

Redis是一款高性能的内存数据库,支持多种数据类型,具备丰富的功能和优良的性能表现,广泛应用于缓存、队列、分布式锁等场景。本文将介绍如何基于Redis开发一个简单的登录应用,此应用可以实现用户注册、登录、退出等基本操作,并且使用Redis来存储登录状态,保证用户体验。

实现思路

用户注册:用户输入注册信息,包括账号、密码等信息,将这些信息提交给服务器。服务器将账号、密码、当前时间戳等信息合并为一个字符串,并将其作为键,将用户信息作为值,存储到Redis中。同时为了避免重复注册,需要在Redis中存储一个账号集合,将每个注册的账号存储在该集合中。

用户登录:用户输入账号、密码,将其提交给服务器。服务器在Redis中查找该账号对应的信息,如果存在则比对密码是否正确。如果账号和密码都正确,则在Redis中生成一个唯一的session id,并将该用户的登录状态存储到Redis中,同时将session id和用户信息一起作为值存储到Redis中,并设置session id对应的键的过期时间,通常设置为30分钟,这样可以避免登录状态过期时间过短或过长的问题。最后将session id返回给用户。

用户退出:用户点击退出按钮,将session id提交给服务器。服务器根据session id在Redis中查找对应的用户信息,并删除该信息,同时删除该session id对应的键,用户退出成功。

代码实现

本文将使用Node.js来实现登录应用,使用redis-py进行Redis操作。以下是服务器端的代码示例:

“`javascript

const express = require(‘express’);

const bodyParser = require(‘body-parser’);

const redis = require(‘redis’);

const uuidv4 = require(‘uuid/v4’);

const app = express();

const client = redis.createClient();

app.use(bodyParser.urlencoded({ extended: false }));

app.use(bodyParser.json());

// 用户注册

app.post(‘/register’, (req, res) => {

const { username, password } = req.body;

const now = Date.now();

const key = `${username}:${password}:${now}`;

client.sadd(‘usernames’, username);

client.set(key, JSON.stringify({ username, password, registeredAt: now }));

res.send(‘注册成功!’);

});

// 用户登录

app.post(‘/login’, (req, res) => {

const { username, password } = req.body;

const key = `${username}:${password}:*`;

client.keys(key, (err, keys) => {

if (err) {

console.error(err);

return res.send(‘登录失败!’);

}

if (keys.length === 0) {

return res.send(‘用户名或密码错误!’);

}

const userKey = keys[0];

// 判断密码是否正确

client.get(userKey, (err, str) => {

if (err || !str) {

console.error(err);

return res.send(‘登录失败!’);

}

const user = JSON.parse(str);

if (user.password !== password) {

return res.send(‘用户名或密码错误!’);

}

// 向Redis中添加登录状态

const sessionId = uuidv4();

client.set(sessionId, user.username);

client.expire(sessionId, 1800);

res.cookie(‘sessionId’, sessionId);

res.send(‘登录成功!’);

});

});

});

// 用户退出

app.post(‘/logout’, (req, res) => {

const { sessionId } = req.cookies;

client.del(sessionId, (err, count) => {

if (err) {

console.error(err);

res.send(‘退出失败!’);

} else {

res.clearCookie(‘sessionId’);

res.send(‘退出成功!’);

}

});

});

app.listen(3000, () => {

console.log(‘应用启动了…’);

});


可以看到,服务器端使用Redis来存储注册的用户信息、用户登录状态等,其中sadd方法用于向Redis中添加用户名集合,set用于存储用户信息,keys方法用于查找用户信息,get用于获取用户信息,set用于存储登录状态,expire用于设置过期时间,del用于删除键。

客户端的代码示例如下:

```javascript
const registerForm = document.querySelector('#registerForm');
const loginForm = document.querySelector('#loginForm');
const logoutButton = document.querySelector('#logoutButton');
// 用户注册
registerForm.addEventListener('submit', (event) => {
event.preventDefault();
const formData = new FormData(registerForm);
const username = formData.get('username');
const password = formData.get('password');
fetch('/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
}).then((response) => {
if (response.ok) {
alert('注册成功!');
} else {
alert('注册失败!');
}
});
});
// 用户登录
loginForm.addEventListener('submit', (event) => {
event.preventDefault();
const formData = new FormData(loginForm);
const username = formData.get('username');
const password = formData.get('password');
fetch('/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ username, password }),
credentials: 'same-origin',
}).then((response) => {
if (response.ok) {
alert('登录成功!');
} else {
alert('登录失败!');
}
});
});

// 用户退出
logoutButton.addEventListener('click', () => {
fetch('/logout', {
method: 'POST',
credentials: 'same-origin',
}).then((response) => {
if (response.ok) {
alert('退出成功!');
location.href = '/';
} else {
alert('退出失败!');
}
});
});

可以看到,客户端使用fetch方法向服务器端发送请求,其中credentials设置为’same-origin’,表示只有在同一域名下才会发送cookie,可以保证登录状态有效。

总结

本文介绍了如何基于Redis开发一个简单的登录应用,该应用使用Redis存储用户信息和用户状态,保证了用户在不同设备、不同浏览器中的登录状态一致。使用Redis可以提高应用的性能和可扩展性,将数据存储在内存中,可以减少IO操作和磁盘读写,增强应用的响应速度和并发能力。同时Redis具备轻量级、可靠性高、易于部署和使用等优点,非常适合用于缓存、队列等场景。


数据运维技术 » 基于Redis的登录应用实践(redis 登录应用)