redis 从0到1完整学习 (三):redis 数据结构

2023-12-20 19:52:28


0. 概述

0.1 简要介绍

Redis 最新官网有关数据结构的介绍:Understand Redis data types

按照最新的官网介绍,我这里提炼总结一下,Redis 的 key 一般是 String 类型,value 可以有如下类型:

  • Strings。 最基础的类型,不多解释
  • Lists。 按插入顺序排序的字符串列表
  • Sets。 字符串的无序集合(字符串不可重复),类似于Java HashSets、Python sets 等
  • Hashes。 键值对集合的类型。类似于 Python dict、Java HashMap。
  • Sorted sets。按照字符串元素关联的分数来进行排序的 Sets
  • Streams。 Redis 5.0 版本引入的一种新的数据类型,主要用于实现消息队列、日志、数据同步等。
  • Geospatial indexes。存储和处理地理位置信息。它可以将地理位置的经度和纬度编码为二维平面上的点,并支持根据距离或矩形区域查询附近的地理位置点。
  • Bitmaps。基于字符串位操作的集合。字符串是二进制安全的,并且最长可支持512M,所以它们可以用来存储2的32次方(512 * 1024 * 1024 * 8 )不同位的数据。
  • Bitfields。一种位字段数据类型。它允许用户在一个Redis字符串中存储、读取和修改不同长度的整数值。
  • HyperLogLog。用于对海量数据进行基数统计。

下面针对常用的一些命令进行介绍。

1. Strings

字符串类型,是Redis中最简单的存储类型,不超过 512 MB。根据字符串的格式不同,又可以分为:

  • string:普通字符串
  • int:整数类型
  • float:浮点类型

1.1 常用命令

- SET:添加或者修改键值对
- GET:根据 key 获取值
- MSET:批量添加多个键值对
- MGET:根据多个 key 获取多个值
- INCR:整型的 key 的值增1
- INCRBY: 整型的key增加指定步长
- INCRBYFLOAT:浮点类型的数字增指定步长
- SETNX:仅当这个 key 不存在才添加键值对
- SETEX:添加键值对,并且指定有效期

例如:

SET name "John"
GET name
SETNX user_id 123456
SETEX session 30 "user_id=123456&username=John"

2 Lists

List 结构是一种双端链表,支持在两端插入和删除元素。它具有以下特点:

  • 动态增长:当列表中的元素数量超过其容量时,Redis会自动扩容,使得列表的容量始终能够容纳当前元素数量。
  • 内存存储:Redis 的 List结构是在内存中存储的,因此读写速度非常快。
  • 支持多种操作:Redis 的 List 结构支持多种操作,如插入、删除、查找等。

2.1 常用命令

- LPUSH key value ... :向列表左侧插入一个或多个元素
- LPOP key:移除并返回列表左侧的第一个元素,没有则返回 nil
- RPUSH key value ... :向列表右侧插入一个或多个元素
- RPOP key:移除并返回列表右侧的第一个元素
- LRANGE key star end:返回一段角标范围内的所有元素
- BLPOP 和 BRPOP:给定列表内没有任何元素可供弹出的时候,连接将被阻塞,直到超时或有元素可弹出为止

例如:

LPUSH myqueue item1  
RPOP myqueue
BLPOP mylist 0  # 阻塞式获取列表 mylist 中的元素,直到有元素可弹出或超时时间为0(永久阻塞)

3. Sets

Redis 的 Sets 是一个无序的、不重复的元素序列。它底层其实是一个 value为 null 的hash表,所以添加、删除、查找的复杂度都是 O(1)。Redis Sets 提供的功能包括:

  • 添加一个或多个指定的 member 元素到集合中。
  • 判断某个成员是否在一个 set 集合内。
  • 对集合进行交集、并集、差集等操作。

3.1 常用命令

- SADD key member [member ...]:命令用于向集合中添加一个或多个元素。如果集合不存在,则会创建一个新的集合
- SADD key member [member ...] : 移除指定元素
- SCARD key: 返回集合的成员数
- SISMEMBER key member:判断一个元素是否存在于集合中
- SMEMBERS:返回集合的所有元素
- SINTER key1 key2 ... :求key1与key2的交集

例子:

SADD myset "apple" "banana" "cherry"
SCARD myset
SISMEMBER myset "banana"

4. Hashes

通过键值对的形式保存数据。在 Redis 中,Hashes 可以被视为 Java 中的HashMap,通过 key-value 的形式保存数据。

4.1 常用命令

Hash的常见命令有:

- HSET key field value:添加或者修改 key 的 field 值
- HGET key field:获取 key 的 field 的值
- HMSET:批量添加多个 key的 field 的值
- HMGET:批量获取多个 key 的 field 的值
- HGETALL:获取 key 中的所有的 field 和 value
- HKEYS:获取 hash 类型的 key 中的所有的 field
- HINCRBY: 让 key 的字段值自增并指定步长
- HSETNX:仅当 field 存在,添加 key 的 field 值,否则不执行

例子:

HSET user:1 name "John"  
HSET user:1 age 25  
HSET user:1 address "New York"

HGET user:1 name
HGETALL user:1

5. Sorted sets

Sorted sets 是一个可排序的 Set 集合。Sorted sets 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。

Sorted sets 具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

5.1 常用命令

Sorted sets 的常见命令有:

- ZADD key score member:添加一个或多个元素到 Sorted sets,如果已经存在则更新其 score 值
- ZREM key member:删除 Sorted sets 中的一个指定元素
- ZSCORE key member : 获取 Sorted sets 中的指定元素的 score 值
- ZRANK key member:获取 Sorted sets 中的指定元素的排名
- ZCARD key:获取 Sorted sets t中的元素个数
- ZCOUNT key min max:统计 score 值在给定范围内的所有元素的个数
- ZINCRBY key increment member:让 Sorted sets 中的指定元素自增,步长为指定的increment值
- ZRANGE key min max:按照 score 排序后,获取指定排名范围内的元素
- ZRANGEBYSCORE key min max:按照 score 排序后,获取指定 score范围内的元素
- ZDIFF、ZINTER、ZUNION:求差集、交集、并集

例如:
假设我们有一个 Sorted sets,成员是游戏玩家的得分,我们需要根据得分对玩家进行排序。使用 ZADD 命令将玩家的得分添加到 Sorted sets 中:

ZADD players 90 "Alice"
ZADD players 80 "Bob"
ZADD players 85 "Charlie"

接下来,使用 ZRANGE 命令获取所有成员及其分数:

ZRANGE players 0 -1 WITHSCORES

这将返回 “players” Sorted sets 中所有成员及其分数,按分数从小到大排序。

想要查找特定得分的玩家,我们可以使用 ZRANGEBYSCORE 命令:

ZRANGEBYSCORE players 80 90 WITHSCORES

返回 “players” Sorted sets 中分数在80到90之间的所有成员及其分数。

6. Streams

Redis Streams 允许存储和检索大量的数据。

6.1 常用命令

Streams 的常见命令有:

- XADD stream_name field value [field value ...]:创建 Stream。其中,stream_name 是 Stream 的名称,field 是数据的字段,value 是字段的值,可以一次添加多个字段和值
- XREAD COUNT 0 STREAMS stream_name [stream_name ...] ID [ID ...]:读取 Stream。其中,COUNT 是读取的记录数量,0表示读取所有记录;STREAMS 是要读取的 Stream 的名称;ID 是你要读取的记录的 ID。可以指定要读取的记录的 ID 范围。
- XDEL stream_name [id [id ...]]:删除 Stream。其中,stream_name 是 Stream 的名称;id 是要删除的记录的 ID。可以指定要删除的记录的 ID 范围。

例子:
假设我们有一个名为 “my_stream” 的 Stream,用于存储用户的登录记录。

  1. 创建 Stream:
XADD my_stream *user_id 123 *timestamp 1625555555

这个命令将一个记录添加到 “my_stream” 中,包含字段 “user_id” 和 “timestamp”,它们的值分别为 123 和 1625555555。

  1. 读取 Stream:
XREAD COUNT 1 STREAMS my_stream 0

这个命令从 “my_stream” 中读取一条记录,起始 ID 为0。

  1. 删除 Stream 中的记录:
XDEL my_stream 1625555555

这个命令从 “my_stream” 中删除 ID 为1625555555的记录。

文章来源:https://blog.csdn.net/qq_36803941/article/details/135077284
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。