Redis 除了用作缓存还能干吗?

今天我们来聊聊 redis 的使用案例 。
Redis 是一种内存键值数据库 。它支持多种数据结构,如 String, Hash, List, Set 和 SortedSet 。

Redis 除了用作缓存还能干吗?

文章插图
图片
01 缓存Redis 的最常用的用例是缓存,以加快网络应用的速度 。在这种用例中,Redis 将经常请求的数据存储在内存中 。它允许网络服务器频繁访问的数据 。这就减少了数据库的负载 , 并缩短应用程序的响应时间 。在大规模应用中 , 缓存分布在 Redis 服务器集群中 。
Redis 作为分布式缓存时需要考虑的其他问题包括:
  • 设置正确的 TTL (Time to Live)
  • 处理冷启动时对数据库的密集访问
02 Session 存储另一个常见用例是将 Redis 用作 Session 存储,在无状态服务之间共享 Session 数据 。
当用户登录网络应用程序时,服务端会创建一个唯一的 Session ID,Session 数据会存储在 Redis 中,然后 Session 作为 Cookie 的一部分返回给客户端 。
当用户向应用程序发出请求时,Session ID 会包含在请求中 。无状态网络服务器会使用 Session 数据 。值得注意的是 Redis 是内存数据库 。如果 Redis 服务器重启,存储在 Redis 中的 Session 数据会丢失 。
即使 Redis 提供了 RDB 和 AOF 等持久化选项,但这些选项在重启时加载数据的时间往往太长,不实用 。在实际生产环境中,数据会复制到备份实例 。如果主实例崩溃,备份迅速升级,接管流量 。
03 分布式锁需要协调对某些共享资源的访问时,就会使用分布式锁 。Redis 通过其原子命令(如 SETNX,SET if Not eXists)来做分布式锁 。它允许调用者设置一个不存在的键 。
比如,客户端通过设置一个唯一的 Key 来获取锁:
SETNX lock "1234abcd" EX 3
  • 1.
如果 Key 尚未设置,SETNX 命令返回 1,表明锁已被客户端获取 。客户端完成工作后 删除 Key,释放锁 。
如果 Key 已被设置 , SETNX 命令返回 0,表明锁已被其他客户机持有 。在这种情况下 , 客户端会等待并重试 SETNX 操作,直到锁被其他客户端释放 。
请注意 , 这种简单的实现对于许多用例来说已经足够好了,但并非完全容错 。对于生产应用 , 许多 Redis 客户端库提供高质量的分布式锁实现 。
04 限流Redis 可用作限流 。一个非常基本的限流算法是这样工作的:
对于每个用户请求,其请求的 IP 或用户 ID 用作 Key 。每个请求都会使键值递增 。将当前计数与允许的速率限制进行比较 , 如果计数在速率限制范围内,则处理请求 。如果计数超过速率限制 , 则拒绝请求 。Key可以设置为在特定时间窗口(如一分钟)后过期,以重置下一个时间窗口的计数 。
05 游戏排行榜对于大多数规模不是很大的游戏来说,Redis 是一种很好的实现方式 。SortedSet 是实现这一功能的基本数据结构 。
SortedSet 的每个元素都有一个与之相关的分数 。元素按分数排序 。这样就可以在对数时间内 完成排序 。
06 购物车我们可以使用 Hash 来表示购物车中的键值对 。对于简单的电商平台来说,在 Redis 中实现购物车可以兼顾用户体验和快速交付 。
07 计算用户留存率我们可以使用 Bitmap 来表示每天登录的用户并计算用户保留率 。这种计数功能占用的内存很少 。
08 消息队列我们可以使用 List 来做消息队列 。也可以使用 Redis 的 PubSub 功能来实现类似的消息总线功能 。

【Redis 除了用作缓存还能干吗?】


    推荐阅读