Redis学习笔记【基础篇】

SQL vs NOSQL

在这里插入图片描述

SQL(Structured Query Language)和NoSQL(Not Only SQL)是两种不同的数据库处理方式,它们在多个维度上有所差异,主要区别包括:
  • 数据结构:

    • SQL(关系型数据库): 使用表格形式存储数据,有固定的列和行,每一行代表一条记录,每一列代表一个特定类型的数据字段。数据之间通过外键等方式建立关系,强调数据的一致性和规范化
    • NoSQL(非关系型数据库): 支持多种数据结构,如键值对(Key-Value)、文档(Document)、列族(Column-Family)、图形(Graph)等。这种灵活性使得NoSQL能够适应不同种类和结构复杂的数据。
  • 可扩展性:

    • SQL数据库通常是垂直扩展的,意味着通过增强单个服务器(如增加CPU、内存、存储)来处理更多负载。
    • NoSQL数据库设计为水平扩展,通过在多台服务器上分散数据(数据分片)来处理大量数据和流量,易于扩展到大规模分布式系统。
  • 数据模式:

    • SQL数据库在使用前需要预先定义好表结构(Schema)对数据的类型有严格要求,更改结构可能较为复杂。
    • NoSQL数据库支持动态模式可以在运行时灵活添加字段,无需预先定义表结构,适应快速变化的数据模型。
  • 一致性与事务:

    • SQL数据库遵循ACID原则(原子性、一致性、隔离性、持久性),确保数据操作的可靠性和一致性
    • NoSQL数据库则倾向于BASE原则(基本可用性、软状态、最终一致性),在某些场景下牺牲了即时一致性以换取高可用性和高性能。
  • 适用场景

    • SQL适合于需要复杂查询、事务处理和高度一致性的应用场景,如银行、财务系统。
      NoSQL更适合处理海量数据、高并发访问、灵活数据模型的需求,如社交网络、物联网、实时分析等。
  • 查询语言:

    • SQL使用结构化的查询语言提供丰富的查询能力,如JOIN、GROUP BY等操作。
    • NoSQL的查询语言根据具体的数据库类型而异,有的支持类似SQL的查询语言(如MongoDB的MQL),有的则使用API或自定义查询方式。
ACID

ACID是数据集管理系统重事务的4个基本特征

  • 原子性(Atomicity)

    • 原子性保证了事务中的所有操作要么全部执行,要么全部不执行。这意味着事务中的操作是一个不可分割的工作单元如果事务中的任何一部分失败,整个事务都会被回滚,仿佛从未开始过一样,以保持数据库的一致状态。
  • 一致性(Consistency)

    • 一致性指的是事务执行前后,数据库的状态都满足所有的预定义规则。即事务必须使数据库从一个一致状态转换到另一个一致状态。即使在并发事务执行的环境中,也必须保持数据的准确性。
  • 隔离性(Isolation)

    • 隔离性确保了同时执行的多个事务之间互不影响每个事务都感觉像是在单独、序列化执行一样,不会受到其他事务的干扰。数据库系统提供了不同的隔离级别来平衡性能和数据一致性,如读未提交(Read
      Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable
      Read)和串行化(Serializable)
  • 持久性(Durability)

    • 持久性意味着一旦事务被提交,它引起的数据变化就会永久保存在数据库中,即使发生系统崩溃或电源故障等意外情况,这些改变也不会丢失。这是通过将事务日志写入到持久化存储来实现的。
BASE

相对于ACID模型,BASE是分布式系统和数据库设计中的一种替代一致性模型,尤其适用于大型分布式系统和NoSQL数据库。BASE模型主要关注的是可用性和可伸缩性,**牺牲了某种程度上的强一致性。**BASE代表的基本原则是:

  • 基本可用(Basically Available)
    • 系统在任何时候都保证一定程度的可用性,尽管在某些特殊情况下可能无法提供全部功能或数据可能不是最新的。这意味着即使部分系统出现故障,服务也应继续提供响应,哪怕是降级的服务
  • 软状态(Soft State)
    • 在BASE模型中,系统的状态可以有一段时间的不一致状态可以在不同节点间逐渐同步。与ACID模型的强一致性不同,软状态接受数据在一段时间内的不一致,直到最终达到一致
  • 最终一致性(Eventual Consistency)
    • 这是BASE模型的核心,它表明系统中的所有副本数据最终都将达到一致状态,但没有严格的时间限制。这意味着系统在处理完更新后可能需要一段时间来同步所有副本,最终用户会看到一致的数据视图。

认识Redis

Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存键值型NoSQL数据库。

  • 特征:
    • 键值(key-value)型,value支持多种不同数据结构功能丰富单线程,每个命令具备原子性
    • 低延迟,速度快(基于内存、I0多路复用、良好的编码)
    • 支持数据持久化
    • 支持主从集群、分片集群
    • 支持多语言客户端

Redis的常见命令

官网可以查询不同的命令详解

Redis的常见数据结构

在这里插入图片描述

Redis通用命令

通用命令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key

不建议在生产环境设备上使用

  • 性能影响和潜在阻塞
    • KEYS命令为了搜索出所有匹配的键,会遍历整个数据库。在拥有大量键的Redis实例中,这会导致严重的性能问题,因为它会占用大量的CPU时间和内存带宽。
    • 由于Redis是单线程处理命令的,执行KEYS操作期间,服务器将无法处理其他任何命令,直至该操作完成,这可能导致整个Redis服务暂时无响应,影响到所有依赖此Redis实例的应用
  • 资源消耗
    • 大量的键匹配可能产生极大的结果集,这不仅消耗网络带宽来传输这些结果到客户端还可能消耗客户端的资源来处理这些数据,尤其是在没有预期到结果集大小的情况下
  • 没有安全控制
    • 使用KEYS可能会无意中暴露敏感信息,尤其是当键名中包含业务逻辑或数据结构信息时。在生产环境中,应尽量减少直接暴露数据结构细节的机会
  • 对于生产环境,推荐的做法是使用SCAN命令来迭代键。SCAN命令提供了一种更加安全和可控的方式来遍历数据库中的键,它可以逐步迭代,每次返回一部分键,而不是一次性返回所有结果。
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个KEY的剩余有效期

String类型

字符串类型,是Redis中最简单的存储类型。
其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

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

String的常见命令有

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • SETEX:添加一个String类型的键值对,并且指定有效期

Key结构

通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范
Redis的key允许有多个单词形成层级结构,多个单词之间用’:'隔开,格式如下:
在这里插入图片描述
这个格式并非固定,也可以根据自己的需求来删除或添加词条。这样以来,我们就可以把不同类型的数据区分开了。从而避免了key的冲突问题。

例如我们的项目名称叫 heima,有user和product两种不同类型的数据,我们可以这样定义key:

  • user相关的key:heima:user:1

  • product相关的key:heima:product:1

在Redis的桌面客户端中,还会以相同前缀作为层级结构,让数据看起来层次分明,关系清晰:
在这里插入图片描述

Hash结构

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:
在这里插入图片描述
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD
在这里插入图片描述
Hash的常见命令有:

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

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

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

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

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

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

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

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

List类型

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索

特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

List的常见命令有:

  • LPUSH key element … :向列表左侧插入一个或多个元素
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPUSH key element … :向列表右侧插入一个或多个元素
  • RPOP key:移除并返回列表右侧的第一个元素
  • LRANGE key star end:返回一段角标范围内的所有元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

Set类型

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序

  • 元素不可重复

  • 查找快

  • 支持交集、并集、差集等功能

Set的常见命令有:

  • SADD key member … :向set中添加一个或多个元素
  • SREM key member … : 移除set中的指定元素
  • SCARD key: 返回set中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set中
  • SMEMBERS:获取set中的所有元素
  • SINTER key1 key2 … :求key1与key2的交集

SortedSet类型

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表

SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

SortedSet的常见命令有:

  • ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
  • ZREM key member:删除sorted set中的一个指定元素
  • ZSCORE key member : 获取sorted set中的指定元素的score值
  • ZRANK key member:获取sorted set 中的指定元素的排名
  • ZCARD key:获取sorted set中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

  • 升序获取sorted set 中的指定元素的排名:ZRANK key member

  • 降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber

Redis的Java客户端

在Redis官网中提供了各种语言的客户端,地址:https://redis.io/docs/clients/

  • Jedis和Lettuce:这两个主要是提供了Redis命令对应的API方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。
  • Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map、Queue等,而且支持跨进程的同步机制:Lock、Semaphore等待,比较适合用来实现特殊的功能需求

Jedis

Jedis的官网地址: https://github.com/redis/jedis

引入依赖:
<!--jedis-->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope>
</dependency>
建立连接
private Jedis jedis;@BeforeEach
void setUp() {// 1.建立连接// jedis = new Jedis("192.168.150.101", 6379);jedis = JedisConnectionFactory.getJedis();// 2.设置密码jedis.auth("123321");// 3.选择库jedis.select(0);
}

3.2.SpringDataRedis客户端

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
在这里插入图片描述

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

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

相关文章

深入探讨npm、Yarn、pnpm和npx之间的区别

前端生态系统是一个快速发展的领域&#xff0c;充满了各种工具和技术。对于开发人员来说&#xff0c;跟上这些创新可能是一项艰巨的挑战。 在本文中&#xff0c;我们将深入探讨npm、Yarn、pnpm和npx之间的区别&#xff0c;帮助你理解每个工具的不同之处。 包管理器比较 npm …

【一生一芯】

目录 安装Ubuntu 22.04 安装Ubuntu 22.04 我站在巨人的肩膀上&#xff0c;安装教程见VMware安装Ubuntu22.04(英文桌面)教程 备忘一下&#xff1a; 1.Ubuntu中在终端进入root权限但是总提示密码错误的解决方案 对支持 IPv6 的镜像主机执行 ping 操作&#xff1a; 将帐户添加到 …

私有大模型:针对长结构文档的回答方法

作者: Jon Saad-Falcon, Joe Barrow, Alexa Siu, Ani Nenkova, David Seunghyun Yoon, Ryan A. Rossi, Franck Dernoncourt 摘要: 大型语言模型&#xff08;LLMs&#xff09;在处理长文档问答&#xff08;QA&#xff09;时面临着无法适应其小上下文窗口的问题。为了解决这一问…

【计算机视觉】数字图像处理基础知识(模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类)

一、图像的基本概念 图像(image)&#xff1a;图像这个简单单词其实包含两方面含义&#xff1a; “图”&#xff1a;是指物体反射光or透射光的分布“像”&#xff1a;接收和记录其分布所得到的结果&#xff08;如&#xff1a;人的视觉系统所接收“图”在人脑中形成的映像或认识&…

LLVM入门教学——SanitizerCoverage插桩(Linux)

1、介绍 LLVM 的 SanitizerCoverage 是一种代码覆盖工具&#xff0c;设计用于支持基于 fuzzing 的测试和其他安全相关工具。SanitizerCoverage 在编译时插桩代码&#xff0c;以在运行时收集覆盖信息&#xff0c;从而帮助识别未覆盖的代码路径&#xff0c;提高测试的有效性和全…

算法-随机快排及荷兰国旗优化

文章目录 算法介绍 :1. 随机快排解析2. 荷兰国旗问题3. 随机快排优化4. 总结随机快排 算法介绍 : 随机快速排序和传统的快速排序的逻辑本质是一致的,都是找到一个值作为划分的中间位置,左边数值均小于该数值,右边数值均大于该数值,但是与传统的快排又不一致的是,我们的这个位置…

国内的期权模拟账户怎么申请?

国内的期权模拟账户可以在券商和期权分仓平台处申请开通&#xff0c;期权相比于股票具有杠杆投资、风险控制等新特性。 期权模拟交易客户端能够提供期权的开平仓交易、备兑开仓&#xff0f;平仓、行权等交易指令&#xff0c;下文为大家介绍国内的期权模拟账户怎么申请&#xff…

2024 cicsn Ezheap

文章目录 检查 libc2.35利用adddeleeditshow 思路exp结果 检查 libc2.35 利用 add 0x80个chunk&#xff0c;遍历选一个没有被用的&#xff0c;输入的size<0x501,然后malloc后会清零安装输入的size&#xff0c;然后输入内容&#xff0c;长度也是输入的size dele 指定索引…

第十六课,海龟画图:设置画笔颜色、宽度函数,移动画笔函数

一&#xff0c;turtle.color()&#xff1a;画笔颜色函数 这个函数能设置画笔画出来的颜色&#xff0c;当然&#xff0c;使用它之前你需要认识有哪些“颜料”可供你选择&#xff0c;turtle库的color()函数可以选择以下颜色&#xff1a; "white" 白色&#xff08;建议…

3步轻松月入过万,APP广告新模式大揭秘!

万万没想到&#xff1a;用这个APP广告模式&#xff0c;月入过万竟然如此简单&#xff01; 在移动应用开发的世界里&#xff0c;变现一直是一道难题。 许多APP开发者和产品经理为了提高收益、增强用户黏性&#xff0c;不断尝试各种策略。 然而&#xff0c;很多时候&#xff0c…

2024-6-1 石群电路-20

2024-6-1&#xff0c;星期六&#xff0c;18:24&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。已经到学校啦&#xff0c;本来打算今天休息一天不更了&#xff0c;但是觉得可以更新完再休息&#xff0c;没有这么累&#xff0c;哈哈哈哈&#xff0c;这就不得不说…

阿里云部署nodejs

目录 1、安装node.js 1-1 进入opt/software 1-2 下载node.js安装包 1-3 解压 2 配置环境变量 2-1 vim中配置环境变量 2-2 命令行中保存环境变量 2-3 检查安装版本 2-3 更换镜像 3、上传node.js项目 1-1 启动项目 1-2 配置对应的安全组 ​编辑 4、pm2启动多个node项…

Linux目录的基本结构(RHEL8系统基本使用之文件操作)

1.Linux的目录树结构 2.各目录的功能介绍 3.理解文件路径表示方法 Who&#xff1f;——>当前登录的用户 Where?——>路径 我要在哪儿创建文件&#xff1f; 我要删除什么地方的什么文件&#xff1f; 我所要查看的文件在哪里&#xff1f; What?——>操作命令 Ho…

Ultralytics x SwanLab:可视化YOLO模型训练

Ultralytics是YOLO官方团队推出的CV训练与推理框架&#xff0c;不仅支持目标检测任务&#xff0c;还支持分割、姿态识别、分类等更多任务。 SwanLab是一个深度学习实验管理与训练可视化工具&#xff0c;由西安电子科技大学团队打造&#xff0c;融合了Weights & Biases与Ten…

java web爬虫

目录 读取本地文件 从网站读取文件 java爬虫 总结 读取本地文件 import java.io.File; import java.io.PrintWriter; import java.util.Scanner;public class ReplaceText {public static void main() throws Exception{File file new File("basic\\test.txt"…

vue3:插槽、具名插槽、条件插槽、作用域插槽、具名作用域插槽 一次性搞清楚 --- 通俗易懂

1、插槽的使用&#xff1a; ~父组件index.vue&#xff1a; <h3>我是父组件testSlot</h3> <!-- 调用子组件alertBox测试插槽 --> <alertBox></alertBox> <alertBox>Something good will be happened. /alertBox> <br> ~alertBo…

钓虾馆计时计费怎么用,佳易王钓虾馆钓鱼场计时器工具软件操作教程

钓虾馆计时计费怎么用&#xff0c;佳易王钓虾馆钓鱼场计时器工具软件操作教程 一、前言 以下软件操作教程以&#xff0c;佳易王钓虾馆钓鱼场计时计费软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 可以多种单价计费方式&#xff0c;在系统…

Elasticsearch 认证模拟题 - 4

一、题目 生成快照&#xff0c;或快照生命周期 1.1 考点 快照生命周期&#xff08;最好通过界面化配置&#xff09;创建仓库创建快照 &#xff08;因为这个需要部署共享文件&#xff0c;所以这个我就在虚拟机上简单操作一下&#xff09; 注&#xff1a; 部署共享文件系统可…

【开发利器】使用OpenCV算子工作流高效开发

学习《人工智能应用软件开发》&#xff0c;学会所有OpenCV技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV实验大师Python SDK 基于OpenCV实验大师v1.02版本提供的Python SDK 实现工作流导出与第三方应用集…

MySql全文索引+Ngram

一、关于Ngram 1.1 什么是ngram MySQL 内置的全文解析器使用单词之间的空格作为分隔符&#xff0c;这对于不使用空格做分隔符的语言是一种限制。为了解决这一限制&#xff0c;MySQL提供了一个支持中文、日文和韩文&#xff08;CJK&#xff09;的ngram全文解析器。ngram 全文解…