登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 2025 年度开源项目评选中
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
Redis应用场景有哪些?
待办的
#IAJL3V
陌生人
拥有者
创建于
2024-08-13 10:12
<p><img src="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710523290483.png" alt="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710523290483.png" data-href="" style=""/></p><h4 style="text-align: start;">缓存</h4><p style="text-align: start;">毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效; 一些频繁被访问的数据,经常被访问的数据如果放在关系型数据库,每次查询的开销都会很大,而放在redis中, 因为redis 是放在内存中的可以很高效的访问。</p><h4 style="text-align: left; line-height: 1.5;">抽奖</h4><p style="text-align: left;">利用set结构的无序性,通过 Spop(Redis Spop 命令用于移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素) 随机获得值。</p><h4 style="text-align: left;">点赞、关注收藏</h4><p style="text-align: left;">Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。</p><p style="text-align: left;"><span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:1</code></span> 、<span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:2</code></span>、<span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:3</code></span> 三个用户分别对 article:1 文章点赞了。</p><pre style="text-align: left;"><code class="language-sql"># uid:1 用户对文章 article:1 点赞 > SADD article:1 uid:1 (integer) 1 # uid:2 用户对文章 article:1 点赞 > SADD article:1 uid:2 (integer) 1 # uid:3 用户对文章 article:1 点赞 > SADD article:1 uid:3 (integer) 1</code></pre><p style="text-align: left;"><span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:1</code></span> 取消了对 article:1 文章点赞。</p><pre style="text-align: left;"><code class="language-sql">> SREM article:1 uid:1 (integer) 1</code></pre><p style="text-align: left;">获取 article:1 文章所有点赞用户 :</p><pre style="text-align: left;"><code class="language-sql">> SMEMBERS article:1 1) "uid:3" 2) "uid:2"</code></pre><p style="text-align: left;">获取 article:1 文章的点赞用户数量:</p><pre style="text-align: left;"><code class="language-sql">> SCARD article:1 (integer) 2</code></pre><p style="text-align: left;">判断用户 <span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:1</code></span> 是否对文章 article:1 点赞了:</p><pre style="text-align: left;"><code class="language-sql">> SISMEMBER article:1 uid:1 (integer) 0 # 返回0说明没点赞,返回1则说明点赞了</code></pre><h4 style="text-align: left; line-height: 1.5;">排行榜</h4><p style="text-align: left;">使用<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>sorted set</code></span>(有序set)和一个计算热度的算法便可以轻松打造一个热度排行榜,<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zrevrangebyscore</code></span>可以得到以分数倒序排列的序列,<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zrank</code></span>可以得到一个成员在该排行榜的位置(是分数正序排列时的位置,如果要获取倒序排列时的位置需要用<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zcard</code></span>-<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zrank</code></span>)。</p><p style="text-align: left;">id 为6001 的新闻点击数加1:</p><pre style="text-align: left;"><code class="language-sql">zincrby hotNews:20190926 1 n6001</code></pre><p style="text-align: left;">获取今天点击最多的15条:</p><pre style="text-align: left;"><code class="language-sql">zrevrange hotNews:20190926 0 15 withscores</code></pre><h4 style="text-align: left; line-height: 1.5;">时间线(Timeline)</h4><p style="text-align: left;">list作为双向链表,不光可以作为队列使用。如果将它用作栈便可以成为一个公用的时间轴。当用户发完微博后,都通过lpush将它存放在一个 key 为LATEST_WEIBO的list中,之后便可以通过lrange取出当前最新的微博。</p><h4 style="text-align: start; line-height: 1.5;">计数器应用</h4><p style="text-align: start;">各大网站、APP应用经常需要计数器的功能,如短视频的播放数、电商网站的浏览数。这些播放数、浏览数一般要求实时的,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。</p><h4 style="text-align: start; line-height: 1.5;">共享Session</h4><p style="text-align: start;">如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。</p><h4 style="text-align: start; line-height: 1.5;">分布式锁</h4><p style="text-align: start;">几乎每个互联网公司中都使用了分布式部署,分布式服务下,就会遇到对同一个资源的并发访问的技术难题,如秒杀、下单减库存等场景。</p><ul><li style="text-align: start;">用synchronize或者reentrantlock本地锁肯定是不行的。</li><li style="text-align: start;">如果是并发量不大话,使用数据库的悲观锁、乐观锁来实现没啥问题。</li><li style="text-align: start;">但是在并发量高的场合中,利用数据库锁来控制资源的并发访问,会影响数据库的性能。</li><li style="text-align: start;">实际上,可以用Redis的setnx来实现分布式的锁。</li></ul><h4 style="text-align: start; line-height: 1.5;"><span style="color: rgb(0, 0, 0);">社交网络</span></h4><p style="text-align: start;">赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适保存 这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。</p><h4 style="text-align: start; line-height: 1.5;">消息队列</h4><p style="text-align: start;">消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。</p><h4 style="text-align: start; line-height: 1.5;">位操作</h4><p style="text-align: start;">用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多。这里要用到位操作——使用setbit、getbit、bitcount命令。原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统。</p>
<p><img src="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710523290483.png" alt="https://jsd.onmicrosoft.cn/gh/iGaoWei/codercdn@master/question/20240627/2024062710523290483.png" data-href="" style=""/></p><h4 style="text-align: start;">缓存</h4><p style="text-align: start;">毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效; 一些频繁被访问的数据,经常被访问的数据如果放在关系型数据库,每次查询的开销都会很大,而放在redis中, 因为redis 是放在内存中的可以很高效的访问。</p><h4 style="text-align: left; line-height: 1.5;">抽奖</h4><p style="text-align: left;">利用set结构的无序性,通过 Spop(Redis Spop 命令用于移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素) 随机获得值。</p><h4 style="text-align: left;">点赞、关注收藏</h4><p style="text-align: left;">Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。</p><p style="text-align: left;"><span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:1</code></span> 、<span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:2</code></span>、<span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:3</code></span> 三个用户分别对 article:1 文章点赞了。</p><pre style="text-align: left;"><code class="language-sql"># uid:1 用户对文章 article:1 点赞 > SADD article:1 uid:1 (integer) 1 # uid:2 用户对文章 article:1 点赞 > SADD article:1 uid:2 (integer) 1 # uid:3 用户对文章 article:1 点赞 > SADD article:1 uid:3 (integer) 1</code></pre><p style="text-align: left;"><span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:1</code></span> 取消了对 article:1 文章点赞。</p><pre style="text-align: left;"><code class="language-sql">> SREM article:1 uid:1 (integer) 1</code></pre><p style="text-align: left;">获取 article:1 文章所有点赞用户 :</p><pre style="text-align: left;"><code class="language-sql">> SMEMBERS article:1 1) "uid:3" 2) "uid:2"</code></pre><p style="text-align: left;">获取 article:1 文章的点赞用户数量:</p><pre style="text-align: left;"><code class="language-sql">> SCARD article:1 (integer) 2</code></pre><p style="text-align: left;">判断用户 <span style="color: rgb(100, 149, 237); background-color: rgba(27, 31, 35, 0.05);"><code>uid:1</code></span> 是否对文章 article:1 点赞了:</p><pre style="text-align: left;"><code class="language-sql">> SISMEMBER article:1 uid:1 (integer) 0 # 返回0说明没点赞,返回1则说明点赞了</code></pre><h4 style="text-align: left; line-height: 1.5;">排行榜</h4><p style="text-align: left;">使用<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>sorted set</code></span>(有序set)和一个计算热度的算法便可以轻松打造一个热度排行榜,<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zrevrangebyscore</code></span>可以得到以分数倒序排列的序列,<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zrank</code></span>可以得到一个成员在该排行榜的位置(是分数正序排列时的位置,如果要获取倒序排列时的位置需要用<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zcard</code></span>-<span style="color: rgb(192, 52, 29); background-color: rgb(251, 229, 225); font-size: 12px;"><code>zrank</code></span>)。</p><p style="text-align: left;">id 为6001 的新闻点击数加1:</p><pre style="text-align: left;"><code class="language-sql">zincrby hotNews:20190926 1 n6001</code></pre><p style="text-align: left;">获取今天点击最多的15条:</p><pre style="text-align: left;"><code class="language-sql">zrevrange hotNews:20190926 0 15 withscores</code></pre><h4 style="text-align: left; line-height: 1.5;">时间线(Timeline)</h4><p style="text-align: left;">list作为双向链表,不光可以作为队列使用。如果将它用作栈便可以成为一个公用的时间轴。当用户发完微博后,都通过lpush将它存放在一个 key 为LATEST_WEIBO的list中,之后便可以通过lrange取出当前最新的微博。</p><h4 style="text-align: start; line-height: 1.5;">计数器应用</h4><p style="text-align: start;">各大网站、APP应用经常需要计数器的功能,如短视频的播放数、电商网站的浏览数。这些播放数、浏览数一般要求实时的,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。</p><h4 style="text-align: start; line-height: 1.5;">共享Session</h4><p style="text-align: start;">如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。</p><h4 style="text-align: start; line-height: 1.5;">分布式锁</h4><p style="text-align: start;">几乎每个互联网公司中都使用了分布式部署,分布式服务下,就会遇到对同一个资源的并发访问的技术难题,如秒杀、下单减库存等场景。</p><ul><li style="text-align: start;">用synchronize或者reentrantlock本地锁肯定是不行的。</li><li style="text-align: start;">如果是并发量不大话,使用数据库的悲观锁、乐观锁来实现没啥问题。</li><li style="text-align: start;">但是在并发量高的场合中,利用数据库锁来控制资源的并发访问,会影响数据库的性能。</li><li style="text-align: start;">实际上,可以用Redis的setnx来实现分布式的锁。</li></ul><h4 style="text-align: start; line-height: 1.5;"><span style="color: rgb(0, 0, 0);">社交网络</span></h4><p style="text-align: start;">赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适保存 这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。</p><h4 style="text-align: start; line-height: 1.5;">消息队列</h4><p style="text-align: start;">消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。</p><h4 style="text-align: start; line-height: 1.5;">位操作</h4><p style="text-align: start;">用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多。这里要用到位操作——使用setbit、getbit、bitcount命令。原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统。</p>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Redis
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册