第2章: Redis数据结构
Redis 提供了丰富的数据结构,每一种结构都有其独特的存储方式和使用场景。掌握 Redis 的数据结构不仅能更好地利用 Redis 的存储能力,还能根据需求设计出高效的解决方案。本章将详细介绍 Redis 的主要数据结构及其操作。
1 字符串(String)
字符串是 Redis 最简单、最常用的数据结构。它可以存储任意类型的数据,包括文本、数字和二进制数据(如图片、音频等)。
一个字符串键最多可以存储 512MB 的数据,以下是字符串的常见操作命令:
-
设置字符串值:
SET key value
示例:
SET username "Alice"
-
获取字符串值:
GET key
示例:
GET username
-
递增/递减数值:
Redis 支持对字符串类型的数值进行递增和递减操作,适合用作计数器。INCR key # 递增 DECR key # 递减 INCRBY key increment # 按指定数值递增 DECRBY key decrement # 按指定数值递减
示例:
INCR page_views # 页面访问计数器 INCRBY page_views 10 # 每次访问计数增加10
-
获取字符串长度:
STRLEN key
示例:
STRLEN username # 获取 username 的字符长度
-
字符串的部分操作:
可以操作字符串中的某部分数据,如修改某一位置的字符或截取某一段内容:SETRANGE key offset value # 从指定偏移量开始修改字符串 GETRANGE key start end # 获取指定区间的字符串片段
示例:
SET greeting "Hello Redis" SETRANGE greeting 6 "World" # 结果为 "Hello World" GETRANGE greeting 0 4 # 获取 "Hello"
2 列表(List)
列表是一组有序的字符串序列,类似于链表结构,支持从两端插入或移除元素。它适用于实现队列、堆栈等场景。列表可以存储的元素数量是非常大的,只要内存允许。
-
列表的常用操作:
-
从左边插入元素:
LPUSH key value [value ...]
示例:
LPUSH tasks "task1" "task2" # 插入多个任务
-
从右边插入元素:
RPUSH key value [value ...]
示例:
RPUSH tasks "task3" # 在队列末尾插入任务
-
从左边移除元素:
LPOP key
示例:
LPOP tasks # 移除最左边的任务
-
从右边移除元素:
RPOP key
示例:
RPOP tasks # 移除最右边的任务
-
获取列表长度:
LLEN key
示例:
LLEN tasks # 获取任务列表的长度
-
获取列表中的元素:
LRANGE key start stop
示例:
LRANGE tasks 0 -1 # 获取所有任务
-
根据索引获取或设置元素:
LINDEX key index # 获取索引位置的元素 LSET key index value # 设置索引位置的元素
-
3 集合(Set)
集合是一组无序、唯一的字符串。它支持快速的添加、删除和判断元素是否存在,并且可以执行集合的交集、并集和差集操作,适合用在关系性计算和去重场景中。
-
集合的常用操作:
-
向集合中添加元素:
SADD key member [member ...]
示例:
SADD users "Alice" "Bob"
-
从集合中删除元素:
SREM key member [member ...]
示例:
SREM users "Alice"
-
判断元素是否在集合中:
SISMEMBER key member
示例:
SISMEMBER users "Bob"
-
获取集合中的所有元素:
SMEMBERS key
示例:
SMEMBERS users
-
获取集合大小:
SCARD key
示例:
SCARD users
-
集合运算:
-
交集:
SINTER key1 key2
示例:
SINTER group1 group2 # 获取 group1 和 group2 的交集
-
并集:
SUNION key1 key2
-
差集:
SDIFF key1 key2
-
-
4 有序集合(Sorted Set)
有序集合类似于集合,但它为每个元素分配了一个分数,Redis 会根据分数为集合中的元素进行排序。有序集合适用于需要按某种顺序获取数据的场景,比如排行榜。
-
有序集合的常用操作:
-
添加元素及其分数:
ZADD key score member [score member ...]
示例:
ZADD leaderboard 100 "Alice" # 添加Alice,得分100 ZADD leaderboard 150 "Bob"
-
获取集合中元素的排名:
ZRANK key member # 获取元素的排名(从低到高) ZREVRANK key member # 获取元素的排名(从高到低)
-
获取集合中的元素:
ZRANGE key start stop [WITHSCORES] # 获取指定范围内的元素(按分数排序) ZREVRANGE key start stop [WITHSCORES] # 获取指定范围内的元素(按分数降序排序)
-
删除元素:
ZREM key member
-
获取元素的分数:
ZSCORE key member
-
5 哈希(Hash)
哈希用于存储键值对(field-value),适合用于存储对象的属性数据,比如用户信息等。
-
哈希的常用操作:
-
设置哈希值:
HSET key field value
示例:
HSET user:1000 name "Alice" HSET user:1000 age 30
-
获取哈希值:
HGET key field
-
获取哈希中的所有字段和值:
HGETALL key
-
删除哈希字段:
HDEL key field
-
6 HyperLogLog
HyperLogLog 是一种概率性数据结构,用于基数统计,即估算集合中不重复元素的数量,且占用内存非常小。尽管其结果并不完全精确,但误差在可控范围内。
-
添加元素:
PFADD key element [element ...]
-
获取基数估算值:
PFCOUNT key
7 Bitmaps
Bitmap 是 Redis 中用于按位操作的一种数据结构,适合用于存储和处理二进制数据。典型应用场景是统计用户活跃度或在线状态。
-
设置/获取指定位置的位:
SETBIT key offset value # 设置指定位置的值 GETBIT key offset # 获取指定位置的值
8 Geospatial
Redis 提供了地理空间数据的支持,允许存储地理位置及执行距离计算、范围查找等操作。
-
添加地理位置:
GEOADD key longitude latitude member
-
**计算两点之间
的距离**:
GEODIST key member1 member2 [unit]
本章简单介绍了 Redis 的各种数据结构,包括字符串、列表、集合、有序集合、哈希、HyperLogLog、Bitmaps 和地理空间数据。理解这些数据结构及其使用场景是掌握 Redis 的基础。