Redis:通用命令 数据类型

news2024/11/23 12:12:40

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.coloradmin.cn/o/2188574.html

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

相关文章

DMA 正点原子版

就是介绍一下dma,只能内存到外设,外设到内存,内存到内存,不能外设到外设这样进行数据传输 这个是 可以看这个表来查,哪个dma的哪个通道用来传输什么数据,这个是芯片固定好的,只能看表查&#xf…

Geogebra基础篇002—关于Geogebra软件的介绍及与MatLab的区别

为什么要学Geogebra? 因为和MatLab的科学计算相比,GeoGebra重点突出教学展示,对于教师、学生人群来讲再合适不过了,尤其是可以融入到PPT里边呈现交互式动画,想想听众的表情!这不就弥补了看到PPT播放数学公…

Python+Matplotlib-高等数学上-P7-例如部分可视化

import numpy as np import matplotlib.pyplot as plt# 设置中文字体,确保中文显示正确 plt.rcParams[font.sans-serif] [SimHei] # 用黑体显示中文 plt.rcParams[axes.unicode_minus] False # 正常显示负号# 设置图形和子图 fig, (ax1, ax2) plt.subplots(2, …

Qt 5开发步骤及实例

目录 界面设计编写相应的计算圆面积代码 界面设计 创建桌面应用程序 得到这样一个树形视图 双击界面文件中的dialog.ui 直接双击控件label改名,然后修改最后一个label的属性 修改这个标签的样式,把frameshape改成Panel,frameshadow改…

LC刷题专题:二叉树;迭代;递归(897、1372、208)

文章目录 897.递增顺序搜索树1372. 二叉树中的最长交错路径208. 实现 Trie (前缀树) 897.递增顺序搜索树 https://leetcode.cn/problems/increasing-order-search-tree/description/ 这道题目本身就是一个简单题:非常容易实现:只需要在递归或者迭代中序…

【Java的SPI机制】Java SPI机制:实现灵活的服务扩展

在Java开发中,SPI(Service Provider Interface,服务提供者接口)机制是一种重要的设计模式,它允许在运行时动态地插入或更换组件实现,从而实现框架或库的扩展点。本文将深入浅出地介绍Java SPI机制&#xff…

【Godot4.3】复合路径类myPath

概述 之前编写过一个基于指令绘图的类交myPoint&#xff0c;但是只涉及折线段生成。这次我基于SVG的<path>标签路径指令的启发&#xff0c;实现了一个能够获得连续绘制的直线段、圆弧和贝塞尔复合路径的类型myPath。 可以使用绘图指令方法或字符串形式的绘图指令解析来…

hbuilderx+uniapp+Android宠物用品商城领养服务系统的设计与实现 微信小程序沙箱支付

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 顾客 领养…

OpenCAEPoro优化(1)

核心目的&#xff1a;减少运行时的 object time 方法一&#xff1a;改变运行的进程数 进入OpenCAEPoro目录下运行下述代码&#xff08;进程数为4&#xff09; mpirun -np 4 ./testOpenCAEPoro ./data/case1/case1.data verbose1结果如下 可以看到&#xff0c;object time是…

日常工作记录:服务器被攻击导致chattr: command not found

在深夜的寂静中&#xff0c;公司的服务器突然遭遇了一场突如其来的攻击。特别是nginx配置文件无法修改&#xff0c;仿佛预示着不祥的预兆&#xff0c;面对这突如其来的灾难&#xff0c;技术人员迅速响应。 这时候需要chattr&#xff0c;但是执行的chattr -i xxx的时候&#xf…

神经网络激活函数之前的加权求和 | 矩阵相乘运算法则(清晰版)

1. 神经网络中进行加权求和为什么要将w矩阵进行转置&#xff1f; 下面以一个简单的神经网络作为举例&#xff1a; 我们要将输入特征与W进行加权求和&#xff0c;想要的是下面这种结果&#xff1a; 但是根据矩阵相乘的运算法则&#xff1a; 矩阵A的列数&#xff08;column&am…

SysML案例-风力发电

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

攻防世界---->Newbie_calculations

学习笔记。 前言&#xff1a;试过od动态分析&#xff0c; 然后发现&#xff0c;那些函数不完全是混淆&#xff0c;怎么剥离 - - 不会 现在学会了。 参考&#xff1a; xctf-Newbie_calculations - jane_315 - 博客园 (cnblogs.com)https://www.cnblogs.com/jane315/p/1376964…

111.WEB渗透测试-信息收集-ARL(2)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;110.WEB渗透测试-信息收集-ARL&#xff08;1&#xff09; 2、安装ARL 1、最好先“apt-g…

创建django项目时,不同的编译类型有什么区别

这里主要提及的是 project venv 和 Custom environment 两种类型。 简单来说&#xff0c;project venv 是Python 3.3及以上版本中自带的虚拟环境管理工具&#xff0c;使用venv可以为每个项目创建一个独立的环境&#xff1a;python -m venv myprojectenv &#xff08;项目名后e…

电梯,建模的常见话题

以下是最近一则"女婿开电梯门导致岳父惨死"的新闻&#xff0c;可惜生命的同时&#xff0c;也引发了一系列联想。 不少人不了解或者了解但经常下意识忽略&#xff1a;电梯的门和轿厢是分离的部件。部件之间的协作如果有失误&#xff0c;系统就会出问题。电梯可以看作是…

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM&#xff08;Java Virtual Machine&#xff09; 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器&#xff08;PC寄存…

Python+Matplotlib创建y=sinx、y=cosx、y=sinx+cosx可视化

y sin x (奇函数)&#xff1a; 图像关于原点对称。 对于任何 x&#xff0c;sin(-x) -sin(x)&#xff0c;符合奇函数定义。 y cos x (偶函数)&#xff1a; 图像关于 y 轴对称。 对于任何 x&#xff0c;cos(-x) cos(x)&#xff0c;符合偶函数定义。 y sin x cos x (既…

jQuery——对象的查找(查找孩子-父母-兄弟标签)

在已经匹配出的元素集合中根据选择器查找孩子/父母/兄弟标签&#xff0c;并封装为新的 jQuery 对象返回 children&#xff08;&#xff09; 子标签中找 find&#xff08;&#xff09; 后代标签中找 parent&#xff08;&#xff09; 父标签 prevAll&#xff08;&#xff0…

【内存池】——Nginx 内存池结构设计

目录 实现思路——分而治之 Nginx 的内存池结构图 结构体设计 内存池设计&#xff1a; 数据区属性设计&#xff1a; 大块内存区设计&#xff1a; 伪代码解释&#xff1a; 数据结构实现 实现思路——分而治之 算法结构&#xff1a;链表顺序表 1、对于每个请求或者连接都会建…