Redis入门指南学习笔记(2):常用数据类型解析

一.前言

本文主要介绍Redis中包含几种主要数据类型:字符串类型、哈希类型、列表类型、集合类型和有序集合类型

二.字符串类型

字符串类型是Redis中最基本的数据类型,它是其他4种数据类型的基础,其他数据类型与字符串类型的差别从某种角度来说只是组织字符串的形式不同。

赋值和取值

SET key value命令用来设置键值对,GET value用来根据键取值,当键不存在时返回nil

> SET JAPAN Tokyo
"OK"
> GET JAPAN
"Tokyo"
> GET RUSSIA
(nil)

Redis对键的命令最好采用对象类型:对象ID:对象属性的形式,例如student:1:scores表示存储ID为1的学生的成绩列表。

递增/减数字

当存储的字符串是整数形式时,使用INCR命令可以使当前键值递增并返回递增后的值。

> SET money 5
"OK"
> INCR money
(integer) 6
> DECR money
(integer) 5

除了使用INCR,还可以使用INCRBY key increment来指定单次递增的数值,使用DECRBY key decrement来指定单次减去的数值。

> DECRBY money 15
(integer) -10
> INCRBY money 20
(integer) 10

通过INCRBYFLOAT key increment可以递增一个双精度浮点数。

> INCRBYFLOAT money 3.14
"13.14"

向末尾追加

通过APPEND key value可以向键值的末尾追加value,若键不存在,则可以将该键的值设置为value,该命令的返回值是追加后字符串的总长度。

> APPEND program Java
(integer) 4
> APPEND program " Python"
(integer) 11

第二次追加添加双引号是因为该参数包含空格,在redis-cli种需要用双引号以示区分。

获取字符串长度

通过STRLEN key可以获取键值的长度,若键不存在会返回0。

> GET program
"Java Python"
> STRLEN program
(integer) 11

同时设置/获取多个键值

通过MSET key val [key1 val1 ...]可以同时设置多个键值,通过MGET key [key1 ...]可以同时获取多个键对应的值。

> MSET python 1 cpp 2 java 3
"OK"
> MGET python cpp java
1) "1"
2) "2"
3) "3"

三.哈希类型

哈希类型的键值与Reids一样都采用了字典结构,其存储了字段(field)和字段值的映射,其中字段值只能是字符串

哈希类型适合存储对象,使用对象类别和ID构成键名,使用字段表示对象的属性,字段值存储属性的值。若要存储ID为1的学生三门功课math、chinese和english的成绩,存储结构可以表示为:

student:1 #键
--math 90 # 字段 字段值
--chinese 87
--english 78

赋值与取值

哈希类型的赋值与取值语法形式为:

HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL key # 获取键所有的字段和字段值

HSET不区分插入和更新操作,这使得在更新数据时不需要事先判断字段是否存在。

具体用法:

> HSET student:1 math 90
(integer) 1
> HGET student:1 math
"90"> HMSET student:1 chinese 87 english 78
"OK"
> HMGET student:1 chinese english
1) "87"
2) "78"> HGETALL student:1
1) "math"
2) "90"
3) "chinese"
4) "87"
5) "english"
6) "78"

判断字段是否存在

通过HEXISTS key field可以判断字段是否存在,存在返回1,否则返回0。

> HEXISTS student:1 math
(integer) 1
> HEXISTS student:1 physics
(integer) 0

字段不存在时赋值

使用HSETNX key field value可以在字段field不存在时赋值,存在则不进行任何操作。

> HSETNX student:1 physics 88
(integer) 1
> HGET student:1 physics
"88"

删除字段

使用HDEL key field [field1 ...]可以删除一个或多个字段,并返回删除字段的个数。

> HDEL student:1 physics english
(integer) 2

获取字段名/字段值/长度

通过HKEYS key可以获取键中所有的字段名,通过HVALS key可以获取键中所有的字段值,通过HLEN key可以获取键所包含的字段数量。

> HKEYS student:1
1) "math"
2) "chinese"> HVALs student:1
1) "90"
2) "87"> HLEN student:1
(integer) 2

四.列表类型

列表类型可以存储一个有序的字符串列表,列表基于双向链表实现,可以向列表两端快速添加元素,但其索引速度比较慢,要获取列表中间某个位置的元素则必须要从头开始遍历到该位置。

向列表两端增加元素

通过LPUSH key value [value1 ...]RPUSH key value [value1 ...]可以分别往列表左边和右边添加元素,命令的返回值是列表的长度。

> LPUSH arr 3 2 1
(integer) 3
> RPUSH arr 4 5 6
(integer) 6
# arr
# 1 2 3 4 5 6

从列表两端弹出元素

通过LPOPRPOP可以分别从列表左端和右端弹出一个元素,返回值是弹出的元素。

> LPOP arr
"1"
> RPOP arr
"6"

获取列表中元素的个数

通过LLEN key可以获取列表中元素的个数,当键不存在时LLEN会返回0。

> LLEN arr
(integer) 4

获取列表片段

通过LRANGE key start stop可以获取列表索引从startstop之间的所有元素,索引从0开始。

> LRANGE arr 0 3
1) "2"
2) "3"
3) "4"
4) "5"

同Python一样,LRNAGE支持负索引,其中-1表示从右边开始第一个元素,-2表示从右边开始第二个元素,以此类推。

> LRANGE arr -3 -1
1) "3"
2) "4"
3) "5"

start大于stop会返回空列表,若stop超出列表索引大小,会返回到列表最右边的元素。

删除列表中指定的值

利用LREM可以删除列表中前count个值为value的元素,返回值为实际删除的元素个数:

  • count > 0时,LREM会删除从列表左边开始前count个值为value的元素。
  • count < 0时,LREM会删除从列表右边开始前count个值为value的元素。
  • count = 0时,LREM会删除列表中所有值为value的元素。
> LPUSH arr1 6 3 4 3 2 3 3
(integer) 7> LRANGE arr1 0 -1
1) "3"
2) "3"
3) "2"
4) "3"
5) "4"
6) "3"
7) "6"> LREM arr1 1 3
(integer) 1
# 3 2 3 4 3 6> LREM arr1 -1 3
(integer) 1
# 3 2 3 4 6> LREM arr1 0 3
(integer) 2
# 2 4 6

获取/设置指定索引的元素值

通过LINDEX key index可以获取指定索引的元素,通过LSET key index value可以修改指定索引位置的元素的值。

# arr: 2 3 4 5
> LINDEX arr 2
"4"> LSET arr 2 5
"OK"
> LINDEX arr 2
"5"

五.集合类型

Redis中的集合是基于哈希表实现的,集合中的元素都各不相同,往集合中增加删除、增加和查询都是常数时间复杂度。此外,集合还支持并、交和差运算。

增加/删除元素

通过SADD key member [member1 ...]可以往集合中添加一个或多个元素,通过SREM key member [member1 ...]可以删除一个或多个元素。

> SADD fruits app
(integer) 1
> SADD fruits banana peach
(integer) 2 # 返回值为成功添加的元素个数> SREM fruits app
(integer) 1 # 返回值为删除成功的元素个数

获取集合中的所有元素

通过SMEMBERS key可以获取集合中的所有元素。

> SMEMBERS fruits
1) "banana"
2) "peach"

判断元素是否在集合中

通过SISMEMBER key member可以判断元素member是否在集合中。

> SISMEMBER fruits app
(integer) 0
> SISMEMBER fruits banana
(integer) 1

集合间的元素

集合支持交、并和差运算。

# 交
SINTER key [key ...]
# 并
SUNION key [key ...]
# 差
SDIFF key [key ...]

给定集合A和B,交、并和差三种运算从左到右的示意图如下所示:

集合运算示意图

使用示例如下:

> SADD sa 1 3 4 5 7
(integer) 5
> SADD sb 2 4 6 8
(integer) 4> SINTER sa sb
1) "4"> SUNION sa sb
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"> SDIFF sa sb
1) "1"
2) "3"
3) "5"
4) "7"

六.结语

参考资料:

  • 《Redis入门指南》 李子骅编著

以上便是文本的全部内容,若有任何错误敬请批评指正,要是觉得不错可以点赞或关注一下,后续会持续更新。

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

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

相关文章

【Linux学习笔记】进程概念(上)

1. 冯诺依曼体系结构2. 操作系统的作用3. 进程 1. 冯诺依曼体系结构 如图&#xff0c;这是一个冯诺依曼体系结构简图 其中这里的存储器指的是内存&#xff01; 用通俗的话来解释这个图&#xff0c;就是数据从输入设备进入&#xff0c;然后进入到存储器&#xff0c;CPU从存储器…

阿里云OS系统Alibaba Cloud Linux 3系统的安全更新命令

给客户部署的服务&#xff0c;进入运维阶段&#xff0c;但是经常被客户监测到服务器漏洞&#xff0c;现在整理一下&#xff0c;服务器漏洞问题更新命令步骤。 服务器系统&#xff1a; 阿里云linux服务器&#xff1a;Alibaba Cloud Linux 3 漏洞类型和描述&#xff1a; #3214…

新体验:万圣节夜晚的新游戏!--愤怒的南瓜

引言&#xff1a; Chatgpt4.0 所带来的冲击似乎远超出人们想象&#xff0c;网页小游戏《愤怒的南瓜》在昨日&#xff08;万圣节夜晚&#xff09;火爆了外网。一位名为 Javi Lopez 的外国小哥使用 Midjourney、DALL•E 3 和 GPT-4 打开了一个无限可能的世界&#xff0c;重新演绎…

【Python全栈_公开课学习记录】

一、初识python (一).Python起源 Python创始人为吉多范罗苏姆&#xff08;荷兰&#xff09;&#xff0c;Python崇尚优美、清晰、简明的编辑风格。Python语言结构清晰简单、数据库丰富、运行成熟稳定&#xff0c;科学计算统计分析领先。目前广泛应用于云计算、Web开发、科学运算…

DSP 开发例程(5): tcp_server

目录 DSP 开发例程(5): tcp_server创建工程源码编辑tcp_echo.chelloWorld.c 调试说明 DSP 开发例程(5): tcp_server 此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程…

【机器学习合集】模型设计之注意力机制动态网络 ->(个人学习记录笔记)

文章目录 注意力机制1. 注意力机制及其应用1.1 注意力机制的定义1.2 注意力机制的典型应用 2. 注意力模型设计2.1 空间注意力机制2.2 空间注意力模型2.3 通道注意力机制2.4 空间与通道注意力机制2.5 自注意力机制2.5 级联attention 动态网络1. 动态网络的定义2. 基于丢弃策略的…

PostgreSQL逻辑管理结构

1.数据库逻辑结构介绍 2.数据库基本操作 2.1 创建数据库 CREATE DATABASE name [ [ WITH ] [ OWNER [] user_name ] [ TEMPLATE [] template ] [ ENCODING [] encoding ] [ LC_COLLATE [] lc_collate ] [ LC_CTYPE [] lc_ctype ] [ TABLESPACE [] tablespace ] [ CONNECTION L…

Day17力扣打卡

打卡记录 参加会议的最多员工数&#xff08;拓扑排序 分类讨论&#xff09; 链接 计算内向基环树的最大基环&#xff0c;基环树基环为2的情况分类讨论。 class Solution { public:int maximumInvitations(vector<int> &favorite) {int n favorite.size();vector…

4.多层感知机-3GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 多层感知机一、感知机1、感知机2、训练感知机3、图形解释4、收敛定理5、XOR问题6、总结 二、多层感知机1、XOR2、单隐藏层3、单隐藏层-单分类4、为什么需要非线性激活函数5、Sigmoid函数6、Tanh函数7、ReLU函数8、多类分…

SDK是什么

SDK 是“Software Development Kit”&#xff08;软件开发工具包&#xff09;的缩写&#xff0c;它是一组用于开发特定软件应用、硬件平台、计算机系统或操作系统的开发工具的集合。SDK 通常包括一组开发工具、库、文档和示例代码&#xff0c;以帮助开发者更快地开发和部署应用…

SAML- 安全断言标记语言

一、概念 安全断言标记语言&#xff08;SAML&#xff09;是一种开放标准&#xff0c;用于在各方之间&#xff08;特别是身份提供商和服务提供商之间&#xff09;交换身份验证和授权数据。SAML 是一种基于XML的安全断言标记语言&#xff08;服务提供商用来做出访问控制决策的语句…

HTML标签、CSS介绍

标签的分类: 块级/行内 # 块级标签: 独占一行 h1~h6 p div """ 块儿级标签可以修改长宽. 行内标签不可以, 就算修改了也不会变化.块级标签内部可以嵌套任意的块级标签和行内标签. 特例: 是p标签虽然是块级标签 但是它只能嵌套行内标签 不能嵌套块级标签. 如…

linux安装apache并配置userid站点

目录 一、linux安装apache的方式 1、安装wget 2、下载CentOS 7的repo文件 3、更新镜像源 二、安装apache 1.通过命令直接安装apache(linux的软件包为httpd) 2.启动httpd服务 3.访问一下 三、apache配置文件 1.主配置文件 2.修改根目录 3.修改下端口 4.apache的工作…

BUUCTF 数据包中的线索 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 公安机关近期截获到某网络犯罪团伙在线交流的数据包&#xff0c;但无法分析出具体的交流内容&#xff0c;聪明的你能帮公安机关找到线索吗&#xff1f; 密文&#xff1a; 下载附件&#xff0c;解压得到一个.pcapng文…

【兔子王赠书第5期】ChatGPT速学通:文案写作+PPT制作+数据分析+知识学习与变现

文章目录 前言ChatGPT推荐图书作者简介内容简介推荐理由 粉丝福利尾声 前言 程序员如果有一天代码写不动了&#xff0c;还能干什么&#xff1f; 一位 80 后女程序员“兰猫”给出了她的答案——转型 AI 写手。兰猫从事程序员工作十余年&#xff0c;在繁重的工作压力下&#xf…

大数据毕业设计选题推荐-系统运行情况监控系统-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

leetCode 2915. 和为目标值的最长子序列的长度 + 动态规划 +01背包 + 空间优化 + 记忆化搜索 + 递推

2915. 和为目标值的最长子序列的长度 - 力扣&#xff08;LeetCode&#xff09; 给你一个下标从 0 开始的整数数组 nums 和一个整数 target 。返回和为 target 的 nums 子序列中&#xff0c;子序列 长度的最大值 。如果不存在和为 target 的子序列&#xff0c;返回 -1 。子序列 …

ubuntu下vscode终端输出出现空白的问题

当终端 输出铺满后 再继续回车 会出现局部空白 这是vscode 的bug&#xff1f;有大佬知道解决办法的可以评论区留言。

Flutter 04 按钮Button和事件处理、弹框Dialog、Toast

一、按钮组件 1、按钮类型&#xff1a; 2、按钮实现效果&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget build(BuildContext co…

Stream 流对象的创建与各方法

Stream 流对象的创建与各方法 目录 1.0 Stream 流的说明 2.0 Stream 流对象的创建 2.1 对于 Collection 系列集合创建 Stream 流对象的方式 2.2 对于 Map 系列集合创建 Stream 流对象的方式 2.3 对于数组创建 Stream 流对象的方式 3.0 Stream 流的中间方法 3.1 Stream 流的 …