<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>redis on 华说记录我的生活</title>
    <link>http://www.huasay.com/tags/redis/</link>
    <description>Recent content in redis on 华说记录我的生活</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Sun, 31 Oct 2021 13:53:50 +0800</lastBuildDate>
    <atom:link href="http://www.huasay.com/tags/redis/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Redis Zset 有序集合</title>
      <link>http://www.huasay.com/2021/10/31/redis-zset/</link>
      <pubDate>Sun, 31 Oct 2021 13:53:50 +0800</pubDate>
      <guid>http://www.huasay.com/2021/10/31/redis-zset/</guid>
      <description>zset是redis中常用的数据结构，一般使用场景是有序集合，排行榜等有序的需求我们会考虑使用。
背景： 最近也是做了相关的需求，用户发动态，将最新动态中的图片，视频或音频资源收集起来，列表中会展示用户最新4条动态的资源缩略图。因为动态还有个审核，所以 一般采集的时候会按审核的时间点采集，但展示却得按照创建时间展示。因此采用了zset的方案，score的值为创建时间，当审核完成时，会将该动态的资源信息以member存储至 zset中，取的时候，按照score(创建时间)由大到小读取
方案实施 存储，简单使用zadd命令，将动态资源信息(一个结构体，json格式化后以字符串形式)存储至zset中，createdAt为score 1 2 3 4 # ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN # 将一个或多个成员元素及其分数值加入到有序集当中 # ZADD file fileInfo createdAt -&amp;gt; ZADD file &amp;#34;{url:&amp;#39;xxx.jpg&amp;#39;,type:1}&amp;#34; 1635661958 维持zset大小，因为只需要取最新4条动态的资源，因此，对于旧的资源信息，可以删除4名开外的动态信息 1 2 3 4 5 6 # ZREMRANGEBYRANK key start stop # 移除有序集中，指定排名(rank)区间内的所有成员。 -&amp;gt; ZRemRangeByRank file 0 -5 # 因为默认是按从小到大排序的，我们如果要取最新的4条动态，需要从排名最小的元素开始删除， # 0代表排名最旧的，排最前的，-5表示排名倒数第5的， # 当zset中的元素超过4时，-5其实就相当于0,所以整个语句相当于删除第4名之后的动态资源信息 获取从大到小顺序的最新4条动态 1 2 3 # ZREVRANGE key start stop [WITHSCORES] # 按分数值递减(从大到小)来排列 -&amp;gt; ZREVRANGE file 0 3 不足之处 因为member的值中有url，有类型等信息，zset的member的长度是过大的，这就导致了并不能用上quickList，只能使用上skipList</description>
    </item>
  </channel>
</rss>
