[学习记录] Redis 3. Key 操作和常用数据类型

Redis 3. Key 操作和常用数据类型

参考课程:https://www.bilibili.com/video/BV1Rv41177Af

参考书:https://blog.csdn.net/liu8490631/article/details/124290851

官方文档

0. 准备

Docker 打开 redis-server,然后通过命令进入 redis 容器:

docker exec -it myredis /bin/bash

连接 redis:

redis-cli

1. Key 操作

  • set key value 设置 key 以及对应的 value

    • 选项:EX:过期秒数,PX:过期毫秒数,EXAT,PXAT
  • setns key value 只有当 key 不存在时才设置 key 的值,否则不生效

  • get key 获取指定 key 对应的的 value

  • keys 查看当前库所有 key

  • exists key 判断某个 key 是否存在

  • type key 判断 key 的数据类型,若不存在 key,返回 none

  • del key 删除 key

  • unlink key 根据 value 选择非阻塞删除,仅将 key 从 keyspace 元数据中删除,真正的删除会在后续异步操作。(逻辑删除)

  • expire key 10 为给定的 key 设置过期时间,这里的 10 为 10 秒钟

  • ttl key 查看 key 还有多少秒过期,-1 表示永不过期,-2 表示已过期

  • select [n] 切换数据库,共 16 个, 默认为 0

  • dbsize 查看当前数据 key 的数量

  • flushdb 清空当前库的 key

  • flushall 清空所有库的 key

1.1 多个 key 操作

  • mset key1 value1 key2 value2 ... 设置一个或多个 key-value 对
  • mget key1 key2 ... 获取一个或多个value
  • msetnx key1 value1 key2 value2 同时设置一个或者多个 key-value 对,当且仅当所有给定 key 都不存在,才执行成功,若其中有一个 key 已经存在,则其他都不成功

2. 常用数据类型

2.1 String 字符串

2.1.1 简介

Redis 最基本的数据类型,value 最大可以是 512M

String 类型是二进制安全的,可以包含任何数据,比如 jpg 图片或者序列化对象。

2.1.2 常用命令
  • append key value 将给定的 value 追加到原值的末尾,若没有 key 则创建 key,并写入给定 value
  • strlen key 获得值的长度,若 key 不存在,则返回 0
  • incr key 对存储的数字值增加 1,若 key 不存在,新增 key,value 为 1
  • decr key 对存储的数字值减少 1,若 key 不存在,新增 key,value 为 -1
  • incrby key 10decrby key 10 和上面的用法一致,每次加 10 或减10

范围:

  • getrange key 起始位置 结束位置 取子串,前包后包
  • setrange key 起始位置 value 从索引位置用 value 代替从 索引位置 开始的 value 长度的子串
  • setex key 过期时间 value 设置键值的同时,设置过期时间,单位秒
  • getset key value 以新换旧并返回旧的值
2.1.3 数据结构
  • 简单动态字符串,可修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

  • 当字符串小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。字符串最大长度为 512M。

2.2 List 列表

2.2.1 简介

单键多值。

Redis 的列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

底层结构是 双向链表,对两端操作性高,通过索引下标操作中间节点性能较差。

2.2.2 常用命令
  • lpush/rpush key value1 value2 ... 从左边/右遍插入一个或者多个值
  • lpop/rpop key count 从左边/右遍吐出 count 个值。值在键在,值光键亡。count 可省,默认吐一个。
  • rpoplpush key1 key2 从 key1 列表右边吐出一个值,插到 key2 列表的左边。
  • lrange key start stop 按照索引下标获得元素(从左到右),stop 若为 -1,则代表取全部值。
  • lindex key index 列表对应下标的值
  • llen key 取列表长度
2.2.3 数据结构

List 的数据结构为快速链表 quickList。

列表元素比较少的时候会使用一块连续的内存存储,这个空间是 ziplist,也即是压缩列表。压缩链表将所有的元素紧挨着一起存储,分配的是一块连续的内存。

当数据较多时才会改成 quickList。因为普通的链表需要附加指针空间太大,比较浪费空间。

Redis 用多个压缩链表组成快速链表。将多个压缩链表使用双指针串起来使用,这样既满足了快速的插入删除性能,也不会出现太大的空间冗余。

2.3 Set 集合

2.3.1 简介

Redis 中的 Set 对外提供的功能与 List 类似,特殊之处在于 Set 可以自动排重,当你需要存储一个列表数据,又不希望出现重复数据,Set 是一个很好的选择

Set 提供了判断某个成员是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的。

Redis 的 Set 是 String 类型的无序集合底层其实是一个 value 为 null 的 hash 表,所以添加,删除,查找操作都是 O(1)

2.3.2 常用命令
  • sadd key value1 value2... 添加一个或多个值
  • smembers key 取出集合内所有的值
  • sismember key value 判断集合中是否有 value 值,有返回 1,无返回 0
  • scard key 返回该集合元素个数
  • srem key value1 value2.. 删除集合中某些元素
  • spop key 随机从集合中吐出一个值
  • sinter key1 key2 返回两个集合的交集元素
  • sunion key1 key2 返回两个集合的并集元素
  • sdiff key1 key2 返回 key1 - key2,差集 元素
2.3.3 数据结构

Set 数据结构是 dict 字典,用哈希表来实现。

Java 中的 HashSet 内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。

Redis 中的 Set 结构也是一样,内部也使用 hash 结构,所有的 value 都指向同一个內部值。

2.4 Hash 哈希

2.4.1 简介

Redis hash 是一个键值对集合。

hash 中一个 key 对应多个 field-value 值。

hash 特别适合用于存储对象,类似 Java 里面的 Map<String, Object>

  • 为什么要 hash?直接存多个 key-value 不行吗?
    • 如果存多个 key-value 数据太分散了。
2.4.2 常见命令
  • hset key field value 赋值 field 为 value
  • hget key field 从 field 中取值
  • hmset key filed1 value1 field2 value2... 批量设置 hash
  • hexsts key field 查看 hash 中给定 field 是否存在
  • hkeys key 查看 hash 中所有的field
  • hvals key 查看 hash 中所有 value
  • hincrby key field increment 对 hash 中 field 中的值增加 increment
  • hsetnx key field value 当 hash 中 field 不存在时,增加 field,否则执行失败
2.4.3 数据结构

Hash 对应的数据结构有两种:zipList 压缩链表,hashTable 哈希表。

当 field-value 长度较短且个数较少时,使用压缩链表,否则使用哈希表。

2.5 Zset 有序集合

2.5.1 简介

Redis 有序集合 Zset 和普通集合 Set 非常相似,是一个没有重复元素的字符集合。

不同之处在于有序集合的每个成员都关联了一个评分(Score),这个评分被用来按照从最低到最高分的方式排序集合中的成员。集合成员是唯一的,但是评分是可以重复的

因为元素是有序的,所以可以很快根据评分(score)或者次序(position)来获取一个范围的元素。

访问有序集合的中间元素也是非常快的,因此能使用有序集合作为一个没有重复成员的智能列表。

2.5.2 常用命令
  • zadd key score1 value1 score2 value2 将一个或多个成员元素以及 score 值加入到有序集 key 当中
  • zrange key start stop [withscores] 返回有序集 key 中,下标在 start 到 stop 之间的元素,带 withsocres,可以让分数一起返回。
  • zrangebyscore key min max [withscores] [limit offset count] 返回有序集 key 中,所有介于 min 和 max 之间(包含)的成员,按照 score 分数从小到大排序输出。
  • zrevrangebyscore key max min [withscores] [limit offset count] 从大到小排序输出
  • zincrby key increment value 为元素的 score 加上增量
  • zrem key value 删除指定值的元素
  • zcount key min max 统计集合中分数区间内的元素个数
  • zrank key value 返回该值在集合中的排名,从 0 开始
2.5.3 数据结构

SortedSet(zset) 一方面等价于 Java 的数据结构 Map<String, Double>,可以给每个元素 value 赋予一个权重 score,另一个方面又类似于 TreeSet,内部的元素按照权重 score 进行排序,可以得到每个元素的名次,还可以通过 score 的范围获取元素的列表。

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

  1. hash,负责关联元素 value 和权重 score,保证元素 value 的唯一性,可以通过元素 value 找到相应的 score 值。
  2. 跳跃表,跳跃表的目的在于给元素 value 排序,根据 score 的范围获取元素列表。
2.5.4 ★跳跃表

有序集合底层实现可以用数组,平衡树,链表等。

数组不方便元素的插入,删除;平衡树或红黑树效率高但是结构复杂;链表查询需要逐个遍历效率低。

Redis 采用的是跳跃表。跳表效率堪比红黑树,实现比红黑树简单。

图解跳跃表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇咔咔负负得正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值