redis和mysql

文章目录

      • 一、redis
        • 1.1 redis的数据结构都有哪些?
        • 1.2 持久化方式有哪些?
        • 1.3 怎么保证缓存和数据库数据的一致性?
        • 1.4 redis缓存是什么意思?
      • 二、数据库
        • 2.1 基本数据类型
        • 2.2 MySQL 的内连接、左连接、右连接有什么区别?
        • 2.3 MySQL 问题排查都有哪些手段?
        • 2.4 如何做 MySQL 的性能优化?
        • 2.5 如何避免 SQL 注入?

一、redis

1.1 redis的数据结构都有哪些?

  • key-string:一个key对应一个值。最常用的,一般用于存储一个值。

  • key-hash:一个key对应一个Map。存储一个对象数据的。

  • key-list:一个key对应一个列表。使用list结构实现栈和队列结构。

  • key-set:一个key对应一个集合。交集,差集和并集的操作。

  • key-zset:一个key对应一个有序的集合。排行榜,积分存储等操作。

  • HyperLogLog:计算近似值的。

  • GEO:地理位置。

  • BIT:一般存储的也是一个字符串,存储的是一个byte[]。

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2SsxDAnj-1687195308369)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

1.2 持久化方式有哪些?

RDB:RDB是Redis默认的持久化机制

  • RDB持久化文件,速度比较快,而且存储的是一个二进制的文件,传输起来很方便。
  • RDB持久化的时机:

save 900 1:在900秒内,有1个key改变了,就执行RDB持久化。

save 300 10:在300秒内,有10个key改变了,就执行RDB持久化。

save 60 10000:在60秒内,有10000个key改变了,就执行RDB持久化。

如果300秒内 9个key改变了,也不执行持久化

  • RDB无法保证数据的绝对安全。
  • 假如 60秒内 执行了9999个key改变,RDB也不执行持久化,这时候数据就不是安全的

AOF:AOF持久化机制默认是关闭的,Redis官方推荐同时开启RDB和AOF持久化,更安全,避免数据丢失。

  • AOF持久化的速度,相对RDB较慢的,存储的是一个文本文件,到了后期文件会比较大,传输困难。
  • AOF持久化时机。

appendfsync always:每执行一个写操作,立即持久化到AOF文件中,性能比较低。 appendfsync everysec:每秒执行一次持久化。 推荐使用

appendfsync no:会根据你的操作系统不同,环境的不同,在一定时间内执行一次持久化。

  • AOF相对RDB更安全,推荐同时开启AOF和RDB。

1.3 怎么保证缓存和数据库数据的一致性?

  1. 缓存更新策略: 在进行数据更新操作时,需要保证同时更新缓存和数据库。一种常见的策略是“先更新数据库,再更新缓存”。即在更新数据库之后,立即更新对应的缓存数据。这样可以确保缓存中的数据与数据库中的数据保持一致。
  2. 缓存失效策略: 当数据库中的数据发生更新时,可以通过使缓存失效来保证数据一致性。即在数据库更新操作完成后,手动使对应的缓存失效(或删除)。这样,下次读取该数据时,将从数据库中重新加载最新数据,并将其放入缓存中。
  3. 过期时间设置: Redis提供了设置缓存的过期时间的功能。可以根据数据的特性和业务需求,为缓存设置合适的过期时间。在过期时间到达后,缓存会自动失效,下次读取时将从数据库加载最新数据。通过合理设置过期时间,可以保证缓存中的数据与数据库中的数据保持一致,并避免数据过期导致的一致性问题。
  4. 读写分离: 对于一些高并发的应用场景,可以考虑使用读写分离的架构。即将读操作和写操作分别路由到不同的Redis实例或者节点上。写操作通过主节点更新数据库,并更新缓存,而读操作则通过从节点或者缓存来获取数据,从而保证数据的一致性。

1.4 redis缓存是什么意思?

使用Redis缓存的主要目的是减轻后端数据库的负载,提高系统的性能和响应时间。当应用程序需要访问某些数据时,它首先会尝试从Redis缓存中读取数据。如果缓存中存在所需的数据,应用程序就可以快速获取它,而无需查询数据库。这样可以减少对数据库的频繁访问,提高系统的吞吐量和并发能力。

二、数据库

2.1 基本数据类型

  1. 整数类型(Integer):用于存储整数值,如整数、长整数等。常见的整数类型有INTBIGINT等。
  2. 浮点数类型(Floating-Point):用于存储浮点数,如小数或科学计数法表示的数值。常见的浮点数类型有FLOATDOUBLE等。
  3. 字符串类型(String):用于存储文本或字符数据。字符串类型可以是固定长度的,也可以是可变长度的。常见的字符串类型有CHARVARCHARTEXT等。
  4. 布尔类型(Boolean):用于存储逻辑值,表示真或假。在某些数据库中,布尔类型可以使用1和0来表示。
  5. 日期和时间类型(Date and Time):用于存储日期、时间或日期时间的数值。常见的日期和时间类型有DATETIMEDATETIME等。
  6. 二进制类型(Binary):用于存储二进制数据,如图像、音频或视频文件。二进制类型可以存储任意长度的二进制数据。

2.2 MySQL 的内连接、左连接、右连接有什么区别?

  1. 内连接(Inner Join):内连接返回两个表中满足连接条件的交集数据。只有在连接条件匹配的情况下,才会返回相关的行。如果某个表中的行在另一个表中没有匹配的行,则该行不会包含在结果中。

    例如,如果你有两个表A和B,使用内连接查询SELECT * FROM A INNER JOIN B ON A.id = B.id,结果将只包含那些在A和B表中都有匹配的行。

  2. 左连接(Left Join):左连接返回左表中的所有行,以及右表中满足连接条件的匹配行。如果右表中没有匹配的行,则会使用NULL值填充右表的列。

    例如,使用左连接查询SELECT * FROM A LEFT JOIN B ON A.id = B.id,结果将包含左表A的所有行,以及那些在B表中有匹配的行。

  3. 右连接(Right Join):右连接与左连接相反,它返回右表中的所有行,以及左表中满足连接条件的匹配行。如果左表中没有匹配的行,则会使用NULL值填充左表的列。

    例如,使用右连接查询SELECT * FROM A RIGHT JOIN B ON A.id = B.id,结果将包含右表B的所有行,以及那些在A表中有匹配的行。

需要注意的是,左连接和右连接通常用于连接两个表,而内连接可以用于连接多个表。使用不同类型的连接取决于你需要获取的数据和数据之间的关系。

2.3 MySQL 问题排查都有哪些手段?

  1. 错误日志(Error Log):MySQL会将运行时发生的错误和警告记录到错误日志中。查看错误日志可以帮助你了解数据库中发生的问题,并提供有关错误的详细信息。错误日志的位置和名称可以在MySQL配置文件中找到。
  2. 查询日志(Query Log):通过启用查询日志,可以记录所有进入MySQL服务器的查询语句。查询日志可以帮助你分析执行的查询语句和查询性能。但请注意,启用查询日志可能会对性能产生影响,因为它会记录每个查询。
  3. 慢查询日志(Slow Query Log):慢查询日志用于记录执行时间超过特定阈值的查询语句。通过分析慢查询日志,你可以找到执行时间较长的查询,并对其进行优化。
  4. Explain命令:Explain命令可以用于分析查询语句的执行计划。它可以告诉你查询将如何执行、使用哪些索引以及涉及的表和连接类型。使用Explain命令可以帮助你理解查询的执行过程,并识别潜在的性能问题。
  5. 监控工具和性能分析器:使用监控工具和性能分析器,如MySQL自带的Performance Schema、MySQL Workbench、Percona Toolkit等,可以实时监控MySQL的性能指标、查询执行时间、锁和死锁情况等。这些工具可以帮助你识别性能瓶颈和优化查询。
  6. 数据库配置参数:MySQL有许多配置参数,可以影响性能和行为。检查和调整这些配置参数,如缓冲区大小、连接数、并发控制等,可以优化MySQL的性能和稳定性。
  7. 索引和查询优化:分析查询语句的执行计划、使用合适的索引、优化查询语句的结构等,都是优化MySQL性能的重要手段。通过调整查询和表结构,可以减少查询的执行时间和资源消耗。
  8. 监控系统资源:监控服务器的CPU使用率、内存使用情况、磁盘I/O等系统资源,可以帮助你确定是否存在资源瓶颈,从而解决数据库性能问题。

2.4 如何做 MySQL 的性能优化?

  1. 优化查询语句:
    • 使用合适的索引:根据查询条件和数据访问模式创建适当的索引,以加快查询速度。
    • 减少查询返回的数据量:只选择需要的列,避免使用SELECT *,并使用LIMIT限制结果集的大小。
    • 使用JOIN语句优化查询:避免多次单表查询,合理使用JOIN语句来连接多个表。
    • 优化复杂查询:考虑重写复杂查询,拆分成多个简单查询或使用临时表等方式进行优化。
  2. 配置优化:
    • 调整缓冲区大小:合理配置MySQL的缓冲区大小,如缓存池、查询缓存等,以提高数据读取和写入的效率。
    • 调整并发连接数:根据系统负载和硬件配置,适当调整最大连接数,避免过多的并发连接导致性能下降。
    • 调整其他配置参数:根据实际情况,调整MySQL的其他配置参数,如线程池、排序缓冲区、临时表大小等,以优化性能。
  3. 硬件和存储优化:
    • 使用合适的硬件:选择合适的硬件设备,包括CPU、内存、存储等,以满足系统的需求。
    • 使用合理的存储引擎:根据应用程序的特点和需求,选择合适的存储引擎,如InnoDB、MyISAM等。
    • 配置文件系统和磁盘:确保文件系统和磁盘的性能良好,并遵循最佳实践进行配置。
  4. 数据库设计优化:
    • 范式化和反范式化:根据数据的特点和查询需求,进行范式化或反范式化的设计,以提高查询效率。
    • 分区和分表:对大型表进行分区或分表,可以提高查询和维护的效率。
    • 垂直和水平拆分:根据业务需求,将大型数据库拆分成更小、更专注的部分,以提高性能和可扩展性。
  5. 定期维护和监控:
    • 定期优化数据库:执行表优化、索引优化、碎片整理等操作,以保持数据库的健康状态。
    • 监控和性能分析:使用监控工具和性能分析器监控MySQL的性能指标、查询执行时间等,识别潜在的性能问题,并及时进行调整和优化。

2.5 如何避免 SQL 注入?

  1. 使用参数化查询(Prepared Statements)或预编译语句:参数化查询是将SQL查询语句和参数分开处理,确保用户输入的数据不会被直接嵌入到查询语句中。数据库会预编译查询语句,然后将参数传递给查询,从而避免了SQL注入攻击。
  2. 使用存储过程(Stored Procedures):存储过程是预先定义在数据库中的一组SQL语句。通过使用存储过程,可以将数据校验和处理逻辑置于数据库层面,从而降低SQL注入的风险。
  3. 输入验证和过滤:对用户输入的数据进行验证和过滤,确保只接受预期的数据类型和格式。使用白名单或正则表达式等方法对输入进行限制,过滤掉非法字符或语法,从而防止恶意输入被执行为SQL语句。
  4. 不信任外部数据:将用户输入的数据视为不可信任的,并对其进行适当的转义或编码。使用数据库提供的转义函数或编码函数,如PDO的quote()方法或相关编程语言的转义函数,来处理输入数据。
  5. 最小权限原则:将数据库用户授予最低权限,只赋予其执行必要操作的权限,限制对数据库的访问范围,从而减少潜在攻击的影响范围。
  6. 定期更新和维护:及时应用数据库供应商发布的安全更新和补丁,以修复已知的安全漏洞。同时,定期审查和维护应用程序的代码,修复可能存在的安全漏洞。
    用户授予最低权限,只赋予其执行必要操作的权限,限制对数据库的访问范围,从而减少潜在攻击的影响范围。
  7. 定期更新和维护:及时应用数据库供应商发布的安全更新和补丁,以修复已知的安全漏洞。同时,定期审查和维护应用程序的代码,修复可能存在的安全漏洞。
  8. 安全意识培训:加强开发人员和管理员的安全意识培训,提高对SQL注入攻击的认识,遵循安全编码的最佳实践,以减少安全漏洞的风险。

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

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

相关文章

闲置iPad Pro打造真正的生产力工具!使用vscode编程写代码

文章目录 前言视频教程1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7…

Java阶段四Day08

Java阶段四Day08 文章目录 Java阶段四Day08关于pom.xml中的版本关于Session关于Token关于JWT在项目中使用JWTCustomUserDetailsUserDetailServiceImplUserServiceImpl 关于pom.xml中的版本 查看<groupId> 是同一家的只需配一个版本号<version><artifactId>中…

Spring Boot中的Profile:原理、用法与示例

Spring Boot中的Profile&#xff1a;原理、用法与示例 前言 Spring Boot 是一个快速开发 Spring 应用程序的框架&#xff0c;它提供了很多有用的功能和特性。其中&#xff0c;Profile 是一个常用的功能&#xff0c;它可以根据不同的环境配置来加载不同的配置文件&#xff0c;…

双路高速 DA 实验

目录 双路高速 DA 实验 1、简介 2、实验任务 3、程序设计 3.1、hs_dual_da顶层模块代码 3.2、ROM 波形存储模块&#xff08;rom_1024x10b&#xff09; 创建单端口 ROM IP核 3.2、DA 数据发送模块&#xff08;da_wave_send&#xff09;代码 4、硬件设计 4.1、添加.xdc…

Nginx网站服务

目录 Nginx简介 简述Nginx和Apache的差异 3 Nginx 相对于 Apache 的优点 阻塞与非阻塞 同步与异步 ginx 应用场景 nginx编译安装 Nginx安装和升级 1.关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下 2.拖入软件包 3.安装依赖包 3.创建运行用户与组 5.编译安…

【黑马头条-Java微服务项目】

黑马头条-Java微服务项目 (一)、项目介绍1.项目背景介绍(1).基本介绍(2).业务说明(3).项目术语介绍 2.技术栈说明(1).技术栈-基础六层技术(2).技术栈-服务四层技术(3).技术栈-分布 (二)、nacos环境搭建 (一)、项目介绍 1.项目背景介绍 (1).基本介绍 随着智能手机的普及&…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#xff1a;机器视觉与人工智能。 电子邮件&#xff1a;1078914066qq.com 一&#xff0e;文心AI作画API介绍 1. 文心AI作画 文…

Seata 四种模式对比总结

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

Day_56-57kMeans 聚类

目录 Day_56-57 k-Means 聚类 一. 基本概念介绍 二. 具体过程 三. 代码实现与解释 1. 导入数据与数据初始化 2. 核心代码 3. 后续信息的补充 4. 距离计算和随机排列 四. 后续的数据分析 五. 运行结果 Day_56-57 k-Means 聚类 一. 基本概念介绍 同我上一篇博客的介绍&…

【Linux】打开Linux大门,踏入Linux世界(环境搭建再加一群Linux基本指令就OK啦~)

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;Linux系统编程与网络编程 &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#x…

MySQL表的约束

目录 前言 1.什么是约束 2.空属性 3.默认值 4.列描述 5.zerofill 6.主键 7.自增长 8.唯一键 9.外键 总结 前言 hello&#xff0c;各位小伙伴大家好&#xff0c;本章内容为大家介绍关于MySQL约束的相关内容&#xff0c;关于约束这个概念&#xff0c;如果是第一次接触可…

redis---基础(部署及常用命令)

目录 前言一、关系型数据库与非关系型数据库1. 关系型数据库2. 非关系型数据库3. 关系型数据库和非关系型数据库区别4. 非关系型数据库产生背景小结&#xff1a; 二、Redis简介1. 单进程快速的原因&#xff1a;2.epoll 机制优势&#xff1a; 三、Redis 具有以下几个优点四、red…