Redis的常见数据类型

Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每
种数据结构的常⻅命令,会在使⽤ Redis 的时候做到游刃有余。

预备

        在正式介绍 5 种数据结构之前,了解⼀下 Redis 的⼀些全局命令、数据结构和内部编码、单线程 命令处理机制是⼗分必要的,它们能为后⾯内容的学习打下⼀个良好的基础。
主要体现在两个方面
  1. Redis的命令有上百个,只是死记硬背比较困难,但是如何理解Redis的一些机制,会发现这些命令有很强的通用性。
  2. Redis不是万金油,有些数据结构和命令必须在特定的场景下使用,一旦使用不当可能会对Redis自身造成致命伤害

全局命令

        Redis有5种数据结构,但是它们都是对值而言,不过对于键,倒是有一些通用的命令。

KEYS

返回所有满足样式的key。支持如下

• h?llo 匹配 hello , hallo 和 hxllo

• h*llo 匹配 hllo 和 heeeello

• h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo

• hello 匹配 hallo , hbllo , ... 但不匹配 hello

• h[a-b]llo 匹配 hallo和 hbllo

举例如下

EXISTS

判断某个key是否存在

举个例子

DEL

删除指定的key

举个例子

EXPIRE
         为执行的key添加过期时间
举个例子

TTL

获取指定key的剩余时间

TYPE

返回key对应的数据类型

返回值: none , string , list , set , zset , hash and stream

数据结构和内部编码

type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列
表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是 Redis 对外的数据结构

Redis的数据结构和内部编码

数据结构内部编码
stringraw
int
embstr
hashhashtable
ziplist
listlinkedlist
ziplist
sethashtable
intset
zsetskiplist
ziplist
可以看到每种数据结构都有⾄少两种以上的内部编码实现,例如 list 数据结构包含了 linkedlist 和
ziplist 两种内部编码。同时有些内部编码,例如 ziplist,可以作为多种数据结构的内部实现,可以通过 object encoding 命令查询内部编码,举例:

Redis这样设计有很大的好处:

 1) 可以改进内部编码,⽽对外的数据结构和命令没有任何影响,这样⼀旦开发出更优秀的内部编码, ⽆需改动外部数据结构和命令,例如 Redis 3.2 提供了 quicklist,结合了 ziplist 和 linkedlist 两者的优势,为列表类型提供了⼀种更为优秀的内部编码实现,⽽对⽤⼾来说基本⽆感知

 2)多种内部编码实现可以在不同场景下发挥各⾃的优势,例如 ziplist ⽐较节省内存,但是在列表元素 ⽐较多的情况下,性能会下降,这时候 Redis 会根据配置选项将列表类型的内部实现转换为 linkedlist,整个过程⽤⼾同样⽆感知。

单线程架构

        Redis 使⽤了单线程架构来实现⾼性能的内存数据库服务,本节⾸先通过多个客⼾端命令调⽤的例⼦说明 Redis 单线程命令处理机制,接着分析 Redis 单线程模型为什么性能如此之⾼,最终给出为什么理解单线程模型是使⽤和运维 Redis 的关键。
简介
宏观上同时要求服务的客户端

微观上客户端发送命令的时间是有先后次序的

为什么单线程可以这么快
通常来讲,单线程处理能⼒要⽐多线程差,例如有 10 000 公⽄货物,每辆⻋的运载能⼒是每次
200 公⽄,那么要 50 次才能完成;但是如果有 50 辆⻋,只要安排合理,只需要依次就可以完成任务。那么为什么 Redis 使⽤单线程模型会达到每秒万级别的处理能⼒呢?可以将其归结为三点
  • 纯内存访问。Redis将所有的数据放在内存中,内存的响应时长大约是100ns,这是Redis达到每秒万级别的重要基础。
  • 非阻塞IO。Redis使用epoll作为IO多路复用技术的实现,在加上Redis自身的事件处理模型将epoll中的链接、读写、关闭都转换成事件,不在网络IO上浪费过多的事件。
  • 单线程避免了线程切换和竞态产生的消耗。单线程可以简化数据结构和算法的视线,让程序模型更加简单;其次避免了多线程中在线程竞争同一份共享资源时带来的切换的等待消耗。

虽然单线程给 Redis 带来很多好处,但还是有⼀个致命的问题:对于单个命令的执⾏时间都是有
要求的。如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客户端的阻塞,对于 Redis 这种⾼性能的服务来说是⾮常严重的,所以 Redis 是⾯向快速执⾏场景数据库。
String字符串
字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:
  1. Redis中的所有的键的类型都是字符串类型,而且其他几种数据类型也都是在字符串类似基础上构建的。
  2. 字符串的值实际可以是字符串,包含一般格式的字符串或者类似JSON、XML格式的字符串,数字。可以使整型或者浮点型;甚至是二进制流数据

常见命令

set

将string类型的value设置到key中。如果key之前存在,就修改;不存在就创建。

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]

SET命令支持多种选项来影响它的行为

  • EX seconds —— 使用秒为单位来设置key的过期时间
  • PX milliseconds——使用毫秒作为单位设置key的过期时间
  • NX——只有key不存在的时候才设置
  • XX——只有key存在的时候才设置

举个例子

get

获取 key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是 string,会报错
GET key

MGET
一次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil。
MGET key [key ...]

举个例子

mset

一次性设置多个key的值

MSET key value [key value ...]

举个例子

setnx

设置 key-value 但只允许在 key 之前不存在的情况下。
SETNX key value

计数命令

incr

将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

incrby

        将 key 对应的 string 表⽰的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
INCRBY key decrement

举个例子

DECR
        将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错
DECR key

DECYBY
将 key 对应的 string 表⽰的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
DECRBY key decrement
INCRBYFLOAT
将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数。
INCRBYFLOAT key increment

其他命令

append

如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。
APPEND KEY VALUE

getrange

返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的⻓度调整成正确的值
GETRANGE key start end

SETRANGE
覆盖字符串的⼀部分,从指定的偏移开始。
SETRANGE key offset value

STRLEN
获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错。
STRLEN key

结算

内部编码

字符串类型的内部编码有 3 种:
  • int:8个字节的整型
  • embstr:小于等于39个字节的字符串
  • raw:大于39个字节的字符串
Redis 会根据当前值的类型和⻓度动态决定使⽤哪种内部编码实现。

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

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

相关文章

爬虫逆向--Day20Day21--扣JS逆向练习【案例4:深证信服务平台】

一、案例【深证信数据服务平台】案例地址链接:https://webapi.cninfo.com.cn/#/marketDataDate案例爬取链接:https://webapi.cninfo.com.cn/api/sysapi/p_sysapi10071.1、入口定位当进行入口定位时,我们首先需要进行查看响应、载荷、请求头是…

ExcelJS实现导入转换HTML展示(附源码可直接使用)

目录 简介 开始实践 难点 文件示例 效果预览 具体实现 安装 完整代码 总结 简介 在日常工作中,我们可能会遇到需要上传并展示 Excel 文件的需求,实现文件内容的在线预览。 这里给大家接收一个组件库exceljs,这个组件库进过实践发现…

ECDH和数字签名

文章目录一、核心区别:目的完全不同二、协同工作关系:缺一不可的安全组合三、技术结合点:都基于ECC(椭圆曲线密码学)ECDH(椭圆曲线迪菲-赫尔曼密钥交换)和数字签名(如ECDSA,椭圆曲线数字签名算法…

withCredentials(简单说:带不带凭证)

一、withCredentials是什么?withCredentials 是浏览器 XMLHttpRequest 或 Fetch API(以及 axios 等基于它们的库)中的一个配置项,作用是控制跨域请求时是否携带 Cookie、HTTP 认证信息等凭证。用更通俗的方式解释:二、…

window系统使用命令行来安装OpenSSH服务器或客户端

可以通过 PowerShell 命令行来安装,这种方式更直接可靠:以管理员身份打开 PowerShell: 按下 Win S 搜索 “PowerShell”右键点击 “Windows PowerShell”,选择"以管理员身份运行"安装 OpenSSH 客户端: Add-…

vim中常见操作及命令

在 Vim 中为所有行的行首添加相同字符,可以使用以下方法: 方法1:使用 :%s 替换命令(推荐) vim :%s/^/要添加的字符/ 例如要在所有行首添加 #:vim :%s/^/#/ 方法2:使用块选择模式(可视…

开发使用mybatis是用混合模式还是全注解模式

在使用 MyBatis 开发项目时,Mapper 接口是为数据库操作提供最直观的方法,但在实现方式上,我们有两种选择:全注解模式和混合模式。那么,他们有什么区别,应该如何选择?我们一起来讨论一下。一、全…

WS2812灯带效果设计器上位机

软件使用方法介绍:bilibili地址 【免写单片机代码WS2812灯带效果设计软件-哔哩哔哩】 https://b23.tv/xFhxMGm

Docker 容器(二)

Docker四、Docker容器数据卷1.数据卷的主要特点2.卷的共享与继承(1)卷的共享(Sharing)(2) 卷的继承(Inheritance)3.数据卷运行实例五、Dockerfile1.Dockerfile2. 创建一个名为 myubuntu的自定义镜像第 1 步…

PCB基础细节--工艺篇

pcb基础细节(工艺篇) 1. 孔与焊盘2. PCB各层之间的作用3. 阻抗匹配 3.1. 什么是传输线?我们只看特性阻抗,时延以后再说。 在画原理图时,我们把电阻,电容,电感是抽象成一个点了。两边加一个电压&…

信创服务器总死机原因及解决办法

哈喽,你好啊,我是雷工!最近有个项目使用信创的服务器,总是出现死机的情况,联系厂家检查了一下,说是沐创网卡固件较低造成的,让移除网卡或升级固件尝试一下。记得5月份按厂家的说法处理过一台&am…

03_网关ip和端口映射(路由器转发)操作和原理

网关ip和端口映射(路由器转发)操作和原理IP 与端口映射配置全指南:2 种方案搞定外网访问内网一、先搞懂:为什么需要 IP 与端口映射?二、方案一:路由器端口映射(适合有公网 IP,长期稳…

「数据获取」《安徽建设统计年鉴》(2002-2007)(2004、2006缺失)(获取方式看绑定的资源)

01、数据简介《安徽建设统计年鉴》是一部全方位反映安徽省建设事业发展变迁的重要统计资料著作。该书系统收集并精心整理了 2006 年度安徽省城乡建设领域的核心统计数据,涵盖城乡建设固定资产投资、建筑业发展态势、城镇建设推进情况等多个关键方面,为政…

Python/JS/Go/Java同步学习(第一篇)格式化/隐藏参数一锅端 四语言输出流参数宇宙(附源码/截图/参数表/避坑指南/老板沉默术)

🤝 免骂声明: 本文四语言输出流参数经本蜀黎实战整理,旨在提供快速参考指南📝因各语言版本迭代及不同系统环境差异,偶尔可能出现整理不全面之处,实属正常✅欢迎理性交流补充,喷子勿喷——毕竟你…

人工智能助力流感疫苗选择:MIT 团队推出 VaxSeer 系统

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

使用 qmake 生成 Makefile,Makefile 转换为 Qt 的 .pro 文件

使用 qmake 生成 Makefile 的完整指南 qmake 是 Qt 提供的构建工具,用于从 .pro 项目文件生成 Makefile。以下是详细的使用方法: 基本使用方法 1. 从 .pro 文件生成 Makefile bash qmake -o Makefile your_project.pro2. 直接运行 qmake(自动…

利用DeepSeek编写验证xlsx格式文件中是否启用sharedStrings.xml对读写效率影响python程序

让他分别用100*10000个单元格有100、1000、10000个不同的1-200字符长的大写英文字母字符串测试. 一开始DeepSeek没有找到启用sharedStrings.xml的写xlsx模块,我自己找了pyxlsbwriter的例子告诉他才改好的。 import os import time import random import string impo…

【C++框架#2】gflags 和 gtest 安装使用

spdlog 安装和使用 1. 概述 介绍:spdlog 是一个高性能、超快速、零配置的 C 日志库,它旨在提供简洁的 API 和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录。 github 链接:htt…

平衡掌控者-游戏数值战斗设计

一、有效生命值1、计算公式有效生命生命值/(1-伤害减免率)/(1-闪避率)2、前摇和后摇对数值来说,战斗由两大模块组成,一个是战斗公式生效前的战斗攻击流程,一个是战斗公式与自身流程。比如说&…

使用DataLoader加载本地数据 食物分类案例

目录 一.食物分类案例 1..整合训练集测试集文档 2.导入相关的库 3.设置图片数据的格式转换 3.数据处理 4.数据打包 5.定义卷积神经网络 6.创建模型 7.训练和测试方法定义 8.损失函数和优化器 9.训练模型,测试准确率 10.测试模型 之前我们DataLoader加载…