基于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用于删除键。
客户端的代码示例如下:
```javascriptconst 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具备轻量级、可靠性高、易于部署和使用等优点,非常适合用于缓存、队列等场景。