redis从入门到精通之Redis数据结构

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
简介: Redis 是一种基于内存的键值存储数据库,支持多种数据结构和丰富的操作命令,可以用于缓存、消息队列、计数器、排行榜、分布式锁等应用场景。字符串(string)字符串是 Redis 中最基本的数据结构,可以存储字符串、整数和浮点数等类型的数据。常用的操作命令有 SET、GET、INCR、DECR、APPEND 等。列表(list)列表是一种有序的字符串数组,可以实现队列、栈和阻塞队列等功能。常用的操作命令有 LPUSH、RPUSH、LPOP、RPOP、LINDEX 等。集合(set)集合是一种无序的字符串集合,可以实现去重、交集、并集和差集等功能。常用的操作命令有 SADD、SM

数据结构

1. 字符串(string)

特点:

  • 字符串是 Redis 中最基本的数据结构,可以存储常见的字符串、整数和浮点数等类型的数据。
  • Redis 中的字符串最大长度为 512 MB。
  • Redis 中的字符串支持一些特殊的操作,例如追加、自增、自减、获取子串等。

应用场景:

  • 缓存
  • 计数器
  • 分布式锁
    命令示例:
SET name "Tom"
GET name

操作命令:

  • SET:设置键值对,语法为 SET key value,可以设置字符串、整数和浮点数类型的值。
  • GET:获取键的值,语法为 GET key。

其他常用的命令包括 INCR、DECR、APPEND、GETRANGE >等。

2. 列表(list)

特点:

  • 列表是一种有序的字符串数组,支持在两端进行插入和删除操作。
  • Redis 中的列表可以用来实现队列、栈、阻塞队列等。
  • Redis 中的列表最大长度为 232-1 (4294967295) 个元素。

应用场景:

  • 消息队列
  • 阻塞队列
  • 任务队列

示例:

LPUSH names "Tom"
LPUSH names "Jerry"
RPUSH names "Micky"
LPOP names
RPOP names

操作命令:

  • LPUSH:将一个或多个值插入到列表头部,语法为 LPUSH key value1 [value2 ...]。
  • RPUSH:将一个或多个值插入到列表尾部,语法为 RPUSH key value1 [value2 ...]。
  • LPOP:移除并返回列表的第一个元素,语法为 LPOP key。
  • RPOP:移除并返回列表的最后一个元素,语法为 RPOP key。

其他常用的命令包括 LINDEX、LLEN、LRANGE、LINSERT 等。

3. 集合(set)

特点:

  • 集合是一种无序的字符串集合,支持去重、交集、并集和差集等操作。
  • Redis 中的集合底层实现为哈希表,查找、插入和删除操作的时间复杂度为 O(1)。
  • Redis 中的集合最大长度为 232-1 (4294967295) 个元素。

应用场景:

  • 去重
  • 共同好友查找
  • 点赞、收藏等功能的实现

示例:

SADD fruits "apple"
SADD fruits "orange"
SADD fruits "banana"
SMEMBERS fruits

操作命令:

  • SADD:向集合中添加一个或多个元素,语法为 SADD key member1 [member2 ...]。
  • SMEMBERS:返回集合中的所有元素,语法为 SMEMBERS key。
  • SINTER:返回多个集合的交集,语法为 SINTER key1 [key2 ...]。
  • SUNION:返回多个集合的并集,语法为 SUNION key1 [key2 ...]。
  • SDIFF:返回多个集合的差集,语法为 SDIFF key1 [key2 ...]。

其他常用的命令包括 SCARD、SISMEMBER、SREM、SMOVE 等。

4. 散列表(hash)

特点:

  • 散列表是一种键值对集合,可以实现类似于 Java 中的 Map 功能。
  • Redis 中的散列表支持添加、删除和修改操作,并且可以高效地进行查找操作。
  • Redis 中的散列表最大长度为 232-1 (4294967295) 个键值对。
    示例:
HSET user id 1 name "Tom" age 20
HGETALL user

操作命令:

  • HSET:设置散列表中的一个键值对,语法为 HSET key field value。
  • HGETALL:返回散列表中的所有键值对,语法为 HGETALL key。
  • HDEL:删除散列表中的一个或多个键值对,语法为 HDEL key field1 [field2 ...]。
  • HKEYS:返回散列表中的所有键,语法为 HKEYS key。
  • HVALS:返回散列表中的所有值,语法为 HVALS key。

其他常用的命令包括 HGET、HINCRBY、HEXISTS、HLEN 等。
应用场景:

  • 用户信息存储
  • 商品信息存储
  • 博客文章信息存储

5. 有序集合(sorted set)

特点:

  • 有序集合是一种有序的字符串集合,可以实现排行榜和计数器等功能。
  • Redis 中的有序集合底层实现为跳跃表和哈希表,支持高效地添加、删除和查找操作。
  • Redis 中的有序集合最大长度为 232-1 (4294967295) 个元素。

应用场景:

  • 排行榜
  • 热门文章列表
  • 计数器

示例:

ZADD scores 100 "Tom"
ZADD scores 90 "Jerry"
ZADD scores 80 "Micky"
ZRANGE scores 0 -1 WITHSCORES

操作命令:

  • ZADD:向有序集合中添加一个或多个成员,语法为 ZADD key score1 member1 [score2 member2 ...]。
  • ZRANGE:返回有序集合中指定范围内的成员,语法为 ZRANGE key start stop [WITHSCORES]。
  • ZRANK:返回有序集合中成员的排名,语法为 ZRANK key member。
  • ZINCRBY:对有序集合中的一个成员的分数进行自增操作,语法为 ZINCRBY key increment member。
  • ZREVRANGE:返回有序集合中指定范围内的成员,按分数从大到小排序,语法为 ZREVRANGE key start stop [WITHSCORES]。

其他常用的命令包括 ZSCORE、ZCARD、ZREM、ZINTERSTORE、ZUNIONSTORE 等。

其他数据结构

  1. Bitmap 是一种用于存储二进制数据的数据结构,它可以用于实现一些高效的算法,例如布隆过滤器和计数器。在 Redis 中,Bitmap 可以用于存储用户在线状态、用户喜好等数据。

  2. HyperLogLog 是一种用于处理基数问题(即不重复元素数量的问题)的数据结构,它的空间复杂度很小,但是准确性和可靠性都很高。在 Redis 中,HyperLogLog 可以用于统计网站的独立访客数量、统计用户的活跃度等。

  3. GEO 是一种用于处理地理位置数据的数据结构,它可以将地理位置表示为经纬度坐标,并支持一些常见的地理位置操作,例如计算两点之间的距离、查找某个区域内的所有位置等。在 Redis 中,GEO 可以用于实现地理位置服务、附近的人功能等。

以下是一些 Redis 中使用 Bitmap、HyperLogLog、GEO 操作命令的示例:

  1. Bitmap 操作命令:
  • SETBIT key offset value:将 key 对应的 Bitmap 中的第 offset 位设置为 value。
  • GETBIT key offset:获取 key 对应的 Bitmap 中的第 offset 位的值。
  • BITCOUNT key [start end]:统计 key 对应的 Bitmap 中值为 1 的位数。如果指定了 start 和 end 参数,则统计指定区间内的位数。
  • SETBIT key offset value:将 key 对应的 Bitmap 中的第 offset 位设置为 value。
> SETBIT mybitmap 0 1
(integer) 0
> SETBIT mybitmap 2 1
(integer) 0
> SETBIT mybitmap 4 1
(integer) 0
> GETBIT mybitmap 0
(integer) 1
> GETBIT mybitmap 1
(integer) 0
  • GETBIT key offset:获取 key 对应的 Bitmap 中的第 offset 位的值。
> SETBIT mybitmap 0 1
(integer) 0
> SETBIT mybitmap 2 1
(integer) 0
> SETBIT mybitmap 4 1
(integer) 0
> GETBIT mybitmap 0
(integer) 1
> GETBIT mybitmap 1
(integer) 0
  • BITCOUNT key [start end]:统计 key 对应的 Bitmap 中值为 1 的位数。如果指定了 start 和 end 参数,则统计指定区间内的位数。
> SETBIT mybitmap 0 1
(integer) 0
> SETBIT mybitmap 2 1
(integer) 0
> SETBIT mybitmap 4 1
(integer) 0
> BITCOUNT mybitmap
(integer) 3
> BITCOUNT mybitmap 0 1
(integer) 1
  1. HyperLogLog 操作命令:
  • PFADD key element [element ...]:将一个或多个元素添加到 key 对应的 HyperLogLog 中。
  • PFCOUNT key [key ...]:统计一个或多个 HyperLogLog 中的基数。
  • PFMERGE destkey sourcekey [sourcekey ...]:将多个 HyperLogLog 合并为一个 HyperLogLog。
  • PFADD key element [element ...]:将一个或多个元素添加到 key 对应的 HyperLogLog 中。
> PFADD myhyperloglog a b c d e
(integer) 1
> PFADD myhyperloglog e f g h i
(integer) 1
> PFCOUNT myhyperloglog
(integer) 9
  • PFCOUNT key [key ...]:统计一个或多个 HyperLogLog 中的基数。
> PFADD myhyperloglog a b c d e
(integer) 1
> PFADD myhyperloglog e f g h i
(integer) 1
> PFCOUNT myhyperloglog
(integer) 9
> PFCOUNT myhyperloglog1 myhyperloglog2
(integer) 0
  • PFMERGE destkey sourcekey [sourcekey ...]:将多个 HyperLogLog 合并为一个 HyperLogLog。
> PFADD myhyperloglog1 a b c d e
(integer) 1
> PFADD myhyperloglog2 e f g h i
(integer) 1
> PFMERGE myhyperloglog myhyperloglog1 myhyperloglog2
OK
> PFCOUNT myhyperloglog
(integer) 9
  1. GEO 操作命令:
  • GEOADD key longitude latitude member [longitude latitude member ...]:将一个或多个地理位置添加到 key 对应的 GEO 中。
  • GEODIST key member1 member2 [unit]:计算 key 对应的 GEO 中 member1 和 member2 之间的距离。可选的单位包括 m(米)、km(千米)、mi(英里)和 ft(英尺)。
  • GEORADIUS key longitude latitude radius m|km|mi|ft [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]:查找 key 对应的 GEO 中给定经纬度坐标附近的位置。可选的参数包括半径、单位、是否返回坐标、是否返回距离、排序顺序和返回结果数量。
  • GEOADD key longitude latitude member [longitude latitude member ...]:将一个或多个地理位置添加到 key 对应的 GEO 中。
> GEOADD mygeo 116.48105 39.996794 "北京"
(integer) 1
> GEOADD mygeo 121.473701 31.230416 "上海" 114.305392 30.592849 "武汉"
(integer) 2
  • GEODIST key member1 member2 [unit]:计算 key 对应的 GEO 中 member1 和 member2 之间的距离。可选的单位包括 m(米)、km(千米)、mi(英里)和 ft(英尺)。
> GEOADD mygeo 116.48105 39.996794 "北京"
(integer) 1
> GEOADD mygeo 121.473701 31.230416 "上海" 114.305392 30.592849 "武汉"
(integer) 2
> GEODIST mygeo "北京" "上海" km
"1068.9881"
  • GEORADIUS key longitude latitude radius m|km|mi|ft [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]:查找 key 对应的 GEO 中给定经纬度坐标附近的位置。可选的参数包括半径、单位、是否返回坐标、是否返回距离、排序顺序和返回结果数量。
> GEOADD mygeo 116.48105 39.996794 "北京"
(integer) 1
> GEOADD mygeo 121.473701 31.230416 "上海" 114.305392 30.592849 "武汉"
(integer) 2
> GEORADIUS mygeo 116.48105 39.996794 1000 km WITHDIST WITHCOORD
1) 1) "北京"
   2) "0.0000"
   3) 1) "116.48105096817017"
      2) "39.99679395993592"

总结

Redis 支持多种数据结构和操作命令,可以根据不同的业务需求选择合适的数据结构和命令。在实际应用过程中,需要结合具体的业务需求和数据特点进行选择和使用。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
存储 消息中间件 缓存
Redis 5 种基础数据结构?
Redis的五种基础数据结构——字符串、哈希、列表、集合和有序集合——提供了丰富的功能来满足各种应用需求。理解并灵活运用这些数据结构,可以极大地提高应用程序的性能和可扩展性。
59 2
|
3月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
69 5
|
3月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
3月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
10天前
|
缓存 NoSQL 中间件
Redis,分布式缓存演化之路
本文介绍了基于Redis的分布式缓存演化,探讨了分布式锁和缓存一致性问题及其解决方案。首先分析了本地缓存和分布式缓存的区别与优劣,接着深入讲解了分布式远程缓存带来的并发、缓存失效(穿透、雪崩、击穿)等问题及应对策略。文章还详细描述了如何使用Redis实现分布式锁,确保高并发场景下的数据一致性和系统稳定性。最后,通过双写模式和失效模式讨论了缓存一致性问题,并提出了多种解决方案,如引入Canal中间件等。希望这些内容能为读者在设计分布式缓存系统时提供有价值的参考。感谢您的阅读!
Redis,分布式缓存演化之路
|
1月前
|
存储 缓存 NoSQL
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
|
1月前
|
缓存 NoSQL 关系型数据库
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
|
2月前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
2月前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
188 85
|
3月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题