侧边栏壁纸
  • 累计撰写 66 篇文章
  • 累计创建 48 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Redis 14种应用场景解析

img

1. 数据库缓存

Redis 作为典型的 Key-Value 型内存数据库,数据缓存是其最广为人知的应用场景。使用 Redis 缓存数据操作简便,通常将序列化后的对象以 string 类型存储。但在实际应用中,需注意以下关键要点:

  • Key 设计:必须确保不同对象的 Key 具有唯一性,且尽量缩短长度,常见的做法是采用类名(或表名)与主键拼接的方式。

  • 序列化方式:选择高效的序列化方案至关重要,这不仅能提升序列化速度,还可有效减少内存占用。

  • 数据一致性:为保证缓存与数据库内容一致,一般有两种策略: 1 懒加载更新:仅在数据库查询后将对象存入缓存。当对象发生修改或删除操作时,立即清除对应缓存或设置为过期状态。 2 主动同步更新:在数据库新增和查询操作后将对象放入缓存,修改后更新缓存,删除时清除或设置对应缓存过期。

2. 分布式Session

Redis 是分布式独立服务,借助 String 类型可实现多个应用间的数据共享,以分布式 Session 为例,Spring项目可通过引入以下依赖: org.springframework.session spring-session-data-redis 即可轻松实现 Session 数据在多应用间的共享与管理,通用用于将单体应用改成分布式应用。

3. 分布式锁

类似Zookeeper,Redis也可以实现分布式锁功能 在分布式环境下,Java 自带的单体锁不再适用。利用Redis String 类型的 set 命令参数:

  • EX:以秒为单位设置键的过期时间。

  • PX:以毫秒为单位设置键的过期时间。

  • NX:仅当键不存在时,才执行设置操作,效果等同于 SETNX key value 。

  • XX:仅当键已存在时,才执行设置操作。

这些原子性操作使得基于 Redis 实现分布式锁成为可能。例如:set lock_key locked NX EX 1,若该操作返回 false,表明当前锁已被占用;若返回 true,则获取到锁,可继续后续操作,并在操作完成后通过 del 命令释放锁。即使程序异常未释放锁,由于设置了过期时间,锁也会在 1 秒后自动失效,不会影响其他程序运行。此外,推荐使用 redisson 第三方库来实现分布式锁。

4.排行榜

利用 sorted set(有序 set)结合热度计算算法,可轻松构建热度排行榜。通过 zrevrangebyscore 命令可获取按分数倒序排列的序列,zrank 命令可获取成员在排行榜的位置(分数正序排列位置,如需获取倒序位置,可使用 zcard-zrank 计算)。例如:

# id为6001的新闻点击数加1

zincrby hotNews:20190926 1 n6001

# 获取今天点击最多的15条新闻

zrevrange hotNews:20190926 0 15 withscores

5. 点赞、签到、打卡

以微博点赞为例,假设微博 ID 为 t1001,用户 ID 为 u3001,使用 like:t1001 维护该微博的所有点赞用户:

  • 点赞操作:sadd like:t1001 u3001

  • 取消点赞:srem like:t1001 u3001

  • 判断是否点赞:sismember like:t1001 u3001

  • 获取所有点赞用户:smembers like:t1001

  • 统计点赞数:scard like:t1001

⠀相比数据库操作,Redis 的实现方式更为简洁高效。

6. 计数器

计数功能是 Redis 的优势应用场景之一,其高频率读写特性充分发挥了 Redis 作为内存数据库的高效性能。在 Redis 的数据结构中,string、hash 和 sorted set 均提供了 incr 方法用于原子性自增操作,不同数据结构适用于不同场景:

  • string 类型:适用于统计单日数据,如每天的注册用户数。可设定名为 REGISTERED_COUNT_TODAY 的 Key,并设置到凌晨 0 点的过期时间,每当有用户注册,使用 incr 命令使该 Key 值自增 1,每日零点自动清零。

  • hash 类型:适合处理具有多种属性的计数场景,如微博的点赞数、评论数、转发数和浏览数。将计数器的 Key 设为 weibo:weibo_id,hash 的 field 分别设置为 like_number、comment_number、forward_number 和 view_number,通过 hincrby 命令实现对应 field 的自增。

  • sorted set 类型:适用于排行榜功能,如发帖排行榜。将集合的 Key 设为 POST_RANK,用户发帖后,使用 zincrby 命令使该用户 id 的 score 值增加 1,sorted set 会自动重新排序,实时更新用户在排行榜的位置。

7. 排行榜

利用 sorted set(有序 set)结合热度计算算法,可轻松构建热度排行榜。通过 zrevrangebyscore 命令可获取按分数倒序排列的序列,zrank 命令可获取成员在排行榜的位置(分数正序排列位置,如需获取倒序位置,可使用 zcard-zrank 计算)。例如: # id为6001的新闻点击数加1 zincrby hotNews:20190926 1 n6001 # 获取今天点击最多的15条新闻 zrevrange hotNews:20190926 0 15 withscores

8. 抽奖

利用 set 结构的无序性,通过 Spop 命令(用于移除集合中指定 Key 的一个或多个随机元素,并返回)

9. 限流

通过 int 类型和 incr 方法,以访问者的 ip 及其他相关信息作为 Key,每次访问计数加 1,当计数超过设定阈值时,返回 false,实现限流功能。

10. 位统计

Redis 的 String 类型提供了 bitcount 命令(基于 1.6.6 版本引入的 bitmap 数据结构),由于字符以 8 位二进制形式存储,通过操作二进制位可实现高效统计。例如: bit 操作非常节省空间(1 MB=8388608 bit),适用于大数据量统计相对其他数据根式更节省存储空间,使用 Redis 的 bitmaps 统计用户留存率、活跃用户。

11. 商品标签

使用 tags:i5001 维护商品的所有标签,例如: sadd tags:i5001 画面清晰细腻 sadd tags:i5001 真彩清晰显示屏 sadd tags:i5001 流程至极

  1. 好友关系、用户关注、推荐模型

在微博等社交场景中,Redis 可用于处理好友关系和用户关注功能。以用户 A 为例,将其关注和粉丝的用户 id 分别存储在两个 set 中:

  • A:follow:存储 A 关注的所有用户 id

  • A:follower:存储 A 的所有粉丝用户 id

⠀通过 sinter 命令可计算交集,获取互相关注的用户。例如,当 A 访问用户 B 的主页时:

  • 共同关注:通过 A:follow 和 B:follow 的交集获取

  • A 关注的人也关注了 B:通过 A:follow 和 B:follower 的交集获取

⠀此外,还可通过差集运算获取可能认识的人:

  • 用户 1 可能认识的人:sdiff 2:follow 1:follow

  • 用户 2 可能认识的人:sdiff 1:follow 2:follow

13. 显示最新的项目列表

以 Web 应用展示用户最新评论为例,每次有新评论发表时,将其 ID 添加到 Redis 列表(如 latest.comments)。为避免列表无限增长,可限定其长度为 5000。由于 Redis 中的最新 ID 采用常驻缓存并持续更新,获取 ID 的函数优先查询 Redis,仅当超出列表长度限制时,才访问数据库,有效减少数据库查询压力。

14. 全局 ID

在分库分表场景中,利用 Redis 的 int 类型及 incrby 命令的原子性,可高效生成全局唯一 ID。例如,执行incrby userid 1000,可一次性获取一段 ID,满足业务需求。

0

评论区