登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 年度开源项目评选中~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
46
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 帐号,请先登录后再操作。
立即登录
没有帐号,去注册