何为美 發表於 2023-7-20 19:12:00

Redis的五大数据类型及其使用场景

<h1 class="pgc-h-arrow-right">前言</h1>
<p data-track="228">redis是一个非常快速‎‎的非关系数据库‎‎解决方案。其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性。‎redis提供了五种数据类型,分别是是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sort set (有序集合)(其实随着 Redis 版本的更新,后面又支持了四种数据类型:BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增),本文暂不作介绍。)。接下我就给大家介绍一下这五种数据类型的基本用法和使用场景。</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/7ee4a494000440e886b0a9646975ae06~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=vlGS2TkM6CDNn%2Bec8WyP3rDMGcc%3D">
<p class="pgc-img-caption">Redis五大数据类型</p>
</div>
<h1 class="pgc-h-arrow-right" data-track="2">一. String</h1>
<p class="pgc-h-arrow-right" data-track="229"><strong>1、简介</strong></p>
<p data-track="4">字符串类型:实际上可以是字符串(包括XML、JSON)、还有数字(整形、浮点数)、二进制(图片、音频、视频),最大不能超过512MB。</p>
<p class="syl-page-br" data-track="5">&nbsp;</p>
<p data-track="6"><strong>2、常用命令</strong></p>
<p data-track="7">(1)设值命令:</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>set age 23 ex 10 //10秒后过期 px 10000 毫秒过期

setnx name test //不存在键name时,返回1设置成功;存在的话失败0

set age 25 xx //存在键age时,返回1成功</code></pre>
<p data-track="11">(2)获值命令:</p>
<pre class="syl-page-code hljs cs highlighter-hljs"><code>get age //存在则返回value, 不存在返回nil</code></pre>
<p data-track="13">(3)批量设值:</p>
<pre class="syl-page-code hljs nginx highlighter-hljs"><code>mset country china city beijing</code></pre>
<p data-track="14">(4)批量获取:</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>mget country city address //返回china beigjin, address为nil</code></pre>
<p data-track="16">(5)计数命令:</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>incr age //必须为整数自加1,非整数返回错误,无age键从0自增返回1
decr age //整数age减1
incrby age 2 //整数age+2
decrby age 2//整数age -2
incrbyfloat score 1.1 //浮点型score+1.1</code></pre>
<p class="syl-page-br" data-track="22">&nbsp;</p>
<p data-track="23">(6)append追加指令:</p>
<pre class="syl-page-code hljs sql highlighter-hljs"><code>set name hello; append name world //追加后成helloworld</code></pre>
<p data-track="25">(7)字符串长度:</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>set hello “世界”;strlen hello//结果6,每个中文占3个字节</code></pre>
<p data-track="27">(8)截取字符串:</p>
<pre class="syl-page-code hljs sql highlighter-hljs"><code>set name helloworld ; getrange name 2 4//返回 llo</code></pre>
<p class="syl-page-br" data-track="30">&nbsp;</p>
<p data-track="31"><strong>3、使用场景</strong></p>
<p data-track="32">(1) 简单字符缓存</p>
<p data-track="33">(2) 分布式锁</p>
<p data-track="34">(3)计数功能——》计数服务</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>INCR article:001 (文章001阅读数加1)
GET airticle:001</code></pre>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/3a4e83f93e12407ca28b31f93b24fda2~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=SkUOWxfaemUgKYrKvpUSenyVo0Q%3D">
<p class="pgc-img-caption">文章阅读数</p>
</div>
<p data-track="38">(4) 各类场景下(单机或分布式)的标识号</p>
<pre class="syl-page-code hljs yaml highlighter-hljs"><code>Incrby serialNo 1 ——》分给每个服务1000个本地缓存Incrby serialNo 1000</code></pre>
<p data-track="40">(5) 集群环境下的Session共享</p>
<p class="syl-page-br" data-track="41">&nbsp;</p>
<h1 class="pgc-h-arrow-right" data-track="42">二、Hash</h1>
<p data-track="43"><strong>1、简介</strong></p>
<p data-track="44">哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/6ce27b8f635d4697a499c7774b485e6a~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=gepEkrCrsjP3EdKH6vFxbIPB1NQ%3D">
<p class="pgc-img-caption">hash</p>
</div>
<p class="pgc-p syl-page-br" data-track="256">&nbsp;</p>
<p data-track="46"><strong>2、常用命令</strong></p>
<p data-track="47">(1)设值命令:</p>
<p data-track="246">设值:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hset user:1 name james //成功返回1,失败返回0</code></pre>
<p data-track="48">批量设值:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hmset user:2 name james age 23 sex boy //返回OK</code></pre>
<p data-track="250">(2)取值命令:</p>
<p data-track="251">取值:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hget user:1 name //返回james</code></pre>
<p data-track="49">批量取值:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hmget user:2 name age sex //返回三行:james 23 boy</code></pre>
<p data-track="252">(3)删除命令:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hdel user:1 age //返回删除的个数</code></pre>
<p data-track="50">(4)计算个数:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hset user:1 name james;
hset user:1 age 23;
hlen user:1 //返回2,user:1有两个属性值</code></pre>
<p data-track="54">(5)判断field是否存在:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hexists user:2 name //若存在返回1,不存在返回0</code></pre>
<p data-track="55">(6)获取所有field:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hkeys user:2 // 返回name age sex三个field</code></pre>
<p data-track="56">(7)获取user:2所有value:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hvals user:2 // 返回james 23 boy</code></pre>
<p data-track="57">(8)获取user:2所有field与value:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hgetall user:2 //name age sex james 23 boy值</code></pre>
<p data-track="58">(9)增加1:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>hincrby user:2 age 1 //age+1
hincrbyfloat user:2 age 2 //浮点型加2</code></pre>
<p class="syl-page-br" data-track="62">&nbsp;</p>
<p data-track="63"><strong>3 、使用场景</strong></p>
<p data-track="64">(1) 存储对象</p>
<p data-track="65">实例:购物车</p>
<p class="syl-line-pure-english" data-track="66">Hmset cart:001 prod:01 1 prod:02 1</p>
<p data-track="67">当前登录用户ID号为key,商品ID号为Field,加入购物车数量为value</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p26-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/b8376062cabe4fefb3193517189fa6e4~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=dtnhUQF9x%2Fh1w2RY6KKuPD5Hv2k%3D">
<p class="pgc-img-caption">购物车展示</p>
</div>
<h1 class="pgc-h-arrow-right" data-track="86">三、 List</h1>
<p data-track="89">1、<strong>简介</strong></p>
<p data-track="90">用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素。因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/a2b96358c9ae43f7b3aa0410cd05ad95~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=aa4cisUqNiTNC6F2YTWNa3lb89Y%3D">
<p class="pgc-img-caption">list</p>
</div>
<p data-track="93">2、<strong>常用命令</strong></p>
<p data-track="94">(1)添加命令:</p>
<pre class="syl-page-code hljs swift highlighter-hljs"><code>rpush james c b a //从右向左插入cba, 返回值3
lrange james 0 -1 //从左到右获取列表所有元素 返回 c b a
lpush key c b a //从左向右插入cba
linsert james before b teacher //在b之前插入teacher, after为之后,使 用lrange james 0 -1 查看:c teacher b a</code></pre>
<p class="pgc-p syl-page-br" data-track="100">&nbsp;</p>
<p data-track="255">(2)查找命令:</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>lrange key start end //索引下标特点:从左到右为0到N-1
lindex james -1 //返回最右末尾a,-2返回b
llen james //返回当前列表长度
lpop james //把最左边的第一个元素c删除
rpop james //把最右边的元素a删除</code></pre>
<p class="syl-page-br" data-track="107">&nbsp;</p>
<p data-track="108"><strong>3、使用场景</strong></p>
<p data-track="110">(1)利用List实现栈、队列</p>
<p data-track="111">1.先进后出:栈 = LPUSH+LPOP-&gt;FILO</p>
<p data-track="112">2.先进先出:队列=LPUSH+RPOP</p>
<p data-track="114">3.Blocking MQ(堵塞队列)= LPUSH+BRPOP</p>
<p class="pgc-p syl-page-br" data-track="281">&nbsp;</p>
<p data-track="257">(2)redis做消息队列(不推荐使用redis做消息队列)</p>
<p data-track="115">下面以订单为例子进行演示:</p>
<ol start="1">
<li>每个用户有多个订单key为 order:1 order:2 order:3, 结合hmset</li>
</ol>
<pre class="syl-page-code hljs yaml highlighter-hljs"><code>hmset order:1 orderId 1 money 36.6 time 2018-01-01
hmset order:2 orderId 2 money 38.6 time 2018-01-01
hmset order:3 orderId 3 money 39.6 time 2018-01-01</code></pre>
<ol start="2">
<li>把订单信息的key放到队列</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>lpush user:1:order order:1 order:2 order:3</code></pre>
<ol start="3">
<li>新产生了一个订单order:4,</li>
</ol>
<pre class="syl-page-code hljs yaml highlighter-hljs"><code>hmset order:4 orderId 4 money 40.6 time 2018-01-01</code></pre>
<ol start="4">
<li>追加一个order:4放入队列第一个位置</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>lpush user:1:order order:4</code></pre>
<ol start="5">
<li>当需要查询用户订单记录时:</li>
</ol>
<pre class="syl-page-code hljs yaml highlighter-hljs"><code>List orderKeys = lrange user:1:order 0 -1 //查询user:1 的所有订单key值
for(Order order: orderKeys){
                hmget order:1
}</code></pre>
<p class="pgc-p syl-page-br" data-track="116">&nbsp;</p>
<p data-track="280">(3)列表缓存</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/fcb884ae33a947cd931b307098aa59ce~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=%2F5mIaTDbPtBDhn0BDGeSzjhMN08%3D">
<p class="pgc-img-caption">微信订阅号展示</p>
</div>
<p class="pgc-p syl-page-br" data-track="277">&nbsp;</p>
<p data-track="421">小明微信号ID:001,他关注了顶级架构师、爱敲代码的小黄、程序员蜗牛上图的展示效果应该如何设计?</p>
<ol start="1">
<li data-track="282">顶级架构师发布了一条文章ID为100的文章</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>lpush:mes:001 100</code></pre>
<ol start="2">
<li data-track="304">爱敲代码的小黄发布了一条文章ID为101的文章</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>lpush:mes:001 101</code></pre>
<ol start="3">
<li data-track="306">程序员蜗牛发布了一条文章ID为102的文章</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>lpush:mes:001 102</code></pre>
<ol start="4">
<li data-track="308">小明的微信订阅号列表实现如下</li>
</ol>
<pre class="syl-page-code hljs yaml highlighter-hljs"><code>lrange mes:001 0 5</code></pre>
<p class="syl-page-br" data-track="224">&nbsp;</p>
<h1 class="pgc-h-arrow-right" data-track="137">四、Set</h1>
<p data-track="138"><strong>1、简介</strong></p>
<p data-track="139">保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/a47f61b68aff4ae894d29ef4e1a1d22c~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=yHfiCYHdCrjVkF0kydU1qLw5Hio%3D">
<p class="pgc-img-caption">sey</p>
</div>
<p data-track="142"><strong>2、常用命令</strong></p>
<p data-track="310">(1)检查user键值是否存在</p>
<pre class="syl-page-code hljs nginx highlighter-hljs"><code>exists user&nbsp;</code></pre>
<p data-track="144">(2)设置命令:</p>
<pre class="syl-page-code hljs swift highlighter-hljs"><code>sadd user a b c//向user插入3个元素,返回3
sadd user a b //若再加入相同的元素,则重复无效,返回0</code></pre>
<p data-track="146">(3)查找命令:</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>smember user //获取user的所有元素,返回结果无序</code></pre>
<p data-track="147">(4)删除命令:</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>srem user a //返回1,删除a元素</code></pre>
<p data-track="148">(5)计算元素个数</p>
<pre class="syl-page-code hljs cpp highlighter-hljs"><code>scard user //返回2,计算元素个数</code></pre>
<p class="pgc-p syl-page-br" data-track="151">&nbsp;</p>
<p data-track="350">3、Set 集合特殊的操作指令</p>
<p data-track="351">(1)集合与集合之间的交集</p>
<pre class="syl-page-code hljs properties highlighter-hljs"><code>sinter setA setB -&gt; 得到集合 {B,C}</code></pre>
<p data-track="353">(2)集合与集合之间的并集</p>
<pre class="syl-page-code hljs properties highlighter-hljs"><code>sunion setA setB --&gt;得到集合{A,B,C}</code></pre>
<p data-track="355">(3)集合与集合之间的差集</p>
<pre class="syl-page-code hljs properties highlighter-hljs"><code>sdiff setA setB--&gt;得到集合{A}</code></pre>
<p class="syl-page-br" data-track="357">&nbsp;</p>
<p data-track="153"><strong>4、使用场景:</strong></p>
<p data-track="154">(1)标签,社交,查询有共同兴趣爱好的人,智能推荐</p>
<p data-track="155">使用方式:</p>
<p data-track="156">给用户添加标签:</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>sadd user:1:fav basball fball pq
sadd user:2:fav basball fball
............</code></pre>
<p class="pgc-p syl-page-br" data-track="161">&nbsp;</p>
<p data-track="314">或给标签添加用户</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>sadd basball:users user:1 user:2
sadd fball:users user:1 user:2
........</code></pre>
<p class="pgc-p syl-page-br" data-track="166">&nbsp;</p>
<p data-track="315">计算出共同感兴趣的人:</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>sinter user:1:fav user2:fav</code></pre>
<p class="syl-page-br" data-track="172">&nbsp;</p>
<p data-track="173">(2)抽奖</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/f3d9e974e41c4e97a61cae2293e68013~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=HSZc8RDTlgiEX5MIF8%2FKIJS2Uys%3D">
<p class="pgc-img-caption">微信抽奖</p>
</div>
<p class="pgc-p syl-page-br" data-track="318">&nbsp;</p>
<p data-track="319">微信有一个活动,活动ID为001,如何实现微信抽奖功能,基于Redis设计实现?</p>
<p data-track="320">假设小明的userId为: 004</p>
<ol start="1">
<li>当小明点击参与抽奖时,数据放入set集合</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>sadd active:001 004</code></pre>
<ol start="2">
<li>开始抽奖2名中奖者(随机)</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>srandmember active:001 2</code></pre>
<p data-track="325">或者</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code> spop act:001 2</code></pre>
<ol start="3">
<li>查看有多少用户参加了本次抽奖</li>
</ol>
<pre class="syl-page-code hljs css highlighter-hljs"><code>smembers active:001</code></pre>
<p class="pgc-p syl-page-br" data-track="176">&nbsp;</p>
<p data-track="394">(3)朋友圈点赞</p>
<p data-track="378">朋友圈消息ID:008,微信点赞如何设计?</p>
<p data-track="380">张三用户ID 为userId:01</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/152c539c6f024420bf66a10319508253~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=0FftXTD1iWgjXLqPybJIMJrjIE4%3D">
<p class="pgc-img-caption">朋友圈点赞</p>
</div>
<p class="pgc-p syl-page-br" data-track="381">&nbsp;</p>
<p data-track="422">(1)张三对消息ID008点赞啦</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>sadd zan:008 userId:01</code></pre>
<p data-track="383">(2)张三取消了对消息008的点赞</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>srem zan:008 userId:01</code></pre>
<p data-track="385">(3)检查用户是否点过赞</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>sismember zan:008 userId:01</code></pre>
<p data-track="387">(4)获取消息ID008所有的点赞用户列表</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>smembers zan:008</code></pre>
<p data-track="389">(5)消息ID008的点赞数计算</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>scard zan:008</code></pre>
<p class="syl-page-br" data-track="391">&nbsp;</p>
<p class="pgc-p syl-page-br" data-track="379">&nbsp;</p>
<p data-track="177">(4)Set集合特殊的操作指令应用场景</p>
<p data-track="178">如何实现微博的微关系设计?</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p9-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/02902a172c6b4f1c8a4fb7ddba82d29f~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=P8AG4JjbGaR4I4lav6qhQdAsVyQ%3D">
<p class="pgc-img-caption">微博关注</p>
</div>
<p data-track="358"><strong>条件:</strong></p>
<p data-track="358">1 James关注的人</p>
<pre class="syl-page-code hljs nginx highlighter-hljs"><code>sadd jamesCares Irving,peter,king,jack</code></pre>
<p data-track="360">条件2 Irving关注的人</p>
<pre class="syl-page-code hljs nginx highlighter-hljs"><code>sadd IrvingCares james,jack,cjk,king</code></pre>
<p data-track="362">条件3 jack关注的人</p>
<pre class="syl-page-code hljs nginx highlighter-hljs"><code>sadd avCares deer,cjk,king</code></pre>
<p class="pgc-p syl-page-br" data-track="364">&nbsp;</p>
<p data-track="377"><strong>计算:</strong></p>
<p data-track="365">计算1 James和Irving共同关注的人</p>
<pre class="syl-page-code hljs properties highlighter-hljs"><code>sinter jamesCares IrvingCares , 计算结果为 {jack, king}</code></pre>
<p data-track="367">计算2 我关注的人也关注他(king)</p>
<pre class="syl-page-code hljs properties highlighter-hljs"><code>sismember IrvingCares king
sismember avCares king</code></pre>
<p data-track="370">计算3 我可能认识的人</p>
<pre class="syl-page-code hljs properties highlighter-hljs"><code>SDIFF IrvingCares jamesCares-&gt; {james.cjk}</code></pre>
<p class="syl-page-br" data-track="179">&nbsp;</p>
<h1 class="pgc-h-arrow-right" data-track="180">五、ZSet</h1>
<p class="pgc-h-arrow-right" data-track="397"><strong>1、简介</strong></p>
<p data-track="182">常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复成员</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/781167b265a642f593b045a24bf0d48e~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=G46dl5q9ecrsiAKp%2F%2Bkhwq740D8%3D">
<p class="pgc-img-caption">zset</p>
</div>
<p data-track="398"><strong>2、常用命令</strong></p>
<p data-track="399">(1)添加命令</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>zadd key score member
zadd user:zan 200 james //james的点赞数1, 返回操作成功的条数1
zadd user:zan 200 james 120 mike 100 lee// 返回3
zadd test:1 nx 100 james //键test:1必须不存在,主用于添加
zadd test:1 xx incr 200 james //键test:1必须存在,主用于修改,此时为300
zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1</code></pre>
<p data-track="192">(2)查询命令</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>zrange test:1 0 -1 withscores //查看点赞(分数)与成员名</code></pre>
<p class="pgc-p syl-page-br" data-track="195">&nbsp;</p>
<p data-track="401">(3)计算成员个数</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>zcard test:1 //计算成员个数, 返回1</code></pre>
<p class="syl-page-br" data-track="196">&nbsp;</p>
<p data-track="197"><strong>3、使用场景</strong></p>
<p data-track="198"><strong>排名场景:</strong></p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>zadd user:3 200 james 120 mike 100 lee//先插入数据
zrange user:3 0 -1 withscores //查看分数与成员
zrank user:3 james //返回名次:第3名返回2,从0开始到2,共3名
zrevrank user:3 james //返回0, 反排序,点赞数越高,排名越前</code></pre>
<p class="syl-page-br" data-track="204">&nbsp;</p>
<p data-track="205">排行榜系统,如视频网站需要对用户上传的视频做排行榜</p>
<p data-track="206">点赞数:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>zadd user:1:20180106 3 mike //mike获得3个赞</code></pre>
<p data-track="208">再获一赞:</p>
<pre class="syl-page-code hljs less highlighter-hljs"><code>zincrby user:1:20180106 1 mike //在3的基础上加1</code></pre>
<p data-track="210">用户作弊,将用户从排行榜删掉:</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>zrem user:1:20180106 mike</code></pre>
<p data-track="212">展示赞数最多的5个用户:</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>zrevrangebyrank user:1:20180106 0 4</code></pre>
<p data-track="214">查看用户赞数与排名:</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>zscore user:1:20180106 mike zrank user:1:20180106 mike</code></pre>
<p class="syl-page-br" data-track="216">&nbsp;</p>
<p data-track="217"><strong>实例</strong></p>
<p data-track="402">以最典型的微博热搜为例,描述用Redis设计实现, 以日期做为Key</p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/0ca8ba3d67724f04a7003d6333c28a38~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=wPCtGJNDvDBAgnNEL67TJ14iEOo%3D">
<p class="pgc-img-caption">微博热搜展示</p>
</div>
<p class="pgc-p syl-page-br" data-track="415">&nbsp;</p>
<p data-track="403">(1)点击话题</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>zincrby topic:20230717 1 狗头萝莉</code></pre>
<p data-track="405">(2)上图排行实现,展示今日前10排名</p>
<pre class="syl-page-code hljs yaml highlighter-hljs"><code>zrevrange topic:20230717 0 9 withscores</code></pre>
<p data-track="407">(3)统计近3日点击数据</p>
<pre class="syl-page-code hljs css highlighter-hljs"><code>zunionstore topic:3day 3 </code></pre>
<p data-track="409">(4) 展示近3日的排行前10名</p>
<p class="syl-line-pure-english" data-track="410">zrevrange topic:20230717-20230717 0 9 withscores</p>
<p class="syl-page-br" data-track="411">&nbsp;</p>
<p data-track="219"><strong>4、ZSet和List、Set对比</strong></p>
<div class="pgc-img"><img class="syl-page-img lazyload" data-src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/a680eb31de3548b3bad3ee3ac5e66455~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1690455992&amp;x-signature=lFGKrk2%2F6UtR0%2FIYoNOB%2FKV1LTk%3D">
<p class="pgc-img-caption">ZSet和List、Set对比</p>
</div><br><br>
来源:https://www.cnblogs.com/fhey/p/17569425.html
頁: [1]
查看完整版本: Redis的五大数据类型及其使用场景