Redis ⑥-string | hash | list

在这里插入图片描述

string类型基本介绍

Redis 中的字符串,是直接按照二进制的方式进行存储的。也就是说,在存取的过程中,是不会做任何编码转换的。存的是啥,取的时候就是啥。

Redis 的这个机制,就使得 Redis 非常适合用来存储各种各样的二进制数据,比如JSON、XML、图片、视频、音频、压缩包等等。

虽然可以存储视频、音频等,但还是不建议,因为这些文件大小往往都不小,容易造成阻塞

FLUSHALL

FLUSHALL
  • FLUSHALL 命令用于清空 Redis 数据库中的所有键值对。
  • 该命令谨慎使用为好。

string类型常用命令

SET

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
  • SET 命令用于设置键值对。
  • key 是要设置的键名,value 是要设置的键值。
  • EX seconds:设置键的过期时间为 seconds 秒。
  • PX milliseconds:设置键的过期时间为 milliseconds 毫秒。
  • NX:只在键不存在时,才对键进行设置操作。如果键存在,则不设置,返回 nil
  • XX:只在键存在时,才对键进行设置操作。如果键不存在,则不设置,返回 nil

GET

GET key
  • GET 命令用于获取键值对的值。
  • GET 命令只作用于该键对应的值为字符串类型,如果不为字符串类型,使用 GET 命令则会报错:

WRONGTYPE Operation against a key holding the wrong kind of value

MSET

MSET key value [key value...]
  • MSET 命令用于一次性设置多个键值对。
  • 所有键值对之间用空格分隔。
  • 时间复杂度为 O(N),这里 N 为要设置的键值对的数量。

MGET

MGET key [key...]
  • MGET 命令用于一次性获取多个键值对的值。
  • 所有键之间用空格分隔。
  • 时间复杂度为 O(N),这里 N 为要获取的键的数量。

SETNX

SETNX key value
  • 此处的 NX 就是上方 SET 命令中的 NX。

SETXX

SETXX key value
  • 此处的 XX 就是上方 SET 命令中的 XX。

SETEX

SETEX key seconds value
  • SETEX 命令用于设置键值对,并设置键的过期时间为 seconds 秒。
  • 等价于 SET key value EX seconds

PSETEX

PSETEX key milliseconds value
  • PSETEX 命令用于设置键值对,并设置键的过期时间为 milliseconds 毫秒。
  • 等价于 SET key value PX milliseconds

INCR

INCR key
  • INCR 命令用于对键的值做加 1 操作。
  • 返回值为执行加 1 操作之后的结果。
  • 执行该命令的键对应的值必须是 int 类型,否则会报错:

ERR value is not an integer or out of range

  • 该整数为 64 位 (8 字节)的,相当于 C++ 的 long long 类型,Java 的 long 类型。
  • 如果对一个不存在的键执行了该命令,则会创建一个默认值为 0 的键,并对其进行加 1 操作。

DECR

DECR key
  • DECR 命令用于对键的值做减 1 操作。
  • 返回值为执行减 1 操作之后的结果。
  • 其特性与 INCR 命令相同。

INCRBY

INCRBY key increment
  • INCRBY 命令用于对键的值做加法操作,加的值为 increment。
  • 返回值为执行加法操作之后的结果。
  • 其特性与 INCR 命令相同。

DECRBY

DECRBY key decrement
  • DECRBY 命令用于对键的值做减法操作,减的值为 decrement。
  • 返回值为执行减法操作之后的结果。
  • 其特性与 INCRBY 命令相同。

INCRBYFLOAT

INCRBYFLOAT key increment
  • INCRBYFLOAT 命令用于对键的值做浮点数的加法操作,加的值为 increment。
  • 返回值为执行浮点数加法操作之后的结果。
  • Redis 中的浮点数的精度为小数点后 17 位。
  • Redis 中的 string 类型并没有提供类似于 float、double 这样的浮点数类型。所以,其本质存的还是 embstr 或者 raw。
  • 执行该命令时,其分为三个步骤:将取出来的字符串转换为浮点数,进行浮点数加法操作,再将结果转换为字符串存回去。
  • 所以,该命令对性能有一定的影响,也不会,也不建议经常的使用。

上述操作的时间复杂度本质都还是 O(1)。由于 Redis 使用还是单线程模型,所以不用担心线程安全问题。


APPEND

APPEND key value
  • APPEND 命令用于在键对应的值的末尾追加字符串 value。
  • 返回值添加后的字符串的长度,该长度单位为字节
  • 如果改键存在,则执行追加操作。如果改键不存在,则先创建一个空值,再执行追加操作,相当于执行 SET 操作。
  • 注意:
    1. 当我们将值设置为一个汉字时,其返回的结果的为 3,这是因为我们当前使用的终端的编码方式是 UTF-8,而汉字的编码长度为 3,故存储在 Redis 中的长度为 3。
    2. 如果我们直接获取该键的值,则会看到类似于 \xe4\xbd\xa0 的结果,这是三个字节的 16 进制编码。根据 UTF-8 码表,可以得到其结果为
    3. 如果想直接看到汉字,我们可以在启动 Redis 客户端时,多添加一条命令 --raw,也就是 redis-cli --raw。这样,我们获取该键的值时,Redis 客户端就会自动的对该二进制数据尝试进行翻译。
redis-cli --raw

GETRANGE

GETRANGE key start end
  • GETRANGE 命令用于获取键对应的值的某一个特定范围的子字符串。
  • startend 是子字符串的起始和结束位置,都是 0 开始的偏移量。该获取区间为 左闭右闭
  • 返回值为对应区间的子字符串。
  • 注意: startend 都可以为负数,表示从字符串的末尾开始计算偏移量。比如 -1 为最后一个字符,-2 为倒数第二个字符,以此类推。

SETRANGE

SETRANGE key offset value
  • SETRANGE 用于从 offset 位置开始,将键对应的值覆写为 value。
  • 如果 offset 比当前字符串长度还要长,则会在字符串末尾补上空格后再进行覆写。
  • 返回值是设置成功之后,字符串的长度。
  • 如果该键不存在,则先创建一个空行值(\x00),再执行覆写操作。

STRLEN

STRLEN key
  • STRLEN 命令用于获取键对应值的字符串长度。
  • 返回值为字符串的长度,单位为字节。

string编码方式

  • Redis 字符串类型支持三种编码方式:rawembstrint
    1. raw:普通字符串,用于存储更长的字符串,底层是一个字节数组
    2. embstr:压缩字符串,当键对应的值字节数偏小时(据说是39字节),使用 embstr 编码,节省内存。
    3. int:64位/8字节 的整形,当存储的值为纯数字时,使用 int 编码。浮点数使用的编码还是 embstr。

string类型的使用场景

  • 作为缓存:作为应用服务器和数据库服务器的中间件,用于存储热点数据,提高查询的效率。
  • 计数:使用 Redis 作为基本的计数工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。
  • 存储 session 会话:对于使用了负载均衡的分布式系统,可以将 session 信息存储在 Redis 中,提高 session 共享的效率。
  • 短信验证码:设置验证码的有效时间,设置一个用户在规定的时间内只能获取 N 次验证码,防止用户恶意获取验证码,造成服务器压力。
    以上只是介绍了 Redis 中的 string 类型常见的使用场景,实际上还可以用在更多地方,具体需要根据业务需求进行选择。

hash类型基本介绍

`Redis 自身就是一个 hash类型,通过存储键值对,以达到 O(1) 的时间复杂度的快速访问。

这里的 hash类型,是 Redis 中 key-value 中的 value 的类型。也就是 value 是一个 hash 类型,可以存储键值对结构。

hash类型常用命令

HSET

HSET key field value [field value... ]
  • 区分这里 key 和 field 的区别:
    • key:Redis 自身存储的键,Redis 通过 key 可以访问到对应 value
    • field:当 Redis 中的 value 是一个 hash 类型时,field 也是该 hash 的 key。
  • 返回值为存储成功的键值对个数。
  • 如果 field 已经存在,则会覆盖原有的值。不论设置了多少个已经存在的 field,尽管设置成功了,返回值都为 0。因为这些字段的设置操作没有引入新的字段,只是更新了已有字段的值

HGET

HGET key field
  • 返回指定 key 下的指定 field 的值。

HEXISTS

HEXISTS key field
  • 判断指定 key 下的指定 field 是否存在。
  • 返回 1 代表存在,0 代表不存在。

HDEL

HDEL key field [field...]
  • 删除指定 key 下的指定 field。
  • 返回值为删除成功的键值对个数。

HKEYS

HKEYS key
  • 返回指定 key 下所有的 field 名称。
  • 该命令和 keys * 一样,谨慎使用。

HVALS

HVALS key
  • 返回指定 key 下所有的 field 值。
  • 该命令和 keys * 一样,谨慎使用。

HGETALL

HGETALL key
  • 返回指定 key 下所有的键值对。
  • 该命令和 keys * 一样,谨慎使用。

HMGET

HMGET key field [field...]
  • 返回指定 key 下的多个 field 值。
  • 返回值的顺序和 field 参数的顺序一致。

HMSET

HMSET key field value [field value...]
  • 批量设置多个 field 值。
  • 返回值不代表实际存储成功的键值对个数。
  • 该命令和 HSET 的作用一样,为了不那么反直觉,所以才有该命令。

HLEN

HLEN key
  • 返回指定 key 下的 field 数量,也就是 hash 元素的个数。

HSETNX

HSETNX key field value
  • 只有当 field 不存在时,才设置 field 值。如果存在则设置失败。

HINCRBY

HINCRBY key field increment
  • 给指定 key 下的指定 field 值增加指定增量。
  • 如果 field 不存在,则设置 field 值为 0 后再增加。
  • 返回值是增加后的值。
  • 这里不像 string 类型,有 DECRBY 命令,因为 hash 类型并不经常使用加减操作,而 HINCRBY 自身已经可以完成加减操作了

HINCRBYFLOAT

HINCRBYFLOAT key field increment
  • 给指定 key 下的指定 field 值增加指定浮点数增量。
  • 如果 field 不存在,则设置 field 值为 0 后再增加。
  • 返回值是增加后的值。

HSTRLEN

HSTRLEN key field
  • 返回指定 key 下的指定 field 值的字符串长度,单位为字节。
  • 如果 field 不存在,则返回 0。

hash编码方式

  • Redis 中的 hash 类型有两种编码方式:
    1. ziplist:是一种压缩链表,当 hash 类型中元素个数小于 hash-max-ziplist-entries 配置项 (默认为 512) 的值 或者 元素值总长度小于 hash-max-ziplist-value 配置项 (默认为 64) 的值时,Redis 使用 ziplist 编码。(在 Redis 4.0 版本后,ziplist 已被 listpack 替代)
    2. hashtable:当 hash 类型中元素个数大于等于 hash-max-ziplist-entries 配置项的值 或者 元素值总长度大于等于 hash-max-ziplist-value 配置项的值时,Redis 使用 hashtable 编码。

list类型基本介绍

list 类型相当于 数组 或者 链表。但其内部的编码方式并不是一个数组,其更接近于 “双端队列” (Deque)

列表中元素是有序的,该有序并不是 “升序” 或者 “降序”,而是元素在列表中的位置的先后顺序

列表中的元素是可以重复的。

获取和删除的区别,获取相当于 peek,删除相当于 pop

list类型常用命令

LPUSH

LPUSH key element [element...]
  • 该命令可以一次插入多个元素。
  • 这里的 L 表示的是 left,即从左边插入,也就是头插
  • 返回值是插入元素后列表的长度。

LRANGE

LRANGE key start stop
  • 该命令可以获取列表中指定范围的元素。
  • startstop 是索引,都可以是负数,表示从列表的末尾开始计数(-1 表示最后一个元素,-2 表示倒数第二个元素,以此类推)。两个区间都是闭区间。
  • startstop 都可以超过实际列表的索引范围,也不会报错。

LPUSHX

LPUSHX key element [element...]
  • 该命令和 LPUSH 类似,但只在列表存在时才插入元素。
  • 如果列表不存在,则返回 0,表示插入失败。

RPUSH

RPUSH key element [element...]
  • LPUSH 类似,但从右边插入,也就是尾插

RPUSHX

RPUSHX key element [element...]
  • LPUSHX 类似。

LPOP

LPOP key [count]
  • 该命令可以从列表左边弹出一个元素,也就是头删
  • 如果不填 count,则默认弹出一个元素。如果填 count,则弹出 count 个元素。

RPOP

RPOP key [count]
  • LPOP 类似,但从右边弹出,也就是尾删

LINDEX

LINDEX key index
  • 该命令可以获取列表中指定索引的元素。
  • index 可以是负数,表示从列表的末尾开始计数。
  • 如果索引越界,则返回 nil
  • 时间复杂度为 O(N),N 为列表的长度。

LINSERT

LINSERT key <BEFORE|AFTER> pivot element
  • 该命令可以在列表中插入元素。
  • element 为需要插入的元素。
  • pivot 为需要插入到哪个元素的前面或后面。如果为 BEFORE,则插入到 pivot 元素的前面;如果为 AFTER,则插入到 pivot 元素的后面。
  • 如果 pivot 元素不存在,则返回 -1,表示插入失败。
  • 如果 pivot 存在多个,则从左往右遍历匹配第一个 pivot 在其前面或后面插入。
  • 返回值为插入后的列表长度。
  • 时间复杂度为 O(N),N 为列表的长度。

LLEN

LLEN key
  • 该命令可以获取列表的长度。

LREM

LREM key count element
  • 该命令可以删除列表中指定元素。
  • count 为删除的元素个数。
  • 如果 count 等于 0,则删除所有 element
  • 如果 count 小于 0,则从右往左开始遍历依此删除 countelement
  • 如果 count 大于 0,则从左往右开始遍历依此删除 countelement

LTRIM

LTRIM key start stop
  • 保留 startstop 之间的元素,删除区间之外的元素。

LSET

LSET key index element
  • 该命令可以设置列表中指定索引的元素。
  • index 可以是负数,表示从列表的末尾开始计数。
  • 如果索引越界,则报错:ERR index out of range

BLPOP

BLPOP key [key...] timeout
  • 该命令为 阻塞 版本的 LPOP。如果执行 BLPOP 命令时,列表为空,则会阻塞 timeout 秒,直到列表中有元素被加入。
  • BLPOP 可以同时监听多个 key,当其中一个 key 加入元素后而不为空时,则返回该 key 和被弹出的元素。
  • 如果多个客户端同时执行 BLPOP,则最先执行 BLPOP 的客户端会得到弹出的元素。

BRPOP

BRPOP key [key...] timeout
  • 该命令为 阻塞 版本的 RPOP。其特性与 BLPOP 类似。

list编码方式

  • 在早期的 Redis 版本中,list 类型有两种编码方式:ziplistlinkedlist
  • 在 3.2 版本后,Redis 开始使用 quicklist 作为默认的 list 编码方式。
  • quicklist 使用 linkedlist 组织(双向链表),但每一个元素都是一个 ziplist,这样可以降低内存占用。

list的应用场景

  • 列表可以当作 “数组” 使用,用于存储多个元素。
  • 列表可以搭配 LPOPLPUSH 或者 RPOPRPUSH 当作 “栈” 使用,用于存储多个元素,先进后出。
  • 列表可以搭配 LPUSHRPOP 或者 RPUSHLPOP 当作 “队列” 使用,用于存储多个元素,先进先出。
  • 列表还可以通过使用 BLPOPBRPOP 担当 “生产者消费模型” 中的消息队列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

星火燎原:大数据时代的Spark技术革命在数字化浪潮席卷全球的今天,海量数据如同奔涌不息的洪流,传统的数据处理方式已难以满足实时、高效的需求。

星火燎原&#xff1a;大数据时代的Spark技术革命 在数字化浪潮席卷全球的今天&#xff0c;海量数据如同奔涌不息的洪流&#xff0c;传统的数据处理方式已难以满足实时、高效的需求。Apache Spark作为大数据领域的璀璨明星&#xff0c;凭借其卓越的性能和强大的功能&#xff0c…

通信算法之273 : 循环自相关函数和自相关函数

一、循环自相关函数定义与计算流程 ‌定义式‌: 循环自相关函数为时间平均自相关函数的傅里叶变换: Rxα(τ)=1T∫−T/2T/2Rx(t+τ2,t−τ2)e−j2παtdtRxα​(τ)=T1​∫−T/2T/2​Rx​(t+2τ​,t−2τ​)e−j2παtdt 其中,Rx(t,τ)Rx​(t,τ) 是信号的自相关函数,α为循…

使用 VMware 安装一台 Linux 系统之Centos

使用 VMware 安装一台 Linux 系统之Centos 想体验一下 Linux 的魅力&#xff0c;又不想在现有电脑上进行大刀阔斧的改动&#xff1f;使用 VMware 虚拟机是一个绝佳的选择。它能让你在 Windows 或 macOS 系统中轻松创建一个独立的 Linux 环境。本文将手把手带你完成从下载 VMwa…

uniapp-商城-36-shop 购物车 选好了 进行订单确认2 支付方式颜色变化和颜色滤镜filter

颜色滤镜&#xff0c;在好多网页都这样使用&#xff0c;滤掉彩色&#xff0c;显示黑白&#xff0c;这在一些关键的日子中都这样使用。 1、依然回到订单确认页面 看到支付的颜色了嘛&#xff1f; <view class"payType"><view class"box" :class&q…

gerbera文件转PCB文件-Altium Designer

gerbera文件转PCB文件-Altium Designer 1. 新建 CAM 文档2. 导入 Gerber 文件和钻孔文件导入 Gerber 文件导入钻孔文件&#xff08;NC Drill&#xff09; 3. 提取网络表4. 检查并设置层映射5. 导出为 PCB 文件 1. 新建 CAM 文档 打开 Altium Designer&#xff0c;执行以下操作…

Flask 请求数据获取方法详解

一、工作原理 在 Flask 中&#xff0c;所有客户端请求的数据都通过全局的 request 对象访问。该对象是 请求上下文 的一部分&#xff0c;仅在请求处理期间存在。Flask 在收到请求时自动创建 request 对象&#xff0c;并根据请求类型&#xff08;如 GET、POST&#xff09;和内容…

队列基础和例题

基础 #include <queue> #include <iostream>/*** 入队*/ void Test01() {std::queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(777);std::cout << "队列大小:" << q.size() << std::endl;std::cout << &q…

U-Mail邮件加速服务:全球链路加速,安全稳定收发

由于跨国网络拥堵、带宽不稳定等因素&#xff0c;导致海外用户在使用企业邮箱收发邮件时&#xff0c;经常出现邮件收发不畅的问题。针对这种情况&#xff0c;U-Mail正式推出了邮件加速服务&#xff0c;U-Mail邮件加速服务依托全球优质加速链路和转发集群服务器&#xff0c;为海…

从工作到娱乐:Codigger Desktop 让桌面环境更智能

在数字化时代&#xff0c;我们的桌面环境几乎成了第二个家。Codigger Desktop 就像是这个家的设计师&#xff0c;帮你打造一个既实用又舒适的数字空间。无论你是想放松娱乐&#xff0c;还是高效工作&#xff0c;Codigger Desktop 都能满足你的需求。 想象一下&#xff0c;你有一…

用python进行OCR识别

原文链接&#xff1a;https://www.bilibili.com/opus/1036675560501149699 我担心原作者删除&#xff0c;所以重新拷贝了一遍 1.下载tesseract 链接&#xff1a;https://github.com/UB-Mannheim/tesseract/wiki 这里示例安装最新版本 点击下载tesseract安装包 2.安装tess…

区间和数量统计 之 前缀和+哈希表

文章目录 1512.好数对的数目2845.统计趣味子数组的数目1371.每个元音包含偶数次的最长子字符串 区间和的数量统计是一类十分典型的问题&#xff1a;记录左边&#xff0c;枚举右边策略前置题目&#xff1a;统计nums[j]nums[i]的对数进阶版本&#xff1a;统计子数组和%modulo k的…

PCB 制造流程分步指南

最近的一次PCB打板经历&#xff0c;板厂工程人员告知丝印偏到焊盘上了&#xff0c;内部让我评估是否可以继续贴片。 于是发一期文章&#xff0c;介绍一下PCB制造流程。 PCB制造工艺 PCB设计获得批准且制造商收到最终制造文件后&#xff0c;PCB制造或生产就开始了。此时&…

python实现简单的UI交互

文章目录 1. 基础打印 覆盖同一行2. 多行动画效果3. 彩色文本&#xff08;Windows/macOS/Linux&#xff09;4. 输入交互5. 异步输入与非阻塞显示6. 高级控制台 UI 库 可以通过控制台打印实现简单的「伪UI交互」&#xff0c;尤其适合展示进度、动态文本或轻量级状态反馈。以下是…

AI与思维模型【77】——PDCA思维模型

一、定义 PDCA思维模型是一种用于持续改进和优化工作流程、项目实施以及问题解决的科学管理方法。它由四个英文字母组成&#xff0c;分别代表计划&#xff08;Plan&#xff09;、执行&#xff08;Do&#xff09;、检查&#xff08;Check&#xff09;和处理&#xff08;Act&…

10天学会嵌入式技术之51单片机-day-3

第九章 独立按键 按键的作用相当于一个开关&#xff0c;按下时接通&#xff08;或断开&#xff09;&#xff0c;松开后断开&#xff08;或接通&#xff09;。实物图、原理图、封装 9.2 需求描述 通过 SW1、SW2、SW3、SW4 四个独立按键分别控制 LED1、LED2、LED3、LED4 的亮…

vite+vue2+elementui构建之 package.json

webpack版本太低&#xff0c;构建依赖太多&#xff0c;头大。 各种查阅资料&#xff0c;弄了一份直通构建vite构建elementUi核心文件&#xff0c; 构建基于开源若依vue2vue3版本改造&#xff0c;感谢开源&#xff0c;感谢若依。 vitevue2elementui构建之 vite.config.js-CSD…

提升变电站运维效率:安科瑞无线测温系统创新应用

一、引言 变电站作为电力系统的关键枢纽&#xff0c;承担着变换电压、分配电能以及控制电力流向等重要任务。在变电站的运行过程中&#xff0c;电气设备的接点温度监测至关重要。过热问题可能由多种因素引发&#xff0c;如电阻过大、接头质量欠佳、衔接不紧密、物理老化等&…

DMA的三种传输功能

①内存到内存 #include "dma.h" #include "stdio.h"#define BUF_SIZE 16uint32_t src_buf[BUF_SIZE] {0x00000000,0x11111111,0x22222222,0x33333333,0x44444444,0x55555555,0x66666666,0x77777777,0x88888888,0x99999999,0xAAAAAAAA,0xBBBBBBBB,0xCCCCCCC…

【MySQL】MySQL 表的增删改查(CRUD)—— 下篇(内含聚合查询、group by和having子句、联合查询、插入查询结果)

目录 1. 插入查询结果 2 聚合查询 &#xff08;行与行之间运算&#xff09; count 计算查询结果的行数 sum 求和 avg 求平均值 max 最大值 min 最小值 【小结】 3. group by 子句 分组 where 条件 having 条件 4. 联合查询&#xff08;多表查询&#xff09; 内连接…

“思考更长时间”而非“模型更大”是提升模型在复杂软件工程任务中表现的有效途径 | 学术研究系列

作者&#xff1a;明巍/临城/水德 还在为部署动辄数百 GB 显存的庞大模型而烦恼吗&#xff1f;还在担心私有代码库的安全和成本问题吗&#xff1f;通义灵码团队最新研究《Thinking Longer, Not Larger: Enhancing Software Engineering Agents via Scaling Test-Time Compute》…