前端全栈 === 快速入 门 Redis

目录

简介

通过 docker 的形式来跑:

set、get 都挺简单:

incr 是用于递增的:

keys 来查询有哪些 key:

redis insight  GUI 工具。

list 类型 

left push

rpush  

lpop 和 rpop 自然是从左边和从右边删除数据。​编辑

如果想查看数据呢?

 set

 sorted set(可排序)

zrange 命令取数据

hash 

hget 获取key ​编辑

 geo

expire 过期时间

总结


简介

提到数据库,大家可能会想到 mysql,它是通过表和字段来存储信息的,表和表之间通过 id 关联,叫做关系型数据库。

它提供了 sql 语言,可以通过这种语言来描述对数据的增删改查。

mysql 是通过硬盘来存储信息的,并且还要解析并执行 sql 语句,这些决定了它会成为性能瓶颈。

也就是说服务端执行计算会很快,但是等待数据库查询结果就很慢了。


那怎么办呢?

计算机领域最经常考虑到的性能优化手段就是缓存了,能不能把结果缓存在内存中,下次只查内存就好了呢?

内存和硬盘的速度差距还是很大的:

所以做后端服务的时候,我们不会只用 mysql,一般会结合内存数据库来做缓存,最常用的是 redis。

因为需求就是缓存不同类型的数据,所以 redis 的设计是 key、value 的键值对的形式。

并且值的类型有很多:字符串(string)、列表(list)、集合(set)、有序集合(sorted set)、哈希表(hash)、地理信息(geospatial)、位图(bitmap)等。

我们分别来试一下。

redis 是分为服务端和客户端的,它提供了一个 redis-cli 的命令行客户端。

首先我们把 redis 服务跑起来。

通过 docker 的形式来跑:

下载一个 docker desktop 桌面端工具:

左边分别是镜像和镜像跑起来后的容器。

在搜索框搜索 redis,点击 run,把 redis 官方镜像下载并跑起来。

它会让你填一些容器的信息:

名字没啥好说的。

端口映射就是把主机的 6379 端口映射到容器内的 6379 端口,这样就能直接通过本机端口访问容器内的服务了。

volume 是数据卷,也就是挂载本地目录到容器的一个目录。

为什么要挂载数据卷呢?

因为镜像是不可修改的,每次运行都是全新的,但如果每次跑 redis 镜像,之前的数据都清空了可咋办?

所以要把本机的一个目录挂载上去,数据保存在本机。

跑起来之后是这样的:

容器内打印的日志说明 redis 服务跑起来了。

files 里可以看到所有的容器内的文件:

看到这个 mounted 的标志了没?

就代表这个目录是挂载的本地的一个目录。

我们在本地目录添加一个文件。

在容器内的 data 目录就能访问到这个文件了:

同样,在容器内修改了 data 目录,那本机目录下也会修改。

redis 服务跑起来之后,我们用 redis-cli 操作下。

在 terminal 输入 redis-cli,进入交互模式:

我们在这里做下 string 相关的操作:

文档里的命令有这么几个:

set、get 都挺简单:

incr 是用于递增的:

平时我们用的阅读量、点赞量等都是通过这个来计数的。

keys 来查询有哪些 key:

当我存了几个 key 后,可以通过 keys 来查询有哪些 key:

keys 后加一个模式串来过滤,常用的是 '*' 来查询所有 key。

redis insight  GUI 工具。

这里我们切换成 GUI 工具吧,那个更直观一些。

这个就像 git 有人喜欢用命令行,有人喜欢用 GUI 工具一样。只是习惯问题,都可以。

我用的是 redis insight,一个 mac 上的开源 redis GUI 工具。

输入 ip 和端口之后点击连接:

 就可以可视化看到所有的 key 和值:

同样也可以执行命令: 

(不想装 GUI 工具的同学直接用 redis-cli 也是一样的,没啥区别)

list 类型 

然后我们继续看 list 类型的数据结构:

文档中有这么几个命令:

我们试一下:


left push

lpush 是 left push 的意思,执行后会从左到右添加到列表中:


rpush  

rpush 是 right push 的意思,执行后会从右往左添加到列表中: 

lpop 和 rpop 自然是从左边和从右边删除数据。

如果想查看数据呢?
 

在 GUI 里直接点开看就行,但在命令行里呢?

有同学说,不就是 get 么?

是不行的,get 只适用于 string 类型的数据,list 类型的数据要用 lrange。

输入一段 range,结尾下标为 -1 代表到最后。lrange list1 0 -1 就是查询 list1 的全部数据。

 
set

接下来我们再来看看 set:

set 的特点是无序并且元素不重复。

当我添加重复数据的时候:

只保留去重后的数据: 

可以通过 sismember 判断是否是集合中的元素:

set 只能去重、判断包含,不能对元素排序。

如果排序、去重的需求,比如排行榜,可以用 sorted set,也就是 zset,:

 

 sorted set(可排序)
 

它每个元素是有一个分数的: 会按照分数来排序:

通过 zrange 命令取数据,比如取排名前三的数据:
 

zrange 命令取数据

通过 zrange 命令取数据,比如取排名前三的数据:

hash 

接下来是 hash:

和我们用的 map 一样,比较容易理解:

hget 获取key 

 geo

再就是 geo 的数据结构,就是经纬度信息,根据距离计算周围的人用的:

平时我们查找周围的人、周围的 xxx 都可以通过 redis 的 geospatial 数据结构实现。

redis 的数据结构就先介绍到这里。

是不是感觉还挺简单的。

确实,redis 学习成本挺低的,过一遍就会了。

不过一般 redis 的 key 我们会设置过期时间,通过 expire 命令:

expire 过期时间

比如我设置guang1 的 key 为 3 秒过期:
3s 后就查不到了:

 
想查剩余过期时间使用 ttl:

 
 

一些有时效的数据可以设置个过期时间。


 

总结

因为 mysql 存在硬盘,并且会执行 sql 的解析,会成为系统的性能瓶颈,所以我们要做一些优化。

常见的就是在内存中缓存数据,使用 redis 这种内存数据库。

它是 key、value 的格式存储的,value 有很多种类型,比如 string、list、set、sorted set(zset)、hash、geopitial 等。

灵活运用这些数据结构,可以完成各种需求,比如排行榜用 zset、阅读数点赞数用 string、附近的人用 geopitial 等。

而且这些 key 都可以设置过期时间,可以完成一些时效性相关的业务。

通过 redis 的 npm 包就可以轻松的连接和操作 redis 了,如果在 nest 里,可以封装一个 provider,在里面使用 redis 的 npm 包创建连接。

redis 几乎和 mysql 一样是后端系统的必用中间件了,它除了用来做数据库的缓存外,还可以直接作为数据存储的地方。

学会灵活使用 redis,是后端开发很重要的一步。

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

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

相关文章

不同查询构建器的使用方式(Mybatis、Mybatis-Plus、Mybatis-Flex、Spring Data JPA、QueryDsl)

目录 一、SQL查询需求二、【Mybaits】xml方式三、【Mybatis-Plus】QueryWrapper方式四、【Mybatis-Flex】QueryWrapper方式五、【Mybatis-Flex】QueryWrapper & APT方式六、【Spring Data JPA】Specification方式七、【Spring Data JPA】Specification & MetaModel方式…

计算机网络socket编程(2)_UDP网络编程实现网络字典

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(2)_UDP网络编程实现网络字典 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨…

简单链式表

# 完成双向循环链表的判空、尾插、遍历、尾删 class Node:def __init__(self, value):self.value valueself.next Noneself.prev None class Linklist:def __init__(self,nodeNone):self.head nodeself.size 0def is_empty(self):return self.size 0def add_tail(self,va…

流水线切分策略;通过自适应的重采样和重计算策略来优化计算资源和内存使用

目录 流水线切分策略 1,2,3,4,5指的计算任务(数据切分) 大方块代表GPU计算 黄色代表显存 通过自适应的重采样和重计算策略来优化计算资源和内存使用 一是自适应重计算(Adaptive Recomputation) 二是自适应划分(Adaptive Partitioning) 流水线切分策略 1,2,3,4,5指…

git: 修改gitlab仓库提交地址

git: 修改gitlab仓库提交地址 右键git bash here 1、进入到项目my-project所在位置 2、查看当前项目远程仓库地址 3、修改远程仓库地址 4、再次查看新的远程仓库地址以确认修改成功 cd /my-project git remote -v # 查看当前远程仓库地址 git remote set-url origin 新的Gi…

不只是请求和响应:使用Fiddler抓包URL和Method全指南(中)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 不只是请求和响应:使用Fiddler抓包HTTP协议全指南(上)-CSDN博客https://blog.csdn.net/Chunfeng6yugan/article/details/144005872?spm1001.2014.3001.5502 🙉在(上)篇博客中&#xf…

卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)

批量归一化层(BatchNorm层),或简称为批量归一化(Batch Normalization),是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…

前端速通(CSS)

1.CSS介绍 1.什么是CSS? CSS(Cascading Style Sheets,层叠样式表)是一种用于控制网页的外观和布局的样式表语言。它与HTML(超文本标记语言)紧密配合,负责页面元素的样式定义,如字体、颜色、尺…

webkit浏览器内核编译(2024年11月份版本)

webkit浏览器内核编译 本文详细介绍了如何安装和配置Webkit的编译环境和工具的安装,以及在Windows上编译和运行WebKit浏览器引擎的过程,包括安装依赖、设置环境变量、生成解决方案并最终运行附带的MiniBrowser示例。 一、WebKit简介 WebKit 是一个开源的…

SQL注入--理论--堆叠注入

什么是堆叠注入? 在SQL语句操作的时候,每个语句都是以分号;标志结尾的。 在我们注入的过程中,通过使用多个分号同时进行多个SQL语句的注入,就是堆叠注入。 例如: ?inject1;handler 1919810931114514 open;handler 1…

鸿蒙操作系统(HarmonyOS)

鸿蒙操作系统(HarmonyOS)是华为公司开发的一款面向未来的全场景智慧生活操作系统。它旨在为不同设备的智能化、互联与协同提供统一的语言。鸿蒙提出的基于同一套系统能力、适配多种终端形态的分布式理念,是其核心竞争力之一。这一理念不仅使得…

C++趣味编程玩转物联网:用树莓派Pico实现一位数码管动态显示

七段数码管是一种经典的电子显示器件,广泛应用于数字时钟、电子仪表等设备。本文将通过树莓派Pico开发板,介绍如何用C代码控制一位七段数码管显示数字。作为一个嵌入式开发项目,这不仅是初学者理解数码管工作原理的好机会,也是C开…

本机上装好的ubuntu 全部的开发软件 如何备份以后移到另一台电脑上 还不会出现引导错误?

在Ubuntu系统上备份和迁移所有开发软件,可以按照以下步骤进行: 步骤 1: 备份已安装的软件列表 你可以使用dpkg命令来生成已安装软件的列表,并将其保存到一个文件中: dpkg --get-selections > installed_packages.txtDiffCop…

【Cesium】--viewer,entity,dataSource

viewer,entity,dataSource的关系 viewer.entities.add({}) 通过viwer.entities.add()直接加载的entity,默认是在viewer.entities(即viewer.dataSourceDisplay.defaultDataSource.entities)中,不会加载在viewer.dataSource中。 w…

Paddle Inference部署推理(三)

三:Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理,您可以通过以下两种方式获取静态图模型: (1)飞桨框架导出推理模型 飞桨框架在训练模型过程中,会在本地存储最终训练…

【国产MCU系列】-GD32F470-内部集成电路总线接口(I2C)

内部集成电路总线接口(I2C) 文章目录 内部集成电路总线接口(I2C)1、GD32F4的I2C模块介绍2、I2C控制器寄存器列表3、I2C工作模式3.1 I2C通讯流程3.2 主机模式发送数据流程3.3 主机模式数据接收流程3.4 DMA模式下数据传输4、I2C控制器相关API介绍5、I2C使用示例5.1 I2C主机模…

什么是Spring IOC和Spring AOP?

IOC就是控制反转,控制反转就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。它把由程序代码直接操控的对象的调用权交给容器,通过容器实现对象组件的管理和装配。 Srping IOC负责创建对象,管理对象,装配对…

非交换几何与黎曼ζ函数:数学中的一场革命性对话

非交换几何与黎曼ζ函数:数学中的一场革命性对话 非交换几何(Noncommutative Geometry, NCG)是数学的一个分支领域,它将经典的几何概念扩展到非交换代数的框架中。非交换代数是一种结合代数,其中乘积不是交换性的&…

【CSP CCF记录】201803-1第13次认证 跳一跳

题目 样例输入 1 1 2 2 2 1 1 2 2 0 样例输出 22 思路 没有技术含量的一道题,解题的关键是理解游戏规则。用state标记跳跃状态,以下是对游戏规则的分析: 1. state1,跳到方块上但没跳到中心,得1分 2. state2&#xf…

ALSA(2) ---- DMA实践

DMA实践 本篇文章主要是学习alsa高级音频框架总结而来,ALSA的Platform侧ADMA,学习总结而来,adma驱动来源于telechips产商805x芯片; ADMA物理拓扑图 ADMA物理拓扑图如上,RX和TX ADMA是接收和发送控制器,Ar…