新聞中心
基于Redis的登錄應用實踐

專注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)惠濟免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。
Redis是一款高性能的內(nèi)存數(shù)據(jù)庫,支持多種數(shù)據(jù)類型,具備豐富的功能和優(yōu)良的性能表現(xiàn),廣泛應用于緩存、隊列、分布式鎖等場景。本文將介紹如何基于Redis開發(fā)一個簡單的登錄應用,此應用可以實現(xiàn)用戶注冊、登錄、退出等基本操作,并且使用Redis來存儲登錄狀態(tài),保證用戶體驗。
實現(xiàn)思路
用戶注冊:用戶輸入注冊信息,包括賬號、密碼等信息,將這些信息提交給服務器。服務器將賬號、密碼、當前時間戳等信息合并為一個字符串,并將其作為鍵,將用戶信息作為值,存儲到Redis中。同時為了避免重復注冊,需要在Redis中存儲一個賬號集合,將每個注冊的賬號存儲在該集合中。
用戶登錄:用戶輸入賬號、密碼,將其提交給服務器。服務器在Redis中查找該賬號對應的信息,如果存在則比對密碼是否正確。如果賬號和密碼都正確,則在Redis中生成一個唯一的session id,并將該用戶的登錄狀態(tài)存儲到Redis中,同時將session id和用戶信息一起作為值存儲到Redis中,并設置session id對應的鍵的過期時間,通常設置為30分鐘,這樣可以避免登錄狀態(tài)過期時間過短或過長的問題。最后將session id返回給用戶。
用戶退出:用戶點擊退出按鈕,將session id提交給服務器。服務器根據(jù)session id在Redis中查找對應的用戶信息,并刪除該信息,同時刪除該session id對應的鍵,用戶退出成功。
代碼實現(xiàn)
本文將使用Node.js來實現(xiàn)登錄應用,使用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中添加登錄狀態(tài)
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來存儲注冊的用戶信息、用戶登錄狀態(tài)等,其中sadd方法用于向Redis中添加用戶名集合,set用于存儲用戶信息,keys方法用于查找用戶信息,get用于獲取用戶信息,set用于存儲登錄狀態(tài),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方法向服務器端發(fā)送請求,其中credentials設置為’same-origin’,表示只有在同一域名下才會發(fā)送cookie,可以保證登錄狀態(tài)有效。
總結
本文介紹了如何基于Redis開發(fā)一個簡單的登錄應用,該應用使用Redis存儲用戶信息和用戶狀態(tài),保證了用戶在不同設備、不同瀏覽器中的登錄狀態(tài)一致。使用Redis可以提高應用的性能和可擴展性,將數(shù)據(jù)存儲在內(nèi)存中,可以減少IO操作和磁盤讀寫,增強應用的響應速度和并發(fā)能力。同時Redis具備輕量級、可靠性高、易于部署和使用等優(yōu)點,非常適合用于緩存、隊列等場景。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
本文標題:基于Redis的登錄應用實踐(redis登錄應用)
分享路徑:http://www.dlmjj.cn/article/dhjgheo.html


咨詢
建站咨詢
