Nodejs redis 用户表3个字段id,username,pwd如何操作
Nodejs redis 用户表3个字段id,username,pwd如何操作
var adduser = function (user, pwd, callback) {
var userid;
client.incr(“userid”, function (err, reply) {
userid = reply.toString();
});
client.lpush(“user_id”, userid, function (err, reply) {
if (!err) {
client.set(“user_name_” + userid, user);
clinet.set(“user_pwd_” + userid, pwd);
}
});
}
注册用户这样写对不对? 但是如果判断用户是否重复怎么写?
是不是这样写?
var adduser = function (user, pwd, callback) {
client.get("user_" + user, function (reply) {
if (reply == null) {//这里判断
var userid;
client.incr("userid", function (err, reply) {
userid = reply.toString();
});
client.lpush("user_id", userid, function (err, reply) {
if (!err) {
client.set("user_name_" + userid, user);
clinet.set("user_pwd_" + userid, pwd);
client.set("user_" + user, userid);//这里一加行
callback("注册成功");
}
});
}
else {
callback("用户已存在");
}
});
client.end();
}
3 回复
为了实现一个简单的用户注册功能,并且能够检查用户是否已经存在,我们可以使用Redis的数据结构和命令。以下是一个改进的版本,展示了如何使用Node.js和Redis来处理用户注册,包括用户是否存在的情况。
改进后的代码
const redis = require('redis');
const client = redis.createClient();
client.on('error', (err) => {
console.error(`Redis error: ${err}`);
});
function addUser(username, password, callback) {
// 检查用户是否已存在
client.get('user:' + username, (err, reply) => {
if (err) return callback(err);
if (reply !== null) {
return callback(null, "用户已存在");
}
// 如果用户不存在,生成新的用户ID并添加用户信息
client.incr('nextUserId', (err, id) => {
if (err) return callback(err);
const userId = 'user:' + id;
// 存储用户名和密码
client.set(userId + ':username', username, (err) => {
if (err) return callback(err);
client.set(userId + ':password', password, (err) => {
if (err) return callback(err);
// 更新用户名到ID的映射
client.set('user:' + username, userId, (err) => {
if (err) return callback(err);
callback(null, "注册成功");
});
});
});
});
});
}
// 使用示例
addUser('newUser', 'password123', (err, result) => {
if (err) {
console.error(err);
} else {
console.log(result);
}
});
解释
- 连接Redis:首先创建一个Redis客户端。
- 检查用户是否已存在:通过
get
命令查询指定用户名是否存在。 - 生成新用户ID:使用
incr
命令自增一个计数器nextUserId
,为新用户分配唯一的ID。 - 存储用户信息:将用户的ID、用户名和密码存储在Redis中,分别存储在不同的键下。
- 更新用户名到ID的映射:为了方便通过用户名快速查找用户信息,我们还存储了一个映射关系。
- 回调函数:最后,根据结果调用回调函数返回给调用者。
这种方法不仅确保了用户信息的安全存储,还通过合理的数据结构设计提高了查询效率。
可以这样,一般的注册 入库的时候都先查一次。。
你的实现方式基本上是正确的,但有一些地方需要改进。首先,使用 lpush
来存储用户 ID 可能不是最佳实践,因为列表不适合用于快速查找操作。更好的做法是使用哈希(hash)来存储用户信息,这样可以更方便地进行增删改查操作。
下面是改进后的示例代码:
const redis = require('redis');
const client = redis.createClient();
client.on('error', (err) => {
console.log(`Redis error: ${err}`);
});
const addUser = (user, pwd, callback) => {
// 检查用户是否已经存在
client.hget('users', 'username:' + user, (err, reply) => {
if (err) return callback(err);
if (reply) {
return callback('用户已存在');
}
// 如果不存在,则创建新用户
client.incr('nextUserId', (err, id) => {
if (err) return callback(err);
const userId = id.toString();
client.hmset('users', [
'username:' + userId, user,
'pwd:' + userId, pwd,
'username:' + user, userId
], (err) => {
if (err) return callback(err);
callback(null, '注册成功');
});
});
});
};
// 测试
addUser('testuser', 'testpwd', (err, res) => {
if (err) {
console.error(err);
} else {
console.log(res);
}
});
解释
- 引入 Redis 客户端:首先,我们需要引入 Redis 客户端并创建一个客户端实例。
- 错误处理:添加错误处理逻辑,确保在发生错误时能够及时捕获并反馈。
- 检查用户是否存在:使用
hget
方法查询用户是否存在。如果用户已存在,则返回错误。 - 生成新的用户 ID:使用
incr
方法自动生成一个新的用户 ID。 - 设置用户信息:使用
hmset
方法将用户信息存储到哈希中。这里我们使用两个键分别存储用户名到 ID 和 ID 到用户名的映射。 - 回调函数:在完成操作后调用回调函数返回结果。
这种方法不仅解决了用户重复的问题,还提高了数据存储和检索的效率。