Redis学习笔记【基础篇】

news2024/10/5 22:55:44

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.coloradmin.cn/o/1717457.html

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

相关文章

修改element-ui el-radio颜色

修改element-ui el-radio颜色 需求效果图代码实现 小结 需求 撤销扣分是绿色&#xff0c;驳回是红色 效果图 代码实现 dom <el-table-columnlabel"操作"width"200px"><template v-slot"scope"><el-radio-group v-model"s…

基础—SQL—DQL(数据查询语言)分页查询

一、引言 上一篇博客学习了排序查询&#xff0c;这次来讲查询的最后一个部分&#xff1a;分页查询。 涉及到的关键字是&#xff1a;LIMIT 。 二、DQL—分页查询 对于分页&#xff0c;不管以后做的是传统的管理系统还是做互联网的项目&#xff0c;基本上都会遇到分页查询的操…

入门flask:Python后端开发的首选框架

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;从零开始学习弗拉斯克 二、弗拉斯克的微框架哲学 三、弗拉斯克的核心…

vs code便利手册

vs code终端改造 改造颜色 未改造前&#xff1a; 改造后&#xff1a; 改造方法&#xff1a;VS Code 终端美化成自己喜欢的样子_vs code 终端样式-CSDN博客

如何备份RDK X3(旭日X3派)的 SD卡镜像

该方法可以在Ubuntu的开发机上生成一个img镜像&#xff0c;后续可以直接使用rufus软件烧录备份好的镜像。 Step 1&#xff1a;在Ubuntu的开发机上安装gparted软件 如果安装失败则需要为您的Ubuntu开发机换源&#xff0c;这里推荐阿里源&#xff1a;https://developer.aliyun.…

Linux网络编程:应用层协议|HTTPS

目录 1.预备知识 1.1.加密和解密 1.2.常见加密方式 1.2.1.对称加密 1.2.2.非对称加密 ​编辑 1.3.数据摘要&#xff08;数据指纹&#xff09;和数据签名 1.4.证书 1.4.1.CA认证 1.4.2.证书和数字签名 2.HTTPS协议 2.1.自行设计HTTPS加密方案 2.1.1.只使用对称加密 …

【python深度学习】——大型工程项目管理以及互相导入

【python深度学习】——大型工程项目管理以及互相导入 1. 工程项目中常见的文件组织形式2. python中的“包”、“模块”、与__init__.py2.1 概念理解2.2 \__init__py的使用3. 包的导入——相对导入与绝对导入3.1 相对导入3.1.1 相对导入的语法3.1.2 相对导入的使用注意事项与常…

jupyter notebook anaconda环境下查看|加载|更换内核

文章目录 1 问题复现2 查看内核位置3 调整python解释器位置 1 问题复现 在conda虚拟环境中使用pip安装相应package&#xff0c; 但是在jupyter notebook中加载该package时报错 [ERROR]ModuleNotFoundError: No module named shap 此时&#xff0c;除去包安装出现问题以外&am…

【国产化适配】国产化设备安装银河麒麟服务器V10填坑之路

银河麒麟官网申请试用&#xff0c;下载链接 AMD64/海光版/兆芯版 共享文件下载 - Kylin Distrohttps://distro-images.kylinos.cn:8802/web_pungi/download/share/vYTMm38Pkaq0KRGzg9pBsWf2c16FUwJL/ 飞腾版/鲲鹏版/ARM64 共享文件下载 - Kylin Distrohttps://distro-image…

运算符重载(下)

目录 前置和后置重载前置的实现Date& Date::operator()代码 后置的实现Date Date::operator(int )代码 前置--和后置--重载前置--的实现Date& Date::operator--( )代码 后置--的实现Date Date::operator--(int )代码 流插入运算符重载流插入运算符重载的实现流提取运算…

完蛋,AI一不小心把手机影像颠覆了

文&#xff5c;刘俊宏 2024上半年的发售季&#xff0c;手机影像大战再起。 近年来&#xff0c;影像年年卷&#xff0c;年年挤牙膏&#xff0c;直到AI大模型来临。 刚推出的荣耀跟法国百年摄影工作室雅顾合作&#xff0c;主打手机上拍出2万一张人像照片的高级感。华为nou在Pu…

【Python】 如何从列表中移除第一个元素?

基本原理 在Python中&#xff0c;列表是一种非常灵活的数据结构&#xff0c;可以存储一系列的元素。这些元素可以是任何类型&#xff0c;包括数字、字符串、其他列表等。列表中的元素是有序的&#xff0c;并且可以通过索引来访问和修改。 当我们想要从列表中移除第一个元素时…

【C++】哈希(2万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 unordered系列关联式容器 unordered_map unordered_map的文档介绍 unordered_map的接口说明 unordered_set 底层结构 哈希概念 哈希冲突 哈希函数 哈希…

Linux CFS调度器之周期性调度器scheduler_tick函数

文章目录 前言一、简介二、源码分析2.1 scheduler_tick2.2 task_tick2.3 entity_tick2.4 check_preempt_tick2.5 resched_curr 参考资料 前言 Linux内核调度器主要是主调度器和周期性调度器&#xff0c;主调度器请参考&#xff1a;Linux 进程调度之schdule主调度器 一、简介 …

【JavaEE】多线程(1)

&#x1f386;&#x1f386;&#x1f386;个人主页&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;JavaEE专栏&#x1f386;&#x1f386;&#x1f386; &#x1f386;&#x1f386;&#x1f386;计算机是怎么工作的&#x1f386;&#x1f3…

ctfshow web刷题

1.红包题第六弹 作者给了提示 F12查看页面源代码 <html lang"zh-CN"> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /> <meta name"viewport" content"widthdevice-…

低代码赋能企业数字化转型:数百家软件公司的成功实践

本文转载于葡萄城公众号&#xff0c;原文链接&#xff1a;https://mp.weixin.qq.com/s/gN8Rq9TDmkMpCtNMMsBUXQ 导读 在当今的软件开发时代&#xff0c;以新技术助力企业数字化转型已经成为一个热门话题。如何快速适应技术变革&#xff0c;构建符合时代需求的技术能力和业务模…

Python网页处理与爬虫实战:使用Requests库进行网页数据抓取

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【C++修行之道】类和对象(三)拷贝构造函数

目录 一、 概念 二、特征 正确的拷贝构造函数写法&#xff1a; 拷贝函数的另一种写法 三、若未显式定义&#xff0c;编译器会生成默认的拷贝构造函数。 四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了&#xff0c;还需要自己显式实现吗&#xff1f; 深拷…

Linux系统安全及其应用

文章目录 一、用户账号安全管理1.1 系统账号的清理1.2 对用户账号的操作1.2.1 锁定和解锁用户1.2.2 删除无用账号 1.3 对重要文件进行锁定1.4 密码安全控制1.4.1 新建用户1.4.2 已有用户 二、历史命令管理2.1 历史命令限制2.2 自动清空历史命令 三、设置终端登录的安全管理3.1 …