掌握Redis核心:常用数据类型的高效运用秘籍!

YunDuanCode · · 762 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在数据驱动的时代,高效地存储和处理数据成为了开发者们的重要任务。Redis,作为一个开源的高性能键值对(key-value)数据库,以其独特的数据结构和丰富的功能,成为了众多项目的首选。 今天,我们就来揭开Redis的神秘面纱,看看它是如何通过不同的数据类型,为我们提供高效、灵活的数据存储和处理能力的。 ### 一、字符串(String):数据的基石 #### String类型简介 字符串是Redis最基本的数据类型,它可以存储文本、数字或者二进制数据。 使用字符串类型,你可以执行原子性的操作,如追加(APPEND)、设置(SET)和获取(GET)。例如,你可以将用户信息作为字符串存储,并通过键快速检索。 - 一个key对应一个value。 - String类型是二进制安全的。只要内容可以使用字符串表示就可以存储到string中。比如jpg图片或者序列化的对象。 - 一个Redis中字符串value最多可以是512M。 #### 常用命令 set key value: 添加键值对。 ![image.png](https://static.golangjob.cn/240222/fa7d877b9446cf31fa8739a4d509ee0f.png) get key: 查询key对应的键值。 ![image.png](https://static.golangjob.cn/240222/e72bc8325c87b18e49d30170c47a8721.png) 注意:如果设置了两次相同的key,后设置的就会把之前的key覆盖掉。 append key value: 将给定的value追加到原值的末尾。 ![image.png](https://static.golangjob.cn/240222/a2ca50a621bba6940bdb483c0d521f95.png) strlen key: 获得值的长度。 ![image.png](https://static.golangjob.cn/240222/be28f0d27806df97df4efca1b7b342dc.png) setnx key value: 只有在key 不存在时 ,才能设置 key 的值。 ![image.png](https://static.golangjob.cn/240222/87d63a459e8c1573eb0f88a932e47d1b.png) incr key: 将 key 中储存的数字值增1(只能对数字值操作,如果为空,新增值为1)。 ![image.png](https://static.golangjob.cn/240222/c3cbb8b704ddeef026c5bee5629f72d5.png) decr key: 将 key 中储存的数字值减1(只能对数字值操作,如果为空,新增值为-1)。 ![image.png](https://static.golangjob.cn/240222/a7fda7ed68d67d5dd66f6f498df7ae58.png) incrby / decrby key 步长: 通过自定义步长方式增减 key 中储存的数字值。 ![image.png](https://static.golangjob.cn/240222/6fc24872d15f7d9691f8f8121c6f7408.png) mset key1 value1 key2 value2 …: 同时设置一个或多个键值对。 ![image.png](https://static.golangjob.cn/240222/63755c27cd36e6a5d97ea1498616baf0.png) mget key1 key2 key3 …: 同时获取一个或多个value。 ![image.png](https://static.golangjob.cn/240222/6b58cec1df7276d9e5b5186317fe605a.png) msetnx key1 value1 key2 value2 …: 所有给定 key 都不存在时,同时设置一个或多个 key-value 对。 注意:此操作有原子性,只要有一个不符合条件的key。其他的也都不能设置成功。如下图: ![image.png](https://static.golangjob.cn/240222/cdf7a776d0aba66e540d5b9bc9f05865.png) getrange key 起始位置、结束位置: 获得值的范围,类似java中的substring。 ![image.png](https://static.golangjob.cn/240222/a577c777c543b702a1a2b3408e9d4a98.png) setrange key 起始位置 value: 用 value覆写key所储存的字符串值,从起始位置开始(索引从0开始)。 ![image.png](https://static.golangjob.cn/240222/1e958ba4ef1a90f008476e41bbf0ec19.png) setex key 过期时间 value: 可以在设置键值的同时,设置过期时间,单位秒(前面的expire是给已有的键值设置过期时间,注意区别)。 ![image.png](https://static.golangjob.cn/240222/de7c6618000153ad02386ffde99205ef.png) getset key value: 以新换旧,设置了新值同时获得旧值。 ![image.png](https://static.golangjob.cn/240222/2fd9aaa4da8204ba1df1f7648cab3a7c.png) #### 应用场景 **存储用户信息:** 将用户的姓名、年龄等信息作为字符串存储在Redis中,通过键值对的方式快速检索和更新。 **计数器:** 使用INCR命令实现访问量、点赞数等计数功能。 ### 二、哈希(Hash):组织数据的框架 #### Hash类型简介 哈希类型允许你存储字段-值对的集合。这种结构非常适合于存储对象,如用户的个人信息。通过HSET和HGET命令,你可以设置和获取哈希中的字段和值。 哈希类型的优势在于它可以对字段进行原子性操作,而不需要读取整个对象。 #### 常用命令 hset key field value: 给key集合中的 field 键赋值value。 ![image.png](https://static.golangjob.cn/240222/b2961909f103da0b7d436d8669e6547c.png) hget key1 field: 从key1集合field取出 value。 ![image.png](https://static.golangjob.cn/240222/3d9eb707809858e976ded9cf01744fee.png) hmset key1 field1 value1 field2 value2… : 批量设置hash的值(一次性设置多个数据值)。 ![image.png](https://static.golangjob.cn/240222/4f1601ead1c940ff409e5bb32a35fef5.png) hexists key1 field: 查看哈希表 key 中,给定域 field 是否存在。 ![image.png](https://static.golangjob.cn/240222/c627edb701624b0fa2c1e8938c8f187b.png) hkeys key: 列出该hash集合的所有field。 ![image.png](https://static.golangjob.cn/240222/c5cfa87a7ee95ca7f5b2c57f024e45f1.png) hvals key: 列出该hash集合的所有value。 ![image.png](https://static.golangjob.cn/240222/e444df6a1a88d9193c32068bc523448f.png) hincrby key field increment: 为哈希表 key 中的域 field 的值加上增量。 ![image.png](https://static.golangjob.cn/240222/482da018141c8e54bd73a91ae5895364.png) hsetnx key field value: 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。 ![image.png](https://static.golangjob.cn/240222/42205b4ae1e97c73e37791410cc8a49c.png) #### 应用场景 **存储用户对象:** 将用户对象的多个属性(如姓名、年龄、性别等)存储在一个哈希结构中,通过HGETALL命令获取整个对象,或使用HGET/HSET针对某个属性进行操作。 **存储配置信息:** 将应用程序的配置信息以字段-值对的形式存储在哈希中,方便集中管理和修改。 ### 三、列表(List):有序数据的队列 #### List类型简介 列表类型提供了一种顺序存储数据的方式,它类似于Python中的列表或Java中的LinkedList。 你可以使用LPUSH和RPUSH命令在列表的头部或尾部添加元素。列表还支持范围查询和列表内元素的移除操作,非常适合于实现消息队列等场景。 - List中单键多值,即一个key对应多个value,其中的多个value值使用List进行存储。 - Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 - 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。 #### 常用命令 lpush / rpush key value1 value2 value3 … :从左边/右边插入一个或多个值(l代表left,r代表right)。 lrange key start stop:按照索引下标获得元素(从左到右)。 其中lrange k1 0 -1表示取出k1中全部value值(0表示左边第一个,-1代表右边第一个)。 ![image.png](https://static.golangjob.cn/240222/73cbd5e350714983850de09b490844c5.png) lpop / rpop key: 从左边/右边吐出一个值。值在键在,值光键亡。 pop表示把值拿出来。 ![image.png](https://static.golangjob.cn/240222/9ba687a37d8be3a10200b11b32831160.png) 图片从左边取出k1的一个value值。如下图: ![image.png](https://static.golangjob.cn/240222/10792ff992f3f22bad4fabaf71dac5cb.png) 从右边取出k2的一个value值。如下图: ![image.png](https://static.golangjob.cn/240222/ae16cb61745463bc688acb93074fa37a.png) value值全部取完的时候,key就没有了。如下图: ![image.png](https://static.golangjob.cn/240222/36e0f9cb9ede75a06fd21a6e525e72b2.png) rpoplpush key1 key2: 从key1列表右边吐出一个值,插到key2列表左边。 ![image.png](https://static.golangjob.cn/240222/e73238af4146d9822c5bb2ed0c43e4ae.png) lindex key index: 按照索引下标获得元素(从左到右)。 ![image.png](https://static.golangjob.cn/240222/89a33d6aeaa0913bb3533a0b84b3f503.png) llen key: 获得列表长度。 ![image.png](https://static.golangjob.cn/240222/05772958542cb68e5401c143bb072c74.png) linsert key before value newvalue : 在value的前面插入newvalue插入值。 ![image.png](https://static.golangjob.cn/240222/7d79e5c179c5815afeeb1539df84efc8.png) lrem key n value: 从开始删除n个value(从左到右)图片。 ![image.png](https://static.golangjob.cn/240222/4169ca6f202a95a0a42995c7e5fe9840.png) lset key index value: 将列表key下标为index的值替换成value。 ![image.png](https://static.golangjob.cn/240222/f5a986a01bcc2b6f013da5ec34bddd03.png) #### 应用场景 **消息队列:** 使用LPUSH/RPUSH命令将待处理的消息添加到列表头部/尾部,使用LPOP/RPOP从列表中取出并处理消息。 **关注列表:** 存储用户关注的其他用户列表,使用LINSERT命令在列表中插入新关注的对象。 >在这里给大家分享一下【云端源想】学习平台,无论你是初学者还是有经验的开发者,这里都有你需要的一切。包含课程视频、知识库、微实战、云实验室、一对一咨询等等,现在功能全部是免费的,[点击这里,立即开始你的学习之旅!](https://www.ydcode.cn/?sourceId=716) ### 四、集合(Set):去重数据的集合 #### Set类型简介 集合类型用于存储无序且唯一的数据集合。当你需要存储不允许重复的元素时,集合是一个很好的选择。 SADD命令用于向集合中添加元素,而SMEMBERS可以获取集合中的所有元素。集合还支持交集、并集和差集等高级操作,非常适合于处理标签、好友关系等场景。 Redis的Set是string类型的无序,不可重复集合。Set底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是0(1)。 #### 常用命令 sadd key value1 value2 …: 将一个或多个 member 元素加入到key对应的集合中,已经存在的 member 元素将被忽略 smembers key: 取出key对应的集合中的所有值。 ![image.png](https://static.golangjob.cn/240222/095d73d805f5e90927d8c09518703350.png) sismember key value: 判断集合是否为含有该value值。1表示有,0表示没有。 ![image.png](https://static.golangjob.cn/240222/e327a2f8b86a9bea09cdba74b45848fd.png) scard key: 返回key对应集合中的元素个数。 ![image.png](https://static.golangjob.cn/240222/01d517a13cba28418957fc314c1ecaa2.png) srem key value1 value2…: 删除key对应的集合中的某些元素。 ![image.png](https://static.golangjob.cn/240222/872efac8e20166f24bbda6335c3c3aa5.png) spop key: 随机从key对应的集合中吐出一个值。 ![image.png](https://static.golangjob.cn/240222/41dfdb238720afba2d333e1997b7a10c.png) srandmember key n: 随机从key对应的集合中取出n个值。不会从集合中删除 (rand即为random)。 ![image.png](https://static.golangjob.cn/240222/eee75007ef69c97aba8380ed19a51f59.png) smove sourceKey destinationKey value: 把集合中一个值从一个集合移动到另一个集合。 ![image.png](https://static.golangjob.cn/240222/f9cbaf6062654e8c7c7ae4fa2845bd62.png) sinter key1 key2: 返回两个集合的交集元素 sunion key1 key2: 返回两个集合的并集元素。 sdiff key1 key2: 返回两个集合的差集元素(key1中的,不包含key2中的)。 ![image.png](https://static.golangjob.cn/240222/f69d408992a1aeb5665200254608ba88.png) #### 应用场景 **好友关系:** 将用户的好友列表存储在一个集合中,使用SADD命令添加好友,使用SISMEMBER判断某个用户是否为好友。 **标签系统:** 将文章或商品的标签存储在集合中,使用SUNION/SINTER等命令进行标签的交集、并集操作。 ### 五、有序集合(Sorted Set) #### Sorted Set类型简介 有序集合是Redis中的一个高级数据类型,它结合了集合的唯一性和列表的排序功能。 每个元素都关联一个分数(score),根据分数对元素进行排序。ZADD命令用于添加元素和分数,ZRANGE则可以获取排序后的元素列表。 注:zset是sorted set的缩写 #### 常用命令 zadd key score1 value1 score2 value2…: 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 ![image.png](https://static.golangjob.cn/240222/6db346d366ee7f5bcb6125a8e6f35b0a.png) zrange key start stop (withscores): 返回有序集 key 中,下标在start和stop之间的元素。(带withscores,可以让分数一起和值返回到结果集)。 zrange rank 0 -1 (withscores): 表示取出全部元素,从小到大排列。如下图: ![image.png](https://static.golangjob.cn/240222/58eeffc7fd868aca4d9206e18a2576ec.png) zrangebyscore key min max (withscores): 返回有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 ![image.png](https://static.golangjob.cn/240222/ead365d3c818b0dcaae1c803df03932a.png) zrevrangebyscore key max min (withscores): 同上,改为从大到小排列(其中rev表示reverse)。 ![image.png](https://static.golangjob.cn/240222/ec59b71e37f46d1539f25eabaf0fe37e.png) zincrby key increment value: 为元素的score加上增量。 ![image.png](https://static.golangjob.cn/240222/800f6f5b80ae510a3c5b306443c79c32.png) zrem key value: 删除该集合下,指定值的元素。 ![image.png](https://static.golangjob.cn/240222/9dbf673bf9363b7e42048467a8d4aef3.png) zcount key min max: 统计该集合,分数区间内的元素个数。 ![image.png](https://static.golangjob.cn/240222/a3404b0cdd68013f42f4e52f762a8ee0.png) zrank key value: 返回该值在集合中的排名。(排在第一位的是0) ![image.png](https://static.golangjob.cn/240222/870b87a565dafc76be203633ae108457.png) #### 应用场景 **排行榜系统:** 可以使用有序集合来存储用户的得分,并根据得分进行排序。 **带权重的集合:** 有序集合可以用来实现带权重的集合,即每个元素都有一个对应的权重值。 **时间线排序:** 有序集合可以用于实现时间线排序,即将事件或消息按照时间顺序进行排序。 ### 六、总结 本篇文章我们探索了Redis的五种常用数据类型及常用命令和使用场景。每一种数据类型都有其独特的优势和适用情况,掌握它们将使你在数据处理的道路上更加得心应手。 无论是构建缓存系统,还是实现复杂的数据结构,Redis都能提供强有力的支持。希望这篇文章能帮助你更好地理解和运用Redis,让你的项目在数据的世界中脱颖而出。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

762 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传