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

news2025/2/22 11:17:37

目录

简介

通过 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.coloradmin.cn/o/2247313.html

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

相关文章

Python MySQL SQLServer操作

Python MySQL SQLServer操作 Python 可以通过 pymysql 连接 MySQL,通过 pymssql 连接 SQL Server。以下是基础操作和代码实战示例: 一、操作 MySQL:使用 pymysql python 操作数据库流程 1. 安装库 pip install pymysql2. 连接 MySQL 示例 …

编程语言之C++诞生记!

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C诞生的相关内容! 关于【C诞…

核心差异:知识VS文档管理(+工具软件安利)

在讨论知识管理和文档管理时,我们经常会听到这两种说法被混淆使用。然而,它们各自服务于不同的目的,这一点至关重要。 想象一下,你是一名项目经理,面临以下两项任务: 存储最新的项目计划捕捉团队讨论中获…

医院挂号就诊系统(源码+数据库+报告)

基于SpringBoot的医院挂号就诊系统,系统包含三种角色:管理员、医生、用户,系统分为前台和后台两大模块,主要功能如下。 前台: - 首页:展示医院相关信息、推荐医生等内容。 - 健康教育:提供健康知识、文章等…

【热门主题】000065 探索人工智能学习框架:开启智能未来的钥匙

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

《智慧教育实时数据分析推荐项目》详细分析

一、项目介绍 1、背景介绍 在互联网、移动互联网的带动下,教育逐渐从线下走向线上,在线教育近几年一直处于行业的风口浪尖,那随着基础设施的不断完善,用户需求也发生不少变化,因此传统教育机构、新兴互联网企业都在探…

使用LUKS对Linux磁盘进行加密

前言 本实验用于日常学习用,如需对存有重要数据的磁盘进行操作,请做好数据备份工作。 此实验只是使用LUKS工具的冰山一角,后续还会有更多功能等待探索。 LUKS(Linux Unified Key Setup)是Linux系统中用于磁盘加密的一…

在 cmd 输入 python.exe 后不报错也无反应的问题

在 cmd 输入 python.exe 后不报错:‘python.exe ’不是内部或外部命令,也不是可运行的程序或批处理文件,也无反应。只是显示这样一个弹窗: 查了下环境变量path,看看有什么地方有python.exe,发现原来在C:\Us…

10、PyTorch autograd使用教程

文章目录 1. 相关思考 1. 相关思考

如何在 Ubuntu 22 04 上安装和配置 Ansible 自动化平台

如何在 Ubuntu 22.04 上安装和配置 Ansible 自动化平台 简介 Ansible 是一个开源项目,并在 Github 上收获了 63k 的 star 。它是一个极其简单的 IT 自动化平台,使您的应用程序和系统更易于部署和维护。使用 SSH,以接近简单英语的语言实现从…

PowerMILL 客制化宏 - 用户菜单定义

用户右键菜单 在PowerMILL元素浏览器空白的地方右键弹出的菜单叫用户右键菜单。用户右键菜单可以调用宏或命令或用户二次开发的应用或批处理等等。 用户右键菜单定义 用户右键菜单需要建立一个没有扩展名的 “user_menu” 名称的文件,一般存放在 “C:\dcam\pmill2…

006 单片机嵌入式中的C语言与代码风格规范——常识

00 环境准备: 配置MDK支持C99 内置stdint.h介绍 stdint.h 是从 C99 中引进的一个标准 C 库的文件 路径:D:\MDK\ARM\ARMCC\include 01 C语言基础语法 一般的bug很有可能是C语言功底不扎实导致…… 1.结构体 由若干基本数据类型集合组成的一种自定义数…

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程,如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学(NTU)2024 年春季 “生成式人工智能(GenAI)” 课程的作业 5(GenAI HW…

ZYNQ-7020嵌入式系统学习笔记(1)——使用ARM核配置UART发送Helloworld

本工程实现调用ZYNQ-7000的内部ARM处理器,通过UART给电脑发送字符串。 硬件:正点原子领航者-7020 开发平台:Vivado 2018、 SDK 1 Vivado部分操作 1.1 新建工程 设置工程名,选择芯片型号。 1.2 添加和配置PS IP 点击IP INTEGR…

JSONCPP 数据解析与序列化

常用类接口 Json::Value 类 用于存储 JSON 数据的核心类。它支持将数据解析为对象、数组或基本类型(如字符串、数值等) 赋值操作符:Value& operator(Value other); 用于将一个 JSON 值赋给另一个 JSON 值 Json::Value value; value &…

排序(Java数据结构)

1. 排序的概念及引用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。(所有的排序都是默认从小到大排序) 稳定性:假定在待排序的记录序列中&#xff…

JavaParser 的全面介绍

JavaParser 是什么? JavaParser 的快速介绍可以参考: # JavaParser的快速介绍 JavaParser是一个用于解析Java源码的开源工具,它提供了一种简单而有效的方式来解析和操作Java代码。JavaParser解析源码的方式主要基于其将Java代码转换为抽象语…

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动,先不着急直接上手撸应用层的代码,先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码(vlc好像不支持h265,这个后边我试试)的视频流,先需要支持上rtsp server,了解rtsp协议是必…

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

strlwr(arr);的模拟实现(c基础)

hi , I am 36 适合对象c语言初学者 strlwr(arr)&#xff1b;函数是把arr数组变为小写字母,并返回arr 链接介绍一下strlwr(arr)&#xff1b;(c基础)-CSDN博客 下面进行My__strlwr(arr);模拟实现 #include<stdio.h> //返回值为arr(地址),于是用指针变量,原数组为字符型…