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.rhkb.cn/news/441086.html

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

相关文章

Redis篇(最佳实践)(持续更新迭代)

介绍一:键值设计 一、优雅的key结构 Redis 的 Key 虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过 44 字节不包含特殊字符 例如: 我们的登录业务&#xff0…

Leetcode—76. 最小覆盖子串【困难】

2024每日刷题&#xff08;167&#xff09; Leetcode—76. 最小覆盖子串 C实现代码 class Solution { public:string minWindow(string s, string t) {int bestL -1;int l 0, r 0;vector<int> cnt(128);for(const char c: t) {cnt[c];}int require t.length();int m…

【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)

文章目录 【实战教程】SpringBoot全面指南&#xff1a;快速上手到项目实战(SpringBoot)1. SpringBoot介绍1.1 SpringBoot简介1.2系统要求1.3 SpringBoot和SpringMVC区别1.4 SpringBoot和SpringCloud区别 2.快速入门3. Web开发3.1 静态资源访问3.2 渲染Web页面3.3 YML与Properti…

[SpringBoot] 苍穹外卖--面试题总结--上

前言 1--苍穹外卖-SpringBoot项目介绍及环境搭建 详解-CSDN博客 2--苍穹外卖-SpringBoot项目中员工管理 详解&#xff08;一&#xff09;-CSDN博客 3--苍穹外卖-SpringBoot项目中员工管理 详解&#xff08;二&#xff09;-CSDN博客 4--苍穹外码-SpringBoot项目中分类管理 详…

pytest(六)——allure-pytest的基础使用

前言 一、allure-pytest的基础使用 二、需要掌握的allure特性 2.1 Allure报告结构 2.2 Environment 2.3 Categories 2.4 Flaky test 三、allure的特性&#xff0c;allure.step()、allure.attach的详细使用 3.1 allure.step 3.2 allure.attach&#xff08;挺有用的&a…

Redis入门第四步:Redis发布与订阅

欢迎继续跟随《Redis新手指南&#xff1a;从入门到精通》专栏的步伐&#xff01;在本文中&#xff0c;我们将深入探讨Redis的发布与订阅&#xff08;Pub/Sub&#xff09;模式。这是一种强大的消息传递机制&#xff0c;适用于各种实时通信场景&#xff0c;如聊天应用、实时通知和…

3、Redis Stack扩展功能

文章目录 一、了解Redis产品二、申请RedisCloud实例三、Redis Stack体验1、RedisStack有哪些扩展&#xff1f;2、Redis JSON1、Redis JSON是什么2、Redis JSON有什么用3、Redis JSON的优势 3、Search And Query1、传统Scan搜索2、Search And Query搜索 4、Bloom Filter1、布隆过…

LabVIEW提高开发效率技巧----阻塞时钟

在LabVIEW开发中&#xff0c;阻塞时钟&#xff08;Blocking Timed Loops&#xff09;是一种常见且强大的技术&#xff0c;尤其适用于时间关键的应用。在这些应用中&#xff0c;精确控制循环的执行频率是关键任务。阻塞时钟通过等待循环的执行完成后再进入下一次迭代&#xff0c…

如何设置LTE端到端系统

LTE Setup Guide Baseline Hardware Requirements 基础硬件要求 需要2个RF前端和2个装有基于Linux的操作系统的PC。系统架构如下&#xff1a; srsUE&#xff1a;需要1个RF前端和1个PC。srsENB&#xff1a;需要1个RF前端和1个PC。srsEPC&#xff1a;需要1个PC。 系统硬件要…

python实现RC4加解密算法

RC4算法 一、算法介绍1.1 背景1.2 密钥调度算法(KSA)1.3 伪随机生成算法(PRGA) 二、代码实现三、演示效果 一、算法介绍 1.1 背景 RC4算法是由Ron Rivest在1987年为RSA数据安全公司设计的一种流密码算法&#xff0c;其安全性主要依赖于其密钥流的随机性和不可预测性。该算法因…

碰撞检测 | 图解视线生成Bresenham算法(附ROS C++/Python/Matlab实现)

目录 0 专栏介绍1 Bresenham算法介绍2 图解Bresenham算法3 算法流程4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战&#xff0c;包括&#xff…

架构设计之解析CQRS架构模式!

文章首发到公众号&#xff1a;月伴飞鱼 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://har…

【可视化大屏】Python Flask框架介绍

为了能显示真实数据&#xff0c;使用flask快速搭建了一个web应用&#xff0c;然后连接数据库&#xff0c;读取数据库里的数据来进行大屏可视化显示&#xff08;btw&#xff1a;数据是从车主之家网站上爬虫爬的&#xff09; 家人们&#xff01;记得使用专业版的pycharm&#xf…

保证文件只能在公司打开,走出公司就打不开这一神操作如何实现?一文告诉你详情!

在现代企业中&#xff0c;信息安全已经成为一项至关重要的任务。随着企业数据量的不断增加&#xff0c;如何确保敏感信息不被泄露成为企业面临的重要挑战。 其中&#xff0c;一种常见的需求是确保文件只能在公司内部环境中打开&#xff0c;一旦离开公司就无法访问。 本文将详…

计算机组成原理实验三 数据寄存器组R0..R3, MAR, ST, OUT

实验目的和要求 目的&#xff1a;了解模型机中各种寄存器结构、工作原理及其控制方法。 要求&#xff1a;利用CP226 实验系统上的K16..K23 开关做为DBUS 的数据&#xff0c;其它开关做为控制信号&#xff0c;将数据写入寄存器&#xff0c;数据寄存器组R0..R3&#xff0c;地址…

stm32开发环境的配置

keli5的安装 安装上以后&#xff0c;用管理员身份打开软件 复制里面的CID到破解软件里面 将Target调到ARM&#xff0c;然后生成 将注册码复制进软件那个界面&#xff0c;然后AddLIC就破解成功了 调试工具STLink驱动的安装 如果发现带感叹号代表驱动没有安装&#xff0c;但是设…

JavaEE之多线程进阶-面试问题

一.常见的锁策略 锁策略不是指某一个具体的锁&#xff0c;所有的锁都可以往这些锁策略中套 1.悲观锁与乐观锁 预测所冲突的概率是否高&#xff0c;悲观锁为预测锁冲突的概率较高&#xff0c;乐观锁为预测锁冲突的概率更低。 2.重量级锁和轻量级锁 从加锁的开销角度判断&am…

【Python时序预测系列】基于GRU模型实现多变量时间序列预测(案例+源码)

这是我的第363篇原创文章。 一、引言 单站点多变量单步预测问题----基于GRU实现多变量时间序列预测股票价格。 二、实现过程 2.1 读取数据集 dfpd.read_csv("data.csv", parse_dates["Date"], index_col[0]) print(df.shape) print(df.head()) fea_num …

OJ在线评测系统 微服务 OpenFeign调整后端下 nacos注册中心配置 不给前端调用的代码 全局引入负载均衡器

OpenFeign内部调用二 4.修改各业务服务的调用代码为feignClient 开启nacos注册 把Client变成bean 该服务仅内部调用&#xff0c;不是给前端的 将某个服务标记为“内部调用”的目的主要有以下几个方面&#xff1a; 安全性: 内部API通常不对外部用户公开&#xff0c;这样可以防止…

【目标检测】木制地板缺陷破损数据集338张6类VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3383 标注数量(xml文件个数)&#xff1a;3383 标注数量(txt文件个数)&#xff1a;3383 标注…