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

Redis Redis的数据结构 - 通用命令 - String类型命令 - Hash类型命令

目录

Redis的数据结构:

Redis命令:

通用命令:(通用指令是部分数据类型的,都可以使用的指令)

KEYS查询命令:

DEL删除命令:

EXISTS判断命令:

EXPIPE有效期设置命令:

TTL查看剩余期限命令:

String类型:

String的3种类型:

String类型的常见命令:

SET插入数据命令:

MSET多重插入命令:

GET获取数据命令:

MGET多重获取命令:

INCR自增命令:

INCRBY指定自增命令:

INCRBYFLOAT指定浮点数自增命令:

SETNX添加String类型键值对命令(前提是key不存在,否则不执行)

SETEX添加Sting类型键值对命令(指定有效期)

Redis的key的格式:

问题:Redis没有类似Mysql的Table的概念,我们该如何区分不同类型的key呢?

key的结构:

Hash类型

为什么需要使用Hash类型呢? 

Hash类型的常见命令:

HSET key field value:添加或者修改hash类型的key和fired的值

HGET key field:获取一个hash类型的key的field的值

HMSET:添加多个hash类型的key的field值

HMGET:获取多个hash类型的key的field值

HGETALL:获取一个hash类型的key中所有的field和value

HKEYS:获取一个hash类型的key中的所有的field

HVALS:获取一个hash类型的key中的所有的value

HINCRBY:让一个hash类型key的字段值自增并指定步长

HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行


参考视频:黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目

Redis的数据结构:

我们能通过官方网站提供的文档来了解我们需要使用的redis数据类型

或者是使用命令help来查看

Redis命令:

通用命令:(通用指令是部分数据类型的,都可以使用的指令)

192.168.1.209:6379> help @generic

KEYS查询命令:

我们能通过help [command]可以查看一个命令的具体用法

192.168.1.209:6379> help KEYSKEYS patternsummary: Find all keys matching the given patternsince: 1.0.0group: generic192.168.1.209:6379> 

使用KEYS命令查看所有的key 

192.168.1.209:6379> SET name "claylpf"
OK
192.168.1.209:6379> SET id 66
OK
192.168.1.209:6379> KEYS *
1) "id"
2) "name"
192.168.1.209:6379> 

例如:

DEL删除命令:

具体用法 

192.168.1.209:6379> help DELDEL key [key ...]summary: Delete a keysince: 1.0.0group: generic192.168.1.209:6379> 

 例如:

192.168.1.209:6379> DEL id
(integer) 1
192.168.1.209:6379> KEYS *
1) "name"
192.168.1.209:6379> 

多重删除

192.168.1.209:6379> DEL k1 k2 k3
(integer) 3
192.168.1.209:6379> KEYS *
1) "age"
2) "name"
192.168.1.209:6379> 

EXISTS判断命令:

具体用法:

192.168.1.209:6379> help EXISTSEXISTS key [key ...]summary: Determine if a key existssince: 1.0.0group: generic192.168.1.209:6379> 

 如:

192.168.1.209:6379> KEYS *
1) "age"
2) "name"
192.168.1.209:6379> EXISTS age
(integer) 1
192.168.1.209:6379> EXISTS id
(integer) 0
192.168.1.209:6379> 

EXPIPE有效期设置命令:

具体用法:

192.168.1.209:6379> help EXPIREEXPIRE key secondssummary: Set a key's time to live in secondssince: 1.0.0group: generic192.168.1.209:6379> 

例如:

192.168.1.209:6379> EXPIRE age 20
(integer) 1
192.168.1.209:6379> TTL age
(integer) 13
192.168.1.209:6379> 

TTL查看剩余期限命令:

具体用法:

192.168.1.209:6379> help TTLTTL keysummary: Get the time to live for a keysince: 1.0.0group: generic192.168.1.209:6379> 

例如:

当我们使用TTL查看到剩余时间为-1的时候,他表示的就是永久有效

192.168.1.209:6379> TTL age
(integer) 13
192.168.1.209:6379> TTL name
(integer) -1
192.168.1.209:6379> KEYS *   # 因为age的有效时间到了,所以age消失了,而只剩下name的永久有效
1) "name"
192.168.1.209:6379> 

String类型:

String的3种类型:

其中value是字符串,不过根据字符串的格式不同,可以分为3类:

注:不管是那种格式,底层都是字节数组形式存储的,只不过是编码的方式不同。字符串类型的最大空间不能超过512mb

String类型的常见命令:

SET插入数据命令:

我们能通过help [command]可以查看一个命令的具体用法

具体用法

192.168.1.209:6379> help SETSET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]summary: Set the string value of a keysince: 1.0.0group: string192.168.1.209:6379> 

插入数据

192.168.1.209:6379> SET age 20
OK
192.168.1.209:6379> KEYS a*
1) "age"
192.168.1.209:6379> 

MSET多重插入命令:

多重插入

192.168.1.209:6379> MSET k1 v1 k2 v2 k3 v3
OK
192.168.1.209:6379> KEYS *
1) "age"
2) "k1"
3) "k3"
4) "name"
5) "k2"
192.168.1.209:6379> 

GET获取数据命令:

具体用法:

192.168.1.209:6379> help GETGET keysummary: Get the value of a keysince: 1.0.0group: string192.168.1.209:6379> 

 例如:

192.168.1.209:6379> GET name
"claylpf"
192.168.1.209:6379> 

MGET多重获取命令:

192.168.1.209:6379> MSET k1 v1 k2 v2 k3 v3
OK
192.168.1.209:6379> KEYS *
1) "k1"
2) "k3"
3) "name"
4) "k2"
192.168.1.209:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
192.168.1.209:6379> 

INCR自增命令:

192.168.1.209:6379> GET age
"18"
192.168.1.209:6379> INCR age
(integer) 19
192.168.1.209:6379> INCR age
(integer) 20
192.168.1.209:6379> 

INCRBY指定自增命令:

192.168.1.209:6379> GET age
"20"
192.168.1.209:6379> INCRBY age 2
(integer) 22
192.168.1.209:6379> INCRBY age 2
(integer) 24
192.168.1.209:6379> INCRBY age 3
(integer) 27
192.168.1.209:6379> 

也可以实现自减操作

192.168.1.209:6379> INCRBY age 3
(integer) 27
192.168.1.209:6379> INCRBY age -1
(integer) 26
192.168.1.209:6379> INCRBY age -1
(integer) 25
192.168.1.209:6379> INCRBY age -2
(integer) 23
192.168.1.209:6379> 

INCRBYFLOAT指定浮点数自增命令:

192.168.1.209:6379> set float1 10.11
OK
192.168.1.209:6379> GET float1
"10.11"
192.168.1.209:6379> INCRBYFLOAT float1 0.5
"10.61"
192.168.1.209:6379> INCRBYFLOAT float1 0.5
"11.11"
192.168.1.209:6379> INCRBYFLOAT float1 -1.5
"9.61"
192.168.1.209:6379> INCRBYFLOAT float1 -1.5
"8.11"
192.168.1.209:6379> 

SETNX添加String类型键值对命令(前提是key不存在,否则不执行)

具体用法:

192.168.1.209:6379> help SETNXSETNX key valuesummary: Set the value of a key, only if the key does not existsince: 1.0.0group: string192.168.1.209:6379> 

例如:

192.168.1.209:6379> SETNX name2 lisi
(integer) 1
192.168.1.209:6379> get name2 
"lisi"
192.168.1.209:6379> SETNX name lisi2
(integer) 0
192.168.1.209:6379> get name 
"claylpf"
192.168.1.209:6379> 

SETEX添加Sting类型键值对命令(指定有效期)

具体用法:

192.168.1.209:6379> help SETEXSETEX key seconds valuesummary: Set the value and expiration of a keysince: 2.0.0group: string192.168.1.209:6379> 

例如:

192.168.1.209:6379> SETEX name3 30 jack
OK
192.168.1.209:6379> TTL name3
(integer) 24
192.168.1.209:6379> TTL name3
(integer) 21
192.168.1.209:6379> TTL name3
(integer) 19
192.168.1.209:6379> GET name3
"jack"
192.168.1.209:6379> 

Redis的key的格式:

问题:Redis没有类似Mysql的Table的概念,我们该如何区分不同类型的key呢?

例如:当我们需要存储用户、商品的信息到redis,如果有一个用户的id是1,而有一个商品的id恰好是也是1,我们应该如何解决这个问题呢。

我们可以通过拼接key的结构实现多层级结构

key的结构:

这个格式并非固定的,我们也可以根据自己的需求来删除或者添加词条。

实操:

Hash类型

为什么需要使用Hash类型呢? 

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便

因此,我们需要使用到Hash类型。

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD(增删改查)

  

Hash类型的常见命令:

HSET key field value:添加或者修改hash类型的key和fired的值

192.168.1.209:6379> HSET heima:user:3 name lucy
(integer) 1
192.168.1.209:6379> HSET heima:user:3 age 22
(integer) 1
192.168.1.209:6379> HSET heima:user:4 name band
(integer) 1
192.168.1.209:6379> HSET heima:user:4 age 23
(integer) 1
192.168.1.209:6379> KEYS heima*
1) "heima:user:4"
2) "heima:user:3"

HGET key field:获取一个hash类型的key的field的值

192.168.1.209:6379> HGET heima:user:3 name
"lucy"
192.168.1.209:6379> HGET heima:user:3 age
"22"
192.168.1.209:6379> HGET heima:user:4 name
"band"
192.168.1.209:6379> HGET heima:user:4 age
"23"
192.168.1.209:6379> 

HMSET:添加多个hash类型的key的field值

192.168.1.209:6379> HMSET heima:user:5 name clay age 24 sex man
OK
192.168.1.209:6379> HMGET heima:user:5 name age sex
1) "clay"
2) "24"
3) "man"
192.168.1.209:6379> 

HMGET:获取多个hash类型的key的field值

192.168.1.209:6379> HMSET heima:user:5 name clay age 24 sex man
OK
192.168.1.209:6379> HMGET heima:user:5 name age sex
1) "clay"
2) "24"
3) "man"
192.168.1.209:6379> 

HGETALL:获取一个hash类型的key中所有的field和value

192.168.1.209:6379> HGETALL heima:user:4
1) "name"
2) "band"
3) "age"
4) "23"
192.168.1.209:6379> HGETALL heima:user:5
1) "name"
2) "clay"
3) "age"
4) "24"
5) "sex"
6) "man"
192.168.1.209:6379> 

HKEYS:获取一个hash类型的key中的所有的field

192.168.1.209:6379> HKEYS heima:user:5
1) "name"
2) "age"
3) "sex"
192.168.1.209:6379> HKEYS heima:user:4
1) "name"
2) "age"
192.168.1.209:6379> 

HVALS:获取一个hash类型的key中的所有的value

192.168.1.209:6379> HVALS heima:user:4
1) "band"
2) "23"
192.168.1.209:6379> HVALS heima:user:5
1) "clay"
2) "24"
3) "man"
192.168.1.209:6379> 

HINCRBY:让一个hash类型key的字段值自增并指定步长

192.168.1.209:6379> HINCRBY heima:user:4 age 2
(integer) 25
192.168.1.209:6379> HINCRBY heima:user:4 age 2
(integer) 27
192.168.1.209:6379> HVALS heima:user:4
1) "band"
2) "27"
192.168.1.209:6379> HINCRBY heima:user:4 age -10
(integer) 17
192.168.1.209:6379> HVALS heima:user:4
1) "band"
2) "17"
192.168.1.209:6379> 

HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

192.168.1.209:6379> HSETNX heima:user:4 sex woman
(integer) 1
192.168.1.209:6379> HGETALL heima:user:4
1) "name"
2) "band"
3) "age"
4) "17"
5) "sex"
6) "woman"
192.168.1.209:6379> HSETNX heima:user:5 sex woman
(integer) 0
192.168.1.209:6379> HGETALL heima:user:5
1) "name"
2) "clay"
3) "age"
4) "24"
5) "sex"
6) "man"
192.168.1.209:6379> 

相关文章:

Redis Redis的数据结构 - 通用命令 - String类型命令 - Hash类型命令

目录 Redis的数据结构: Redis命令: 通用命令:(通用指令是部分数据类型的,都可以使用的指令) KEYS查询命令: DEL删除命令: EXISTS判断命令: EXPIPE有效期设置命令&…...

vue中的几种name属性

vue中的几种name属性 组件名name name选项 export default{name:xxx } // 获取组件的name属性 this.$options.namevue-devtools调试工具里显示的组件名称; 未配置name选项,就是组件的文件名; vue3配置name通过defineOptions()函数 de…...

论文《面向大规模日志数据分析的自动化日志解析》翻译

论文《Towards Automated Log Parsing for Large-Scale Log Data Analysis》翻译 面向大规模日志数据分析的自动化日志解析翻译...

element-ui dialog弹窗 设置点击空白处不关闭

根据官网提供方法 场景:vue实现的网站有两个弹窗同时出现时,关闭报警,批量进度条弹窗也关闭了, 1、每一个页面都有可能出现的报警弹窗, 2、页面a批量操控硬件添加操作的进度条弹窗 开始以为是因为点击报警弹窗&#…...

第16节-PhotoShop基础课程-修复工具组-去水印

文章目录 前言1.污点修复画笔1.功能原理2.调整1.调整大小 Alt 右键 左右2.调整软硬 Alt 右键 上下 2.修复画笔工具 Alt 选取源1.常规2.选择图案 3.修补工具1.类型1.源2.目标 2.扩展 4.内容感知移动工具5.红眼工具 前言 去水印等 1.污点修复画笔 比如把下面的土豆&#xff08…...

conda的使用教程

conda的介绍 简单来说,conda软件就是来管理包的软件。以Python为例,在实际生活中,我们要处理多个不同的项目,因此,要安装不同的项目所需要的包,为了管理方便,conda就是用来打理不同项目的包&…...

客户端发现pod并与之通信

客户端发现pod并与之通信 pod需要一种寻找其他pod的方法来使用其他pod提供的服务,不像在没有Kubernetes的世界,系统管理员要在用户端配置文件中明确指出服务的精确IP地址 或者主机名来配置每个客户端应用,但同样的方法在Kubernetes中不适用 …...

Powershell模拟实现Linux下的tree命令

Powershell模拟实现Linux下的tree命令 代码 环境: P o w e r s h e l l 7 Powershell\ 7 Powershell 7 function Get-Tree {param([string]$directory ".",[int]$d 1,[switch]$f)$absolutePath Resolve-Path -Relative $directoryWrite-Host $absol…...

嵌入式基础-电路

目录 1、电流 1.1电流方向 1.2交流电和直流电 2、电压 3、电阻 4、欧姆定律 1、电流 电流是指单位时间内通过导体的电荷量,用符号I表示,单位是安培(A)。电流是电磁学中的基本量纲之一,是七个基本量纲之一。电流的…...

【JS面试题】如何通过闭包漏洞在外部修改函数中的变量

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 前端面试题 文章目录 什么是闭包例 如何在函数外部修改闭包中变量 什么是闭包 闭包这个东西对新…...

【华为OD机试】按身高和体重排队【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列, 对身高相同的人,按体重由轻到重排列; 对于身高体重都相同的人,维持原有的编号顺序关系。请输…...

TCP原理(全网最详细)

一、确认应答(可靠性机制) TCP诞生的初衷就是可靠传输 可靠传输是TCP最核心的部分,TCP内部很多机制都是在保证可靠传输(可以理解为发一条消息,上面显示已读未读,可靠传输就是发一条消息我知道对方是否收到…...

react 初级基础

react基本使用 项目创建 项目的创建命令 npx create-react-app react-basic创建一个基本元素进行渲染 // 1 导入react 和 react-dom import React from "react"; import ReactDOM from "react-dom";// 2 创建 react 元素 React提供了创建元素的api Rea…...

linux学习书籍推荐

《Linux程序设计(第4版)》,Neil Matthew和Richard Stones编写。这本书是Linux/UNIX专家编写的,详细介绍了Linux系统以及其他UNIX风格的操作系统上的程序开发,包括标准Linux C语言函数库和各种由Linux或UNIX标准指定的工…...

LeetCode 428. Serialize and Deserialize N-ary Tree【树,BFS,DFS】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

javascript | 变量、函数、属性的命名规则

javascript标识符的命名规则 变量、函数、属性的名字、或者函数的参数,都可称为标识符。标识符可以是按照下列格式规则组合起来的一个或者多个字符。 第一个字符必须是一个字母、下划线_、或美元符号$。数字不可以作为标识符的首字符。其他字符可以是数字、字母、…...

手写Ribbon基本原理

本文已收录于专栏 《中间件合集》 目录 概念说明什么是RibbonRibbon和Nginx负载均衡的区别 工作流程代码实现RibbonSDK发送请求端引入RibbonSDK和Nacos的依赖配置文件中填写负载均衡策略调用代码 接收请求端执行效果发送请求端接收请求端 总结提升 概念说明 什么是Ribbon Ribb…...

k8s集群中ETCD备份和恢复

文章目录 [toc]一、etcd 概述二、安装etcdctl工具三、kubeadm部署方式部署1)备份2)恢复四、定时备份 五、二进制部署备份1)备份2)恢复1、停止apiserver和etcd2、etcd_1恢复3、etcd_2恢复4、etcd_3恢复5、启动etcd和apiserver6、检…...

node版本问题

服务器下载下来的vue项目启动出现下列问题 npm ERR! path E:\vueEnv\app\node_modules\node-sass npm ERR! command failed npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node scripts/build.js npm ERR! Building: C:\Program Files\nodejs\node.exe E:\vueEnv\ap…...

四)Stable Diffussion使用教程:图生图

这一篇来说说图生图。 除了文生图之外,SD常用的还有图生图模式。 图生图,顾名思义就是使用一张图去让AI生成自己喜欢的另一张图。 有时候我们有一张喜欢的图,但是希望换一种颜色方案,这时就可以通过图生图的方式去实现了&#…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...