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

简介: 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 支持多种数据结构和操作命令,可以根据不同的业务需求选择合适的数据结构和命令。在实际应用过程中,需要结合具体的业务需求和数据特点进行选择和使用。

目录
相关文章
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
729 0
|
7月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
413 86
|
7月前
|
存储 消息中间件 NoSQL
Redis数据结构:别小看这5把“瑞士军刀”,用好了性能飙升!
Redis提供5种基础数据结构及多种高级结构,如String、Hash、List、Set、ZSet,底层通过SDS、跳表等实现高效操作。灵活运用可解决缓存、计数、消息队列、排行榜等问题,结合Bitmap、HyperLogLog、GEO更可应对签到、UV统计、地理位置等场景,是高性能应用的核心利器。
|
7月前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
217 12
|
7月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
11月前
|
存储 NoSQL 算法
Redis设计与实现——数据结构与对象
Redis 是一个高性能的键值存储系统,其数据结构设计精妙且高效。主要包括以下几种核心数据结构:SDS、链表、字典、跳跃表、整数集合、压缩列表。此外,Redis 对象通过类型和编码方式动态转换,优化内存使用,并支持引用计数、共享对象和淘汰策略(如 LRU/LFU)。这些特性共同确保 Redis 在性能与灵活性之间的平衡。
438 12
|
存储 消息中间件 NoSQL
Redis 数据结构与对象
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求和数据特点来选择合适的数据结构,并合理地设计数据模型,以充分发挥 Redis 的优势。
492 161
|
存储 NoSQL 算法
「Redis」数据结构与对象
Redis数据结构与对象介绍
188 0
|
NoSQL 算法 Java
Redis进阶 - 数据结构:对象机制详解,一文深入底层分析
我们在前文已经阐述了Redis 5种基础数据类型详解,分别是字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset),以及5.0版本中Redis Stream结构详解;那么这些基础类型的底层是如何实现的呢?Redis的每种对象其实都由对象结构(redisObject) 与 对应编码的数据结构组合而成, 本文主要介绍对象结构(redisObject) 部分。
Redis进阶 - 数据结构:对象机制详解,一文深入底层分析

热门文章

最新文章