wordpress添加友链windows优化大师在哪里
欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。
目录
- 引言
- Redis自己是怎么介绍的?
- String字符串
- JSON
- Lists
- Sets
- Hashes
- Sorted Sets
- Bitmaps
- 常见Redis应用
- 缓存
- 分布式锁
引言
作为一个高效简单的内存数据库,Redis有哪些具体应用场景?
PS:本系列开始于“黄健宏”老师的老本著作《Redis设计与实现》、《Redis应用实例》。
我从问题的角度做了总结与拓展,前面几篇内容更偏向设计思想与机制总结。
阿里有出过《Redis最佳实践》,里面有更多的企业级应用实例,也推荐看看。
Redis自己是怎么介绍的?
在官网上,Redis有对自己的数据结构做介绍的同时并介绍用法,如下:
String字符串
Redis String可以用于存储字节序列,包括文本、序列化对象和二进制数组。注意值不能大于512MB。默认情况下,单个 Redis 字符串的最大大小为 512 MB。
-
set 命令有 nx 与 xx选项
nx:要求key不存在才会成功
xx:要求key存在才会成功
-
作为计数器使用
Redis的String可以作为一个原子增量使用,如下:
提供incr
命令以原子方式将存储在给定键中的计数器增加 1。INCRBY
原子递增(并在传递负数时递减)存储在给定键处的计数器。
JSON
Redis 开源版的 JSON 功能为 Redis 提供了 JavaScript Object Notation (JSON) 支持。它允许您在 Redis 数据库中存储、更新和检索 JSON 值,就像处理任何其他 Redis 数据类型一样。
没什么示例应用,跳过。
Lists
Redis 列表是字符串值的链表。Redis 列表经常用于:
-
实现栈和队列
LPUSH
将一个新元素添加到列表头部;RPUSH
添加到列表尾部。
LPOP
从列表头部移除并返回一个元素;RPOP
执行相同操作,但移除的是列表尾部元素。
LLEN
返回列表的长度。
LMOVE
原子性地将元素从一个列表移动到另一个列表。
LRANGE
从列表中提取一个元素范围。
LTRIM
将列表缩减为指定的元素范围。
列表还支持多个阻塞命令:
BLPOP
从列表头部移除并返回一个元素。如果列表为空,该命令会阻塞,直到有元素可用或直到指定的超时时间到达。
BLMOVE
原子地将元素从源列表移动到目标列表。如果源列表为空,该命令会阻塞,直到有新元素可用。
-
构建后台工作系统的队列管理
比如在生产者——消费者模式中,其中生产者将项目推入列表,消费者(通常是工作进程)消费这些项目并执行操作。
例子: Twitter 社交网络将用户发布的最新推文存入 Redis 列表中。 -
作为限制列表
在许多使用场景中,我们只想用列表来存储最新的项目,无论它们是什么:社交网络更新、日志或其他任何内容。
Redis 允许我们使用列表作为一个有上限的集合,只记住最新的 N 个项目,并使用LTRIM
命令丢弃所有最旧的项目。
LTRIM
命令与LRANGE
命令类似,但它不是显示指定的元素范围,而是将这个范围设置为新的列表值。给定范围之外的元素都会被移除。
例如,如果你正在将自行车添加到维修列表的末尾,但只想关注列表中最长的 3 个项目:
Sets
是一个无序的唯一字符串(成员)的集合。
SADD
向集合中添加一个新成员。
SREM
从集合中移除指定的成员。
SISMEMBER
测试一个字符串是否属于集合。
SINTER
返回两个或多个集合共有的成员集合(即交集)。
SCARD
返回集合的大小(也称为基数)。
常用于:
- 跟踪唯一项(例如,跟踪访问特定博客文章的所有唯一 IP 地址)
- 表示关系(例如,具有给定角色的所有用户的集合)
- 执行交集、并集和差集等常见集合操作
比如存储比赛的自行车集合。
登记操作:
检查操作,bike:2 只存在于bikes:racing:france
bike:1 两个集合都存在。SINTER
命令查看交集。
Hashes
Redis 哈希是记录类型,结构为字段-值对的集合。你可以使用哈希来表示基本对象,以及存储计数器分组等。
每个哈希可以存储高达 4,294,967,295 (2^32 - 1) 个字段-值对。在实际应用中,你的哈希受限于承载 Redis 部署的虚拟机的总内存。
Sorted Sets
有序集合是一个由唯一字符串(成员)组成的集合,这些成员按关联的分数排序。当多个字符串具有相同的分数时,这些字符串会按字典序排序。
常用于以下场景:
- 排行榜
可以使用 sorted sets 轻松维护大型在线游戏中最高分数的有序列表。
# 添加/更新玩家得分
ZADD game:xyz:leaderboard 1500 "player1"
ZADD game:xyz:leaderboard 2200 "player2"
ZADD game:xyz:leaderboard 1800 "player3"# "player1" 得分增加 300
ZINCRBY game:xyz:leaderboard 300 "player1" # player1 score becomes 1800# 获取得分最高的 Top 3 玩家 (降序)
ZREVRANGE game:xyz:leaderboard 0 2 WITHSCORES# 获取 "player2" 的排名 (0-based, 降序)
ZREVRANK game:xyz:leaderboard "player2"
- 速率限制器
可以使用一个 sorted set 来构建滑动窗口速率限制器,以防止过多的 API 请求。
Bitmaps
本质上是字符串,但可以对字符串的任意位进行操作(0或1)。非常节省空间,适合大规模布尔型数据。由于字符串是二进制安全的字节数组,且其最大长度为 512 MB,因此它们适合设置多达 2^32 个不同的位。
核心操作: SETBIT, GETBIT, BITCOUNT, BITPOS, BITOP (AND, OR, XOR, NOT)
- 签到与统计
# 用户ID为1000的用户在某天签到 (假设1000是bit的偏移量)
# key: daily_checkin:2023-10-27
SETBIT daily_checkin:2023-10-27 1000 1
SETBIT daily_checkin:2023-10-27 1005 1# 检查用户ID为1000是否签到
GETBIT daily_checkin:2023-10-27 1000# 统计当天签到总人数
BITCOUNT daily_checkin:2023-10-27# 统计连续3天都签到的用户 (需要BITOP AND)
# SETBIT daily_checkin:2023-10-26 1000 1
# SETBIT daily_checkin:2023-10-25 1000 1
# BITOP AND连续3天签到 daily_checkin:2023-10-27 daily_checkin:2023-10-26 daily_checkin:2023-10-25
# BITCOUNT 连续3天签到
等等……
基本上都是从数据结构的特性出发做应用。这里放一个官网地址https://redis.io/docs/latest/develop/data-types/
常见Redis应用
缓存
在微服务架构中,我们往往需要一个线程安全的共享存储来作为缓存使用。目的是提升性能与降低数据源压力。
在权衡内存后,一些热点数据、读多写少的数据都可以使用缓存来提升性能。
作为缓存时,其按照命中与使用情况常常有3类问题:
-
缓存穿透
缓存未命中,请求到数据源。
缓存穿透主要是需要防范不正常请求,如数据库一般肯定没有的user:id -999。
需要在应用层对查询数据做过滤限制,或者为无效请求缓存一个短期结果。 -
缓存击穿
缓存未命中,请求到数据源。但是请求是有效的。
一般发生在热点数据上。需要给热点数据续时间或者设置永不过期。
或者给热点数据的数据源请求加互斥操作。只要能实现给数据源降压的效果都行。 -
缓存雪崩
雪崩意味着同一时间大量问题。在缓存这里就是同一时间缓存都失效。
应对方法有给缓存设置不同的随机失效时间。热点数据不过期、讲热点数据分散在不同缓存数据库等。
分布式锁
Redis本省是线程安全的+String有nx操作。所以Redis String很适合用来作为分布式锁。