Redis:通用命令 数据类型

Redis:通用命令 & 数据类型

    • 通用命令
      • SET
      • GET
      • KEYS
      • EXISTS
      • DEL
      • EXPIRE
      • TTL
      • TYPE
      • FLUSHALL
    • 数据类型


Redis的客户端提供了很多命令用于操控Redis,在Redis中,key的类型都是字符串,而value有多种类型,每种类型都有自己的操作命令,但是也有一些与类型无关的命令,称为通用命令

本博客讲解Redis中的通用命令以及数据类型。

redis的命令不区分大小写,由于小写可读性更好,所以博客后续使用小写。

通用命令

SET

  • 设置一个键值对
set key value

此处要求keyvalue都是字符串,可以加单引号或双引号,也可以不加。


GET

  • 获取键对应的值
get key

在这里插入图片描述

此处由于先前以及插入了key1,成功查询到value1。如果查询不存在的值,会返回nil,这表示不存在,相当于C语言的NULL


KEYS

  • 获取所有满足正则的key
keys pattern

常见的正则符号:

  • ?:匹配一个任意字符
  • *:匹配任意多个任意字符
  • [abc]:只能匹配abc三者之一,匹配一次
  • [^a]:排除e,其它的都能匹配,匹配一次
  • [a-c]:匹配ac范围内的字符,匹配一次

再多的正则匹配法则就不讲解了,以上五个是官方给出的五种匹配法则。

在这里插入图片描述

如图,一开始插入了四个键值对,随后根据以上五种正则进行匹配,筛选出了不同的key

要注意的是,keys会遍历Redis内部的所有数据,时间复杂度为O(N)。生产环境中一般会禁止使用这个命令。


EXISTS

  • 判断一个或多个key是否存在
exists key [key ...]

exists后可以跟着多个key,最后返回存在的key的个数。

因为底层使用哈希表组织数据,所以该操作的复杂度为O(1)

在这里插入图片描述

上例中,先同时查询了hallohello,返回2说明两个都存在。后面又分别查询两者。

问题来了,同时查询多个key和分开查询有什么区别吗?

其实区别可大了,因为Redis是基于网络实现的,客户端敲入的每一个命令都要包装为一个请求发给客户端,客户端再进行响应。如果一次性查询多个key,一次请求就可以完成查询,而多次查询则需要多个网络请求,效率会低很多。

因为网络要与硬件进行IO,封装层数多,速度是非常慢的。这是Redis的缺陷,因此Redis在设计时,就尽可能支持让一个命令完成多个操作。


DEL

  • 删除指定的key
del key [key ...]

同样的,del也支持多个key同时删除。


EXPIRE

  • 为指定的key添加秒级的过期时间
expire key seconds

所谓过期时间,就是一个数据的有效期,当数据超过过期时间,数据就会被自动删除。比如说常见的验证码,就可以用这个过期时间实现。

返回1表示成功,0表示失败,如果对不存在的key设置过期时间,就会失败。

在这里插入图片描述

如图,设置了一个hello变量,并设置过期时间为5 s,随后立刻查询,可以查询到hello,再过一段时间就被自动删除了,查询结果为nil

如果想要更加精确的时间,可以使用pexpire命令,该命令的时间单位是毫秒。


TTL

  • 获取key的秒级过期时间
ttl key

如果key没有过期时间,返回-1,如果key不存在,返回-2,其他情况返回剩余时间。

在这里插入图片描述

如图,设置hello后,查询ttl,由于key没有设置过期时间,此时返回-1。设置过期时间为5 s,后两次查询分别查询到41,为剩余的过期时间。最后一次查询结果为-2,表示key不存在,因为已经过期删除了。

另外的,ttl也有毫秒级别的指令pttl

那么Redis是如何实现定期删除的?

此处采用了定期删除+惰性删除的策略:

  • 定期删除:每隔一段时间,抽取一部分数据检查,看是否有过期的数据,将其删除
  • 惰性删除:当用户操作数据时,检测一遍这个数据是否过期,如果过期就删除,再给用户返回key不存在

因为Redis内部要存储不少数据,轮询一遍所有数据要浪费很多时间,所以不会遍历所有数据判断过期。而是等待用户访问数据才删除,或者抽样检查删除,以降低删除过期数据带来的时间浪费。


TYPE

  • 返回key对应的value的类型
type key

Redis中,所有的key都是字符串类型,而value有多种类型。如果返回none表示key不存在。


FLUSHALL

  • 删除Redis中所有数据
flushall

这个命令在生产环境中千万不要敲,这就是删库操作,只是在学习过程中可能要清除以前的数据,才需要用到。


数据类型

官方文档中,给出了以下基础数据类型:

  • String:字符串
  • Hash:哈希
  • List:列表
  • Set:集合
  • Sorted set:有序集合
  • Stream:流
  • Bitmap:位图
  • Bitfield:位字段
  • Geospatial:地理信息

除此之外,Redis还支持一些其它的扩展类型。在基础类型中,最常用的是前五种类型。

Redis非常追求高效,在数据类型方面,向用户承诺这些数据类型使用起来可以达到指定效果,但是底层具体如何实现,这就不能保证了。就比如说哈希表,它保证用户用起来和哈希表没有区别,可以以O(1)的时间复杂度完成增删查改,但是底层是不是使用哈希表,就不一定了!

每种数据类型,都可能会有多种实现方式,Redis称其为编码方式,常见编码方式如下表:

数据类型内部编码
stringraw
int
embstr
hashhashtable
ziplist
listlinkedlist
ziplist
sethashtable
intset
zsetskiplist
ziplist
  • string
    • raw:最基本的字符串,底层就是一个字符数组
    • int:当value是一个整数,此时会用int来保存
    • embstr:针对短字符串的优化

value默认传入时都是字符串,如果检测到字符串是一个数字,就转为int存储。比如说字符串"12345678",如果用字符串存储需要8 byte,但是Redis检测到其为整数后,转为int存储,只需要4 byte

  • hash

    • hashtable:标准的哈希表
    • ziplist:压缩列表,当哈希表元素比较少,可以通过该结构压缩空间
  • list

    • linklist:标准的链表
    • ziplist:压缩列表,当链表元素比较少,可以通过该结构压缩空间

Redis 3.2后,list统一使用quicklist,取消了linklistziplist,因为quicklist兼顾了两者的特性。简单来说,quicklist基本结构是一个linklist,而每一个链表节点是一个ziplist,也就是说耦合了前两者。

  • set
    • hashtable:基于哈希表实现的集合
    • intset:如果集合都是整数,会优化为该结构

在现代编程语言中,常会使用平衡二叉搜索树,比如红黑树来实现set,其时间复杂度为O(lgN)。但是Redis为了更加高效,采用了O(1)时间复杂度的哈希表实现set

  • zset
    • skiplist:跳表
    • ziplist: 压缩列表,当集合元素比较少,可以通过该结构压缩空间

此处的跳表也是一种搜索结构,时间复杂度属于O(lgN)级别,与平衡二叉搜索树属于同一级别。

如果想要查看数据类型底层具体使用了什么编码,可以使用指令object encoding

object encoding key

在这里插入图片描述

如图,同为string类型的三个value,最后底层编码使用了不同的方式。


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

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

相关文章

await的作用(举例)

问: 当方法a中又三个方法a1、a2、a3、a4都是异步函数,现在在a2、a4追加await,方法执行顺序是什么?主进程顺序是什么? 答: 通过一个具体的例子来说明当方法 a 中有四个异步方法 a1、a2、a3 和 a4&#xff…

Spring Cache 的说明及常用注解

一.介绍 Spring Cache是Spring Framework中的一个模块,用于简化和统一缓存的使用。它提供了一种将缓存逻辑与应用程序业务逻辑分离的方式,使得我们可以更方便地使用缓存来提高应用程序的性能。 二.主要特性 注解支持:Spring Cache提供了一组…

python 自学总结

# 这是一个代码的注释 注释可以使用# 一般而言#号后面要加空格表示规范,多行注释使用“”“ ”“”符合包裹 # type()这个是判断变量类型# 变量的形式 meny 50 # 自己定义叫标识符 不可以使用关键字 不可以用字母开头 规范性 下划线命名法 英文字母全部小写 …

Dbt增量策略模型实践指南

参考:dbt Incremental Strategies | Indicium Engineering (medium.com) 本文讨论dbt的增量策略,介绍工作原理、以及各自优缺点。下篇讲解如何在模型中实现增量策略。 使用增量模型可以仅仅处理最近的数据,减少数据处理成本和时间。当然首先要…

Solon 3.0 引入 SqlUtils :数据库操作的反朴归真

Solon 3.0 版本发布后,带了一个新的特性 —— SqlUtils。这一全新的数据库操作框架给开发者提供了更加透明、灵活的数据库交互方式,可显著提升了代码的透明度和维护性。本文将浅入探讨 SqlUtils 的引入背景、使用方法以及它对市场和开发者群体的潜在影响…

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix; 2. pytorch 与 pytorch geometric 各…

自动化的抖音

文件命名 main.js var uiModule require("ui_module.js"); if (!auto.service) {toast("请开启无障碍服务");auto.waitFor();} var isRunning true; var swipeCount 0; var targetSwipeCount random(1, 10); var window uiModule.createUI(); uiMo…

ComfyUI | 5分钟部署最新Flux大模型

Midjourney 和 Stable Diffusion 都是目前流行的 AI 图像生成工具,它们能够根据文本描述生成高质量的图像。都是基于深度学习技术的文本到图像生成模型,但它们各自基于不同的大模型。 但最近推出了一款比前两者更强大,生成图像更加逼真&…

windows端口被占用但是查不到进程的问题排查

在开发环境上经常遇到端口被占用,但是 netstat -ano|findstr 3306 查不到进程号,没法强杀解决。 这种情况,很有可能端口被排除了,可用命令: netsh interface ipv4 show excludedportrange protocoltcp 可以看到mysql的…

前端面试题(十四)

76. 前端性能优化 前端性能优化有哪些常见方法? 减少 HTTP 请求: 合并 CSS、JavaScript 和图片文件。使用雪碧图 (Sprite) 减少图片请求数。 资源压缩和合并: 压缩 JavaScript 和 CSS 文件,减少文件体积。使用工具如 UglifyJS、…

一、制作UI自适应

当前分辨率 更改分辨率 一、原因 一款游戏的UI,可能会根据玩家的分辨率和屏幕尺寸,产生不同的变化 例如:某一个Image位移到了摄像机外面 因此需要通过锚点和屏幕自适应来制作完美的效果 二、解决方法 1、锚点 作用是:根据当…

Unity3D相关知识点总结

Unity3D使用的是笛卡尔三维坐标系,并且是以左手坐标系进行展示的。 1.全局坐标系(global) 全局坐标系描述的是游戏对象在整个世界(场景)中的相对于坐标原点(0,0,0)的位置…

前端接收到的日期格式为 2021-12-07T16:44:53.298+00:00 怎么办?

在写项目的时候,给前端发送了一个 Date 类型的数据,发现格式不对: 可以通过在application 配置文件中进行如下配置: spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8 前端在获取就发现格式正确

嵌入式硬件设计:从原理到实践

嵌入式硬件设计:从原理到实践 嵌入式硬件设计在物联网、智能设备、工业自动化等领域中扮演着至关重要的角色。随着技术的发展,越来越多的设备依赖于嵌入式系统进行实时控制与数据处理。本文将详细介绍嵌入式硬件设计的各个方面,从设计原理到…

Study-Oracle-11-ORALCE19C-ADG集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、ORACLE--ADG VS ORACLE--DG的区别 1、DG是Oracle数据库的一种灾难恢复和数据保护解决方案,它通过在主数据库和一个或多个备用数据库之间实时复制数据,提供了数据的冗余备份和故障切换功能。…

实现一个时钟

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter>//画家类 #include<QTime>//时间类 #include<QTimer>//定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget …

项目管理——Gantt图与Pert图

目录 前言相关知识点相关题目 前言 本文是在关于软考中软件设计师中的项目管理中的知识点&#xff0c;关于Gantt图与Pert图 相关知识点 甘特&#xff08;Gantt&#xff09;图 优点 可以清晰的描述每个任务从何时开始的&#xff0c;到何时结束&#xff0c;任务的进程情况以及…

互联网协议(IP)中最常用的端口

80 端口和 443 端口是互联网协议&#xff08;IP&#xff09;中最常用的两个端口&#xff0c;分别用于 HTTP 和 HTTPS 通信。以下是它们的作用、区别以及相关背景信息&#xff1a; 80 端口和 443 端口的作用 80 端口&#xff1a; 用于 HTTP&#xff08;HyperText Transfer Prot…

C++和OpenGL实现3D游戏编程【连载14】——VBO、VAO和EBO应用

&#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 我们从一开始学OpenGL到现在&#xff0c;OpenGL的图形绘图必须在glBegin()和glEnd()函数之间完成&#xff0c;在此基础之上&#xff0c;才能进行后续操作功能。但是我们今天要讨论一下OpenGL图形绘制的模式&a…

SSM(5)(动态sql <if>、<where>、返回主键值)

返回主键值&#xff1a; 方法一&#xff1a; useGeneratedKeys 为ture 声明 返回主键 keyProperty 表示要返回的值 封装到对象的属性中 但是这一种方法不支持Orcal数据库。 <insert id"save2" parameterType"com.findyou.entity.User" useGenerated…