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

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 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
目录
相关文章
|
1月前
|
存储 消息中间件 缓存
Redis 5 种基础数据结构?
Redis的五种基础数据结构——字符串、哈希、列表、集合和有序集合——提供了丰富的功能来满足各种应用需求。理解并灵活运用这些数据结构,可以极大地提高应用程序的性能和可扩展性。
33 2
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
46 5
|
2月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
2月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
5月前
|
SQL 存储 NoSQL
Redis6入门到实战------ 一、NoSQL数据库简介
这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
Redis6入门到实战------ 一、NoSQL数据库简介
|
5月前
|
NoSQL 算法 安全
Redis6入门到实战------ 四、Redis配置文件介绍
这篇文章详细介绍了Redis配置文件中的各种设置,包括单位定义、包含配置、网络配置、守护进程设置、日志记录、密码安全、客户端连接限制以及内存使用策略等。
Redis6入门到实战------ 四、Redis配置文件介绍
|
5月前
|
NoSQL Redis 数据安全/隐私保护
Redis6入门到实战------ 二、Redis安装
这篇文章详细介绍了Redis 6的安装过程,包括下载、解压、编译、安装、配置以及启动Redis服务器的步骤。还涵盖了如何设置Redis以在后台运行,如何为Redis设置密码保护,以及如何配置Redis服务以实现开机自启动。
Redis6入门到实战------ 二、Redis安装
|
5月前
|
NoSQL Java Redis
Redis6入门到实战------思维导图+章节目录
这篇文章提供了Redis 6从入门到实战的全面学习资料,包括思维导图和各章节目录,涵盖了NoSQL数据库、Redis安装配置、数据类型、事务、持久化、主从复制、集群等核心知识点。
Redis6入门到实战------思维导图+章节目录
|
5月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
5月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀