searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Redis简介及数据结构

2023-11-01 01:14:16
21
0

1. Redis 概述

1.1 特点

  1. key-value 储存

  2. 支持的 value 类型很多,包括 string、list、set、zset(有序集合)、hash

  3. 支持的数据类型都支持 push/pop、add/remove、取交并补差及更丰富的操作,且这些操作都是原子性

  4. 支持不同方式的排序

  5. 为了保证效率,数据都缓存在内存

  6. 会周期性将更新的数据落盘,或将修改操作追加入日志文件

  7. 实现了主从同步(master-slave)

1.2 安装目录

  • redis-benchmark:性能测试工具

  • redis-check-aof:修复有问题 AOF 文件

  • redis-check-dump:修复有问题的 dump.rdb 文件

  • redis-sentinel:Redis 集群使用

  • redis-server:Redis 服务器启动命令

  • redis-cli:客户端,操作入口

2. 常用的五大数据类型

2.1 Redis key

指令 作用
keys <*> 查看当前库所有 key (* 为通配符)
exists <key> 判断某个 key 是否存在
type <key> 查看 key 的类型
del <key> 删除指定的 key
unlink <key> 根据 value 选择非阻塞删除 (仅将 key 从元数据中删除,真正的删除后续异步进行)
expire <key> <time> 给指定 key 设置过期时间 (time 单位为秒)
ttl <key> 查看 key 还有多少秒过期,-1 表示永不过期,-2 表示已过期

2.2 String

2.2.1 特点

  1. Redis 最基本的数据类型,即 key 和 value 默认都是 string

  2. String 类型是二进制安全的,即 Redis 的 string 可以包含任何数据,包括图片和序列化对象

  3. Redis 中字符串 value 大小最大为 512 MB

2.2.2 常用命令

指令 作用
set <key> <time> <value> 设置 key-value 值,可设置过期时间
get <key> 查询对应键值
append <key> <value> 将给定的 value 追加到指定 key 的 value 末尾
strlen <key> 获取指定 key 的 value 的长度
setnx <key> <time> <value> 仅当 key 不存在时,设置给定的 key-value,可设置过期时间 (可用于实现分布式锁)
incr/decr <key> 将 key 中储存的数字值 +1/ -1 (只能对数字值操作)
incrby/decrby <key> <step> 将 key 中储存的数字值按指定步长增减
mset <key1> <value1> <key2> <value2>... 一次设置多个 key-value
msetnx <key1> <value1> <key2> <value2>... 一次设置多个 key-value,仅当 key 都不存在时才能设置成功 (原子性)
getrange <key> <start> <end> 获取指定 key 的 value 的子串 (闭区间)
setrange <key> <start> <value> 从指定位置开始覆写指定 key 的 value 值
setex <key> <time> <value> 设置 key-value 的,如果 key 存在则替换旧值,可设置过期时间
getset <key> <value> 设置新 value 时同时返回旧 value

2.2.3 数据结构

String 的数据结构为简单动态字符串 (Simple Dynamic String, SDS),内部结构类似于 ArrayList,采用预分配冗余空间来减少内存的频繁分配

设 string 容量为 capacity

capacity < 1MB:字符串容量扩容为原来的 2 倍

capacity > 1MB:一次只扩容 1MB 的空间

capacity 最大为 512 MB

2.3 List

2.3.1 特点

  1. 单键多值

  2. Redis 列表是字符串列表

  3. Redis 列表底层是双向链表

2.3.2 常用命令

指令 作用
lpush|rpush <key> <value1> <value2>... 从左边/右边插入一个或多个值
lpop|rpop <key> 从左边/右边弹出一个值 (当所有值都弹出后,key 也会被删除)
rpop|push <key1> <key2> 从 key1 列表右边弹出一个值,插入 key2 列表左边
lrange <key> <start> <stop> 按照索引下标获取元素,stop = -1表示一直取到结尾 (从左到右取)
lindex <key> <index> 按照索引下标获取元素 (从左到右数)
llen <key> 获取列表长度
linsert <key> before|after <value> <newvalue> 在指定的 value 前面/后面插入 newvalue
lrem <key> <n> <value> 从左到右删除 n 个 value
lset <key> <index> <value> 将 key 列表下表为 index 的值替换为 value

2.3.3 数据结构

List 的数据结构为快速链表 (quicklist)

列表元素较少时会使用一块连续的内存储存,此时结构是压缩链表 (ziplist)

列表元素较多时会改成快速链表

快速链表是由多个压缩链表构成的双向链表,这样既满足了快速插入删除的性能,由不会出现太大的空间冗余

2.4 Set

2.4.1 特点

  1. Redis 集合功能类似于列表,当可以自动排重

  2. Redis 集合提供了判断成员是否在其中的方法

  3. Redis 集合是 string 类型的无序集合,底层是一个 value 为 null 的 hash 表,增删改查操作时间复杂度为 O(1)

2.4.2 常用指令

指令 作用
sadd <key> <value1> <value2> ... 将一个或多个元素加入 key 集合
smembers <key> 取出 key 集合的所有值 (当所有值都弹出后,key 也会被删除)
sismember <key> <value> 判断 key 集合中是否就有指定 value,有返回 1,否则返回 0
scard <key> 返回 key 集合的元素个数
srem <key> <value1> <value2> ... 删除 key 集合中的一个或多个指定元素
spop <key> 随机从 key 集合中弹出一个值
srandmember <key> <n> 随机从 key 集合中取出 n 个值,不会删除这些值
smove <key1> <key2> <value> 将 key1 集合中的指定 value 移动到 key2 集合中
sinter <key1> <key2> 返回 key1 集合和 key2 集合的交集
sunion <key1> <key2> 返回 key1 集合和 key2 集合的并集
sdiff <key1> <key2> 返回 key1 集合和 key2 集合的差集

2.4.3 数据结构

Set 的数据结构为 dict 字典,使用 hash 表实现的,但 hash 表的所有 value 都指向 null

2.5 Hash

2.5.1 特点

  1. Redis hash 是一个键值对集合

  2. Redis hash 是一个 string 类型的 field-value 映射表

2.5.2 常用命令

指令 作用
hset <key> <field> <value> 给 key 哈希表中的 field 键赋值 value
hget <key> <field> 从 key 哈希表中取出 field 键的值
hmset <key> <field1> <value1> <field2> <value2> ... 批量设置 key 哈希表的键值对
hexists <key> <field> 查看 key 哈希表中 field 键是否存在
hkeys <key> 返回 key 哈希表的所有键
hvals <key> 返回 key 哈希表的所有值
hincrby <key> <field> <increment> 给 key 哈希表的 field 键的 value 加上指定数值 (value 需为数字)
hsetnx <key> <field> <value> 如果 key 哈希表中不存在 field 键,则给 field 键赋值 value

2.5.3 数据结构

Hash 的数据结构有两种:ziplist、hashtable

当 field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable

2.6 Zset

2.6.1 特点

  1. Redis 有序集合与 set 相似,也是一个无重复元素的字符串集合

  2. Redis 有序集合每个成员都关联了一个评分 (score),用于进行排序,评分可重复

  3. 因为元素是有序的,可以很快根据评分或次序来获取一个范围的元素

2.6.2 常用命令

指令 作用
zadd <key> <score1> <value1> <score2> <value2> ... 将一个或多个元素连同其评分加入 key 有序集合中
zrange <key> <start> <stop> [withscores] 返回 key 有序集合中下标在 start 到 stop 间的元素,加上 withscores 可以连评分一起显示
zrangebyscore <key> minmax [withscores] [limit offset count] 返回 key 有序集合中评分介于 min 和 max 间的元素,并按照评分从小到大排序
zrevrangebyscore <key> maxmin [withscores] [limit offset count] 返回 key 有序集合中评分介于 min 和 max 间的元素,并按照评分从大到小排序
zincrby <key> <increment> <value> 给 key 有序集合的元素 value 的评分加上指定值
zrem <key> <min> <max> 统计 key 有序集合中评分介于 min 和 max 间的元素个数
zrank <key> <value> 返回 key 有序集合中指定值 value 在 key 中的排名,从 0 开始

2.6.3 数据结构

Zset 底层使用了两个数据结构

  1. hash 表,其作用是关联元素 value 和评分 score,确保 value 的唯一性,可以通过 value 找到对应个 score

  2. 跳跃表,用于给元素 value 排序即根据 score 返回获取元素列表

0条评论
作者已关闭评论
k****n
6文章数
0粉丝数
k****n
6 文章 | 0 粉丝
k****n
6文章数
0粉丝数
k****n
6 文章 | 0 粉丝
原创

Redis简介及数据结构

2023-11-01 01:14:16
21
0

1. Redis 概述

1.1 特点

  1. key-value 储存

  2. 支持的 value 类型很多,包括 string、list、set、zset(有序集合)、hash

  3. 支持的数据类型都支持 push/pop、add/remove、取交并补差及更丰富的操作,且这些操作都是原子性

  4. 支持不同方式的排序

  5. 为了保证效率,数据都缓存在内存

  6. 会周期性将更新的数据落盘,或将修改操作追加入日志文件

  7. 实现了主从同步(master-slave)

1.2 安装目录

  • redis-benchmark:性能测试工具

  • redis-check-aof:修复有问题 AOF 文件

  • redis-check-dump:修复有问题的 dump.rdb 文件

  • redis-sentinel:Redis 集群使用

  • redis-server:Redis 服务器启动命令

  • redis-cli:客户端,操作入口

2. 常用的五大数据类型

2.1 Redis key

指令 作用
keys <*> 查看当前库所有 key (* 为通配符)
exists <key> 判断某个 key 是否存在
type <key> 查看 key 的类型
del <key> 删除指定的 key
unlink <key> 根据 value 选择非阻塞删除 (仅将 key 从元数据中删除,真正的删除后续异步进行)
expire <key> <time> 给指定 key 设置过期时间 (time 单位为秒)
ttl <key> 查看 key 还有多少秒过期,-1 表示永不过期,-2 表示已过期

2.2 String

2.2.1 特点

  1. Redis 最基本的数据类型,即 key 和 value 默认都是 string

  2. String 类型是二进制安全的,即 Redis 的 string 可以包含任何数据,包括图片和序列化对象

  3. Redis 中字符串 value 大小最大为 512 MB

2.2.2 常用命令

指令 作用
set <key> <time> <value> 设置 key-value 值,可设置过期时间
get <key> 查询对应键值
append <key> <value> 将给定的 value 追加到指定 key 的 value 末尾
strlen <key> 获取指定 key 的 value 的长度
setnx <key> <time> <value> 仅当 key 不存在时,设置给定的 key-value,可设置过期时间 (可用于实现分布式锁)
incr/decr <key> 将 key 中储存的数字值 +1/ -1 (只能对数字值操作)
incrby/decrby <key> <step> 将 key 中储存的数字值按指定步长增减
mset <key1> <value1> <key2> <value2>... 一次设置多个 key-value
msetnx <key1> <value1> <key2> <value2>... 一次设置多个 key-value,仅当 key 都不存在时才能设置成功 (原子性)
getrange <key> <start> <end> 获取指定 key 的 value 的子串 (闭区间)
setrange <key> <start> <value> 从指定位置开始覆写指定 key 的 value 值
setex <key> <time> <value> 设置 key-value 的,如果 key 存在则替换旧值,可设置过期时间
getset <key> <value> 设置新 value 时同时返回旧 value

2.2.3 数据结构

String 的数据结构为简单动态字符串 (Simple Dynamic String, SDS),内部结构类似于 ArrayList,采用预分配冗余空间来减少内存的频繁分配

设 string 容量为 capacity

capacity < 1MB:字符串容量扩容为原来的 2 倍

capacity > 1MB:一次只扩容 1MB 的空间

capacity 最大为 512 MB

2.3 List

2.3.1 特点

  1. 单键多值

  2. Redis 列表是字符串列表

  3. Redis 列表底层是双向链表

2.3.2 常用命令

指令 作用
lpush|rpush <key> <value1> <value2>... 从左边/右边插入一个或多个值
lpop|rpop <key> 从左边/右边弹出一个值 (当所有值都弹出后,key 也会被删除)
rpop|push <key1> <key2> 从 key1 列表右边弹出一个值,插入 key2 列表左边
lrange <key> <start> <stop> 按照索引下标获取元素,stop = -1表示一直取到结尾 (从左到右取)
lindex <key> <index> 按照索引下标获取元素 (从左到右数)
llen <key> 获取列表长度
linsert <key> before|after <value> <newvalue> 在指定的 value 前面/后面插入 newvalue
lrem <key> <n> <value> 从左到右删除 n 个 value
lset <key> <index> <value> 将 key 列表下表为 index 的值替换为 value

2.3.3 数据结构

List 的数据结构为快速链表 (quicklist)

列表元素较少时会使用一块连续的内存储存,此时结构是压缩链表 (ziplist)

列表元素较多时会改成快速链表

快速链表是由多个压缩链表构成的双向链表,这样既满足了快速插入删除的性能,由不会出现太大的空间冗余

2.4 Set

2.4.1 特点

  1. Redis 集合功能类似于列表,当可以自动排重

  2. Redis 集合提供了判断成员是否在其中的方法

  3. Redis 集合是 string 类型的无序集合,底层是一个 value 为 null 的 hash 表,增删改查操作时间复杂度为 O(1)

2.4.2 常用指令

指令 作用
sadd <key> <value1> <value2> ... 将一个或多个元素加入 key 集合
smembers <key> 取出 key 集合的所有值 (当所有值都弹出后,key 也会被删除)
sismember <key> <value> 判断 key 集合中是否就有指定 value,有返回 1,否则返回 0
scard <key> 返回 key 集合的元素个数
srem <key> <value1> <value2> ... 删除 key 集合中的一个或多个指定元素
spop <key> 随机从 key 集合中弹出一个值
srandmember <key> <n> 随机从 key 集合中取出 n 个值,不会删除这些值
smove <key1> <key2> <value> 将 key1 集合中的指定 value 移动到 key2 集合中
sinter <key1> <key2> 返回 key1 集合和 key2 集合的交集
sunion <key1> <key2> 返回 key1 集合和 key2 集合的并集
sdiff <key1> <key2> 返回 key1 集合和 key2 集合的差集

2.4.3 数据结构

Set 的数据结构为 dict 字典,使用 hash 表实现的,但 hash 表的所有 value 都指向 null

2.5 Hash

2.5.1 特点

  1. Redis hash 是一个键值对集合

  2. Redis hash 是一个 string 类型的 field-value 映射表

2.5.2 常用命令

指令 作用
hset <key> <field> <value> 给 key 哈希表中的 field 键赋值 value
hget <key> <field> 从 key 哈希表中取出 field 键的值
hmset <key> <field1> <value1> <field2> <value2> ... 批量设置 key 哈希表的键值对
hexists <key> <field> 查看 key 哈希表中 field 键是否存在
hkeys <key> 返回 key 哈希表的所有键
hvals <key> 返回 key 哈希表的所有值
hincrby <key> <field> <increment> 给 key 哈希表的 field 键的 value 加上指定数值 (value 需为数字)
hsetnx <key> <field> <value> 如果 key 哈希表中不存在 field 键,则给 field 键赋值 value

2.5.3 数据结构

Hash 的数据结构有两种:ziplist、hashtable

当 field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable

2.6 Zset

2.6.1 特点

  1. Redis 有序集合与 set 相似,也是一个无重复元素的字符串集合

  2. Redis 有序集合每个成员都关联了一个评分 (score),用于进行排序,评分可重复

  3. 因为元素是有序的,可以很快根据评分或次序来获取一个范围的元素

2.6.2 常用命令

指令 作用
zadd <key> <score1> <value1> <score2> <value2> ... 将一个或多个元素连同其评分加入 key 有序集合中
zrange <key> <start> <stop> [withscores] 返回 key 有序集合中下标在 start 到 stop 间的元素,加上 withscores 可以连评分一起显示
zrangebyscore <key> minmax [withscores] [limit offset count] 返回 key 有序集合中评分介于 min 和 max 间的元素,并按照评分从小到大排序
zrevrangebyscore <key> maxmin [withscores] [limit offset count] 返回 key 有序集合中评分介于 min 和 max 间的元素,并按照评分从大到小排序
zincrby <key> <increment> <value> 给 key 有序集合的元素 value 的评分加上指定值
zrem <key> <min> <max> 统计 key 有序集合中评分介于 min 和 max 间的元素个数
zrank <key> <value> 返回 key 有序集合中指定值 value 在 key 中的排名,从 0 开始

2.6.3 数据结构

Zset 底层使用了两个数据结构

  1. hash 表,其作用是关联元素 value 和评分 score,确保 value 的唯一性,可以通过 value 找到对应个 score

  2. 跳跃表,用于给元素 value 排序即根据 score 返回获取元素列表

文章来自个人专栏
Zookeeper
2 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0