{"content":{"title":"掌握Redis核心：常用数据类型的高效运用秘籍！","body":"在数据驱动的时代，高效地存储和处理数据成为了开发者们的重要任务。Redis，作为一个开源的高性能键值对（key-value）数据库，以其独特的数据结构和丰富的功能，成为了众多项目的首选。\r\n\r\n今天，我们就来揭开Redis的神秘面纱，看看它是如何通过不同的数据类型，为我们提供高效、灵活的数据存储和处理能力的。\r\n\r\n## 一、字符串（String）：数据的基石\r\n\r\n### String类型简介\r\n\r\n字符串是Redis最基本的数据类型，它可以存储文本、数字或者二进制数据。\r\n\r\n使用字符串类型，你可以执行原子性的操作，如追加（APPEND）、设置（SET）和获取（GET）。例如，你可以将用户信息作为字符串存储，并通过键快速检索。\r\n\r\n* 一个key对应一个value。\r\n* String类型是二进制安全的。只要内容可以使用字符串表示就可以存储到string中。比如jpg图片或者序列化的对象。\r\n* 一个Redis中字符串value最多可以是512M。\r\n\r\n### 常用命令\r\n\r\n**set key value：** 添加键值对。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708574872-r0637V.png)\r\n\r\n**get key：** 查询key对应的键值。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708574912-cYqDF5.png)\r\n\r\n注意：如果设置了两次相同的key，后设置的就会把之前的key覆盖掉。\r\n\r\n**append key value：** 将给定的value追加到原值的末尾。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708574944-Y57Ljy.png)\r\n\r\n**strlen key：** 获得值的长度。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708574980-8fV6rA.png)\r\n\r\n**setnx key value：** 只有在key 不存在时 ，才能设置 key 的值。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575026-wNUhG4.png)\r\n\r\n**incr key：** 将 key 中储存的数字值增1（只能对数字值操作，如果为空，新增值为1）。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575079-46g1Po.png)\r\n\r\n**decr key：** 将 key 中储存的数字值减1（只能对数字值操作，如果为空，新增值为-1）。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575111-eDWF30.png)\r\n\r\n**incrby / decrby key 步长：** 通过自定义步长方式增减 key 中储存的数字值。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575158-VDM785.png)\r\n\r\n**mset key1 value1 key2 value2 …：** 同时设置一个或多个键值对。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575188-LY4VkR.png)\r\n\r\n**mget key1 key2 key3 …：** 同时获取一个或多个value。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575209-dgc81L.png)\r\n\r\n**msetnx key1 value1 key2 value2 …：** 所有给定 key 都不存在时，同时设置一个或多个 key-value 对。\r\n\r\n注意：此操作有原子性，只要有一个不符合条件的key。其他的也都不能设置成功。如下图：\\\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575252-J1se8I.png)\r\n\r\n**getrange key 起始位置、结束位置：** 获得值的范围，类似java中的substring。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575291-HTe8A4.png)\r\n\r\n**setrange key 起始位置 value：** 用 value覆写key所储存的字符串值，从起始位置开始(索引从0开始)。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575321-ot5GnT.png)\r\n\r\n**setex key 过期时间 value：** 可以在设置键值的同时，设置过期时间，单位秒（前面的expire是给已有的键值设置过期时间，注意区别）。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575346-sxnqmI.png)\r\n\r\n**getset key value：** 以新换旧，设置了新值同时获得旧值。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575373-Bz856e.png)\r\n\r\n### 应用场景\r\n\r\n**存储用户信息：** 将用户的姓名、年龄等信息作为字符串存储在Redis中，通过键值对的方式快速检索和更新。\r\n\r\n**计数器：** 使用INCR命令实现访问量、点赞数等计数功能。\r\n\r\n## 二、哈希（Hash）：组织数据的框架\r\n\r\n### Hash类型简介\r\n\r\n哈希类型允许你存储字段-值对的集合。这种结构非常适合于存储对象，如用户的个人信息。通过HSET和HGET命令，你可以设置和获取哈希中的字段和值。\r\n\r\n哈希类型的优势在于它可以对字段进行原子性操作，而不需要读取整个对象。\r\n\r\n### 常用命令\r\n\r\n**hset key field value：** 给key集合中的 field 键赋值value。\\\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575449-J75233.png)\r\n\r\n**hget key1 field：** 从key1集合field取出 value。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575472-y5ex4e.png)\r\n\r\n**hmset key1 field1 value1 field2 value2… ：** 批量设置hash的值（一次性设置多个数据值）。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575494-k3cNe6.png)\r\n\r\n**hexists key1 field：** 查看哈希表 key 中，给定域 field 是否存在。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575527-KzvafI.png)\r\n\r\n**hkeys key：** 列出该hash集合的所有field。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575564-kU2Q9t.png)\r\n\r\n**hvals key：** 列出该hash集合的所有value。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575583-5ljGUB.png)\r\n\r\n**hincrby key field increment：** 为哈希表 key 中的域 field 的值加上增量。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575604-mPo9R4.png)\r\n\r\n**hsetnx key field value：** 将哈希表 key 中的域 field 的值设置为 value ，当且仅当域 field 不存在。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575632-y4sH3q.png)\r\n\r\n### 应用场景\r\n\r\n**存储用户对象：** 将用户对象的多个属性（如姓名、年龄、性别等）存储在一个哈希结构中，通过HGETALL命令获取整个对象，或使用HGET/HSET针对某个属性进行操作。\r\n\r\n**存储配置信息：** 将应用程序的配置信息以字段-值对的形式存储在哈希中，方便集中管理和修改。\r\n\r\n## 三、列表（List）：有序数据的队列\r\n\r\n### List类型简介\r\n\r\n列表类型提供了一种顺序存储数据的方式，它类似于Python中的列表或Java中的LinkedList。\r\n\r\n你可以使用LPUSH和RPUSH命令在列表的头部或尾部添加元素。列表还支持范围查询和列表内元素的移除操作，非常适合于实现消息队列等场景。\r\n\r\n* List中单键多值，即一个key对应多个value，其中的多个value值使用List进行存储。\r\n* Redis 列表是简单的字符串列表，按照插入顺序排序。你可以添加一个元素到列表的头部（左边）或者尾部（右边）。\r\n* 它的底层实际是个双向链表，对两端的操作性能很高，通过索引下标的操作中间的节点性能会较差。\r\n\r\n### 常用命令\r\n\r\n**lpush / rpush key value1 value2 value3 … ：** 从左边/右边插入一个或多个值（l代表left，r代表right）。\r\n\r\n**lrange key start stop：** 按照索引下标获得元素（从左到右）。\r\n\r\n其中lrange k1 0 -1表示取出k1中全部value值（0表示左边第一个，-1代表右边第一个）。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575753-1xM39H.png)\r\n\r\n**lpop / rpop key：** 从左边/右边吐出一个值。值在键在，值光键亡。\\\r\npop表示把值拿出来。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575783-5v3nH2.png)\\\r\n图片从左边取出k1的一个value值。如下图：\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575800-vfq0xY.png)\r\n\r\n从右边取出k2的一个value值。如下图：\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575824-1EheO0.png)\r\n\r\nvalue值全部取完的时候，key就没有了。如下图：\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575839-kW21mS.png)\r\n\r\n**rpoplpush key1 key2：** 从key1列表右边吐出一个值，插到key2列表左边。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575860-wh6lkY.png)\r\n\r\n**lindex key index：** 按照索引下标获得元素(从左到右)。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575883-f0aTg8.png)\r\n\r\n**llen key：** 获得列表长度。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575908-1GN2Fg.png)\r\n\r\n**linsert key before value newvalue ：** 在value的前面插入newvalue插入值。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575931-8tg66Q.png)\r\n\r\n**lrem key n value：** 从开始删除n个value(从左到右)图片。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575952-B53H86.png)\r\n\r\n**lset key index value：** 将列表key下标为index的值替换成value。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708575971-7nW344.png)\r\n\r\n### 应用场景\r\n\r\n**消息队列：** 使用LPUSH/RPUSH命令将待处理的消息添加到列表头部/尾部，使用LPOP/RPOP从列表中取出并处理消息。\r\n\r\n**关注列表：** 存储用户关注的其他用户列表，使用LINSERT命令在列表中插入新关注的对象。\r\n\r\n>你还在苦恼找不到真正免费的编程学习平台吗?可以试试【云端源想】！课程视频、知识库、微实战、云实验室、一对一咨询……你想要的全部学习资源这里都有，重点是现在还是免费的！[点这里即可查看！](https://www.ydcode.cn/?sourceId=718)\r\n\r\n## 四、集合（Set）：去重数据的集合\r\n\r\n### Set类型简介\r\n\r\n集合类型用于存储无序且唯一的数据集合。当你需要存储不允许重复的元素时，集合是一个很好的选择。\r\n\r\nSADD命令用于向集合中添加元素，而SMEMBERS可以获取集合中的所有元素。集合还支持交集、并集和差集等高级操作，非常适合于处理标签、好友关系等场景。\r\n\r\nRedis的Set是string类型的无序，不可重复集合。Set底层其实是一个value为null的hash表，所以添加，删除，查找的复杂度都是0(1)。\r\n\r\n### 常用命令\r\n\r\n**sadd key value1 value2 …：** 将一个或多个 member 元素加入到key对应的集合中，已经存在的 member 元素将被忽略\r\n\r\n**smembers key：** 取出key对应的集合中的所有值。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576054-3133Iz.png)\r\n\r\n**sismember key value：** 判断集合是否为含有该value值。1表示有，0表示没有。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576076-0G0531.png)\r\n\r\n**scard key：** 返回key对应集合中的元素个数。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576100-Q9Up9j.png)\r\n\r\n**srem key value1 value2…：** 删除key对应的集合中的某些元素。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576122-5i83Fw.png)\r\n\r\n**spop key：** 随机从key对应的集合中吐出一个值。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576182-Ol87Xn.png)\r\n\r\n**srandmember key n：** 随机从key对应的集合中取出n个值。不会从集合中删除 （rand即为random）。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576208-33TH03.png)\r\n\r\n**smove sourceKey destinationKey value：** 把集合中一个值从一个集合移动到另一个集合。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576231-vyq6lc.png)\r\n\r\n**sinter key1 key2：** 返回两个集合的交集元素\r\n\r\n**sunion key1 key2：** 返回两个集合的并集元素。\r\n\r\n**sdiff key1 key2：** 返回两个集合的差集元素(key1中的，不包含key2中的)。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576278-ysyIOh.png)\r\n\r\n### 应用场景\r\n\r\n**好友关系：** 将用户的好友列表存储在一个集合中，使用SADD命令添加好友，使用SISMEMBER判断某个用户是否为好友。\r\n\r\n**标签系统：** 将文章或商品的标签存储在集合中，使用SUNION/SINTER等命令进行标签的交集、并集操作。\r\n\r\n## 五、有序集合（Sorted Set）\r\n\r\n### Sorted Set类型简介\r\n\r\n有序集合是Redis中的一个高级数据类型，它结合了集合的唯一性和列表的排序功能。\r\n\r\n每个元素都关联一个分数（score），根据分数对元素进行排序。ZADD命令用于添加元素和分数，ZRANGE则可以获取排序后的元素列表。\r\n\r\n注：zset是sorted set的缩写\r\n\r\n### 常用命令\r\n\r\n**zadd key score1 value1 score2 value2…：** 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576388-47XOxl.png)\r\n\r\n**zrange key start stop (withscores)：** 返回有序集 key 中，下标在start和stop之间的元素。（带withscores，可以让分数一起和值返回到结果集）。\r\n\r\n**zrange rank 0 -1 （withscores）：** 表示取出全部元素，从小到大排列。如下图：\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576416-KKnn8x.png)\r\n\r\n**zrangebyscore key min max (withscores)：** 返回有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576439-Byu1h2.png)\r\n\r\n**zrevrangebyscore key max min (withscores)：** 同上，改为从大到小排列（其中rev表示reverse）。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576460-gXe8rJ.png)\r\n\r\n**zincrby key increment value：** 为元素的score加上增量。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576485-ITSR34.png)\r\n\r\n**zrem key value：** 删除该集合下，指定值的元素。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576507-fX876h.png)\r\n\r\n**zcount key min max：** 统计该集合，分数区间内的元素个数。\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576530-EBom19.png)\r\n\r\n**zrank key value：** 返回该值在集合中的排名。（排在第一位的是0）\r\n\r\n![Description](https://ydcqoss.ydcode.cn/ydyx/bbs/1708576550-CC5suE.png)\r\n\r\n### 应用场景\r\n\r\n**排行榜系统：** 可以使用有序集合来存储用户的得分，并根据得分进行排序。\r\n\r\n**带权重的集合：** 有序集合可以用来实现带权重的集合，即每个元素都有一个对应的权重值。\r\n\r\n**时间线排序：** 有序集合可以用于实现时间线排序，即将事件或消息按照时间顺序进行排序。\r\n\r\n## 六、总结\r\n\r\n本篇文章我们探索了Redis的五种常用数据类型及常用命令和使用场景。每一种数据类型都有其独特的优势和适用情况，掌握它们将使你在数据处理的道路上更加得心应手。\r\n\r\n无论是构建缓存系统，还是实现复杂的数据结构，Redis都能提供强有力的支持。希望这篇文章能帮助你更好地理解和运用Redis，让你的项目在数据的世界中脱颖而出。"},"author":{"user":"https://learnblockchain.cn/people/17279","address":null},"history":null,"timestamp":1708596890,"version":1}