当前位置: 首页 > news >正文

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,最后底层编码使用了不同的方式。


相关文章:

Redis:通用命令 数据类型

Redis:通用命令 & 数据类型 通用命令SETGETKEYSEXISTSDELEXPIRETTLTYPEFLUSHALL 数据类型 Redis的客户端提供了很多命令用于操控Redis,在Redis中,key的类型都是字符串,而value有多种类型,每种类型都有自己的操作命…...

【Python高级编程】探索Python库:创建引人入胜的交互界面

1.制作交互界面常用到的库 在 Python 中,有多个库可以用于创建交互界面(GUI)。 以下是一些常用的 Python GUI 库: Tkinter: Python 的标准 GUI 库,通常随 Python 一起安装。简单易用,适合快速开发小型应用…...

OpenCV Canny()函数

OpenCV Canny()函数被用来检测图像物体的边缘。其算法原理如下: 高斯滤波:使用高斯滤波器平滑图像以减少噪声。高斯滤波器是一种线性滤波器,可以消除图像中的高频噪声,同时保留边缘信息。计算梯度强度和方向:使用Sobe…...

Java基础(3)

基本数据类型 Java 中的几种基本数据类型了解么? Java 中有 8 种基本数据类型,分别为: 6 种数字类型: 4 种整数型:byte、short、int、long2 种浮点型:float、double1 种字符类型:char1 种布尔…...

【C语言】VS调试技巧

文章目录 什么是bug什么是调试(debug)debug和releaseVS调试快捷键监视和内存观察编程常见错误归类 什么是bug bug本意是“昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程…...

【华为HCIP实战课程七】OSPF邻居关系排错MTU问题,网络工程师

一、MTU MUT默认1500,最大传输单元,一致性检测 [R3-GigabitEthernet0/0/1]mtu 1503//更改R3的MTU为1503 查看R3和SW1之间的OSPF邻居关系正常: 默认华为设备没有开启MTU一致性检测! [R3-GigabitEthernet0/0/1]ospf mtu-enable //手动开启MTU检测 [SW1-Vlanif30]ospf mtu…...

速盾:休闲类游戏如何选择高防cdn?

休闲类游戏的流行度日益增长,越来越多的玩家在业余时间里选择放松自己,享受游戏带来的乐趣。然而,在休闲类游戏中,网络延迟和游戏载入速度的问题常常会影响到玩家的游戏体验。为了解决这些问题,选择一个高防CDN&#x…...

电脑插上U盘不显示怎么回事?怎么解决?

平时使用电脑的时候经常会使用U盘来传输数据或是备份文件,有时候会遇到一个令头疼的问题,比如,将U盘插入电脑的USB口后,设备却显示不出来。电脑上插入U盘后却不显示会影响我们的正常工作。接下来,我们一起分析一下故障…...

Python 如何使用 SQLAlchemy 进行复杂查询

Python 如何使用 SQLAlchemy 进行复杂查询 一、引言 SQLAlchemy 是 Python 生态系统中非常流行的数据库处理库,它提供了一种高效、简洁的方式与数据库进行交互。SQLAlchemy 是一个功能强大的数据库工具,支持结构化查询语言(SQL)…...

nginx主配置文件

Nginx的主配置文件nginx.conf,一般定义了Nginx的基本设置和全局配置。下面是对这个配置文件的详细解释: 文件结构 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log …...

使用数据库:

数据库: 1.为何需要数据库? 存储数据方法 第一种:用大脑记住数据, 第二种:写纸上, 第三种:写在计算机的内存中, 第四种:写出磁盘文件 2.数据库能做什么&#xff1…...

python list, tuple dict,set的区别 以及**kwargs 的基本用法

在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 定义: list:链表,有序的项目, 通过索引进行查找,使用方括号”[]”; tuple:元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”; dict:字典,字典是一组键(key)和值(value…...

实用生活英语口语学习成人零基础入门柯桥专业外语培训

“秋裤”的英语表达 首先,秋裤肯定不是autumn pants,chill cool就更离谱了! 最地道的美语说法一定会用到“thermal”这个单词: ▼ “thermal”的意思是“热的、保温的”,由此延伸出“秋裤、保暖内衣”的表达&#xff…...

FLINK SQL数据类型

Flink SQL支持非常完善的数据类型,以满足不同的数据处理需求。以下是对Flink SQL数据类型的详细归纳: 一、原子数据类型 字符串类型 CHAR、CHAR(n):定长字符串,n代表字符的定长,取值范围为[1, 2147483647]。如果不指…...

汇编语言教程:打造你的第一款汇编语言小游戏 汇编语言教程攻略

目录 游戏详细简介 完整代码示例(不少于70行) 如何自学汇编语言游戏开发攻略及功能 游戏详细简介 游戏名称:“太空探险” 游戏简介:这是一款基于x86汇编语言开发的简单2D游戏。在游戏中,玩家扮演一名宇航员&#…...

白色简洁大方公司企业网站源码 WordPress主题2款

WordPress白色简洁大方公司企业网站主题2款 白色整洁风格wordpress主题是一款比较新颖的国际设计范风格 简洁而大方的 WordPress 主题,适合个人博客、企业和工作室用。 完美支持下拉菜单的wordpress企业主题。 wordpress简白企业模板是一款适合企业站以及工作室…...

MinIO分片上传超大文件(纯服务端)

目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…...

leetcode链表(一)-移除链表元素

题目 t. - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 例1 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]…...

python的特殊方法——魔术方法

前言 __init__(self[]) ​编辑 __call__(self [, ...]) __getitem__(self, key) __len__(self) __repr__(self) / __str__(self) __add__(self, other) __radd__(self, other) 参考文献 前言 官方定义好的,以两个下划线开头且以两个下划线结尾来命名的方法…...

深入浅出理解TCP三次握手与四次挥手

目录 引言1.为什么需要三次握手?2. 三次握手的过程3. 为什么需要四次挥手?4. 四次挥手的过程5. 为什么挥手需要四次,而握手只需三次?6. 三次握手与四次挥手的时序图7. TIME_WAIT状态的意义8. 总结9.面试时候问到什么是三次握手和四…...

如何在Windows和Linux查看正在监听的端口和绑定的进程

端口(Port)和进程(Process)是计算机网络和操作系统中的重要概念,它们之间有着密切的关系。以下是对这两个概念的详细介绍以及它们之间的关系(附Windows和Linux查看端口和进程的命令): 端口(Por…...

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层: 1.1 FM部分(因子分解机层&#…...

基于opencv答题卡识别判卷

我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色:深度实…...

ShardingSphere分库分表产品介绍

目录 一、ShardingSphere分库分表产品介绍 二、客户端分库分表与服务端分库分表 1、ShardingJDBC客户端分库分表 2、ShardingProxy服务端分库分表 3、ShardingSphere混合部署架构 三、分库分表,能不分就不分! 1、为什么要分库分表? 2、…...

Java经典面试题-多线程打印

threadsynchronized 就好像一个圆圈,A->B->C->A。。。。。 synchronized能够保证多个线程进入实,只用一个线程能进入。 /**多线程交替打印* */ public class Task {private final Object lock new Object();private int count 0;public st…...

FireFox简单设置设置

文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…...

Sollong手机——一站式Web3生态解决方案

从定义上讲,Web3公司也属于互联网公司,不过与传统互联网公司相比,他们有一个很明显的特征:他们不断尝试做去中心化的事,一步步将数据和金融的控制权从美联储(央行和金融机构)、苹果(…...

《重生到现代之从零开始的数据结构生活》—— 顺序表1

线性表 线性表:是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构,常⻅的线性表有顺序表、链表、栈、队列、字符串等等 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连…...

2本书让你轻松入门大模型!《大模型入门:技术原理与实战应用》+《自然语言处理:大模型理论与实践》

随着大模型技术的不断完善和普及,我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效,并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一,以GPT为代表的大模型应用一经推出在短…...

【JDK17 | 1】Java 17 深入剖析:新特性与变革

引言 Java 17 是 Oracle 发布的一个重要版本,它不仅是一个长期支持(LTS)版本,还引入了许多新的特性和改进,为开发者提供了更强大的工具和更优雅的编程体验。在本专栏的文章中,我们将对 Java 17 的新特性进行深入剖析,帮助开发者更好地理解和利用这一版本。 1. 新特性概述…...