目录
1. 缓存功能
2. 计数功能
3. 共享会话(Session)
4. 手机验证码
前言
这里将详细介绍 Redis 字符串类型在实际开发中的几个典型应用场景,并提供相应的伪代码示例。
1. 缓存功能
场景描述
在许多Web应用中,数据通常需要从数据库(如 MySQL)中获取。然而,频繁访问数据库会导致性能瓶颈。为了提高读取速度和减轻后端压力,可以使用 Redis 作为缓存层。大部分请求的数据直接从 Redis 中获取,只有当缓存未命中时才去查询数据库,并更新缓存。
架构图
伪代码实现
UserInfo getUserInfo(long uid) {
// 根据用户ID生成Redis键
String key = "user:info:" + uid;
// 尝试从Redis中获取用户信息
String value = redis.get(key);
if (value != null) {
// 如果缓存命中,反序列化JSON并返回
UserInfo userInfo = JSON.parse(value);
return userInfo;
}
// 如果缓存未命中,从MySQL中获取用户信息
UserInfo userInfo = mysql.query("SELECT * FROM user_info WHERE uid = " + uid);
if (userInfo == null) {
// 如果没有找到用户信息,返回404
return null;
}
// 序列化用户信息为JSON格式
String jsonValue = JSON.stringify(userInfo);
// 将用户信息写入Redis缓存,并设置过期时间为1小时
redis.set(key, jsonValue, 3600);
return userInfo;
}
注意事项
- Redis 没有表名、字段名等概念,设计合理的键名有助于防止键冲突和项目的可维护性。
- 推荐的键名格式是“业务名:对象名:唯一标识:属性”,例如:“vs:user_info:6379”或“u:6379🇫🇷m:5217”。
2. 计数功能
场景描述
许多应用需要统计某些事件的发生次数,例如视频网站中的视频播放次数。Redis 的 INCR
命令非常适合用于快速计数。
架构图
伪代码实现
long incrVideoCounter(long vid) {
String key = "video:" + vid;
long count = redis.incr(key);
return count;
}
注意事项
- 实际开发中还需要考虑防作弊、按不同维度计数、避免单点问题、数据持久化到底层数据源等问题。
3. 共享会话(Session)
场景描述
在分布式 Web 应用中,用户的 Session 信息(如登录信息)通常存储在各自的服务器上。这可能导致用户每次请求被负载均衡到不同的服务器时,需要重新登录。使用 Redis 可以集中管理 Session 信息,确保无论用户访问哪台服务器都能保持一致的会话状态。
架构图
伪代码实现
// 获取用户Session信息
String getSession(String sessionId) {
String sessionData = redis.get(sessionId);
return sessionData;
}
// 更新用户Session信息
void updateSession(String sessionId, String sessionData) {
redis.set(sessionId, sessionData, 3600); // 设置过期时间为1小时
}
注意事项
- 确保 Redis 是高可用和可扩展的,以保证系统的稳定性和可靠性。
4. 手机验证码
场景描述
为了安全验证用户身份,很多应用会在用户登录时发送手机验证码。为了避免频繁请求,可以限制用户每分钟获取验证码的频率(例如不超过5次)。Redis 可以用来实现这一功能。
伪代码实现
String sendVerificationCode(String phoneNumber) {
String key = "shortMsg:limit:" + phoneNumber;
// 设置过期时间为1分钟,只在不存在key时才能设置成功
boolean r = redis.set(key, "1", 60, "NX");
if (!r) {
// 如果之前已经设置了该手机号的验证码
long c = redis.incr(key);
if (c > 5) {
// 超过了每分钟5次的限制
return null; // 限制发送
}
}
// 生成随机的6位数验证码
String validationCode = generateRandomCode(6);
String validationKey = "validation:" + phoneNumber;
// 验证码5分钟内有效
redis.set(validationKey, validationCode, 300);
// 返回验证码,随后通过手机短信发送给用户
return validationCode;
}
boolean verifyVerificationCode(String phoneNumber, String validationCode) {
String validationKey = "validation:" + phoneNumber;
String storedCode = redis.get(validationKey);
if (storedCode == null) {
// 没有这个手机号的验证码记录,验证失败
return false;
}
return storedCode.equals(validationCode);
}
注意事项
- 生成的验证码需要有一定的安全性,避免被轻易猜测。
- 验证码的有效时间应根据具体需求合理设置。
总结
Redis 的字符串类型在多种场景下都非常有用,包括但不仅仅缓存、计数、会话管理和验证码处理。我们可以根据业务灵活运用,毕竟技术是为业务服务的!!感谢阅览!!