简单认识一下-Redis

一、什么是Redis

Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它既可以用作数据库、缓存,也可以作为消息中间件使用。以下为你详细介绍 Redis:

基本特点

  • 高性能:Redis 将数据存储在内存中,这使得它的读写操作速度极快。其单线程架构避免了多线程的上下文切换开销,再结合高效的数据结构,能轻松实现每秒处理大量的读写请求。例如,在一些高并发的互联网应用中,Redis 可以快速响应大量用户的请求,提供低延迟的数据访问服务。
  • 数据结构丰富:Redis 支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。每种数据结构都有其独特的操作方法,适用于不同的应用场景。例如,使用哈希结构可以方便地存储对象信息,使用有序集合可以实现排行榜功能。
  • 持久化:Redis 提供了两种持久化机制,即 RDB(Redis Database)和 AOF(Append - Only File)。RDB 是通过快照的方式将内存中的数据定期保存到磁盘上,适合用于备份和灾难恢复;AOF 则是将所有的写操作以日志的形式追加到文件中,在重启时可以通过重新执行这些写操作来恢复数据,保证了数据的完整性和可靠性。
  • 分布式支持:Redis 可以通过集群和主从复制等方式实现分布式部署。主从复制允许将数据从一个主节点复制到多个从节点,提高了数据的可用性和读写性能;Redis Cluster 则支持自动分片,将数据分布在多个节点上,实现了数据的水平扩展,能够处理大规模的数据和高并发的请求。
  • 原子性操作:Redis 的所有操作都是原子性的,这意味着在执行操作时不会被其他操作打断。对于复杂的操作,如多个命令的组合,Redis 也提供了事务机制来保证操作的原子性,确保数据的一致性

常见数据结构及应用场景

  • 字符串(String)
    • 结构特点:最基本的数据结构,一个键对应一个值。
    • 应用场景缓存数据,如缓存网页内容、数据库查询结果等;实现计数器,如统计网站的访问量、文章的阅读数等。
import redisr = redis.Redis(host='localhost', port=6379, db=0)
# 设置值
r.set('key', 'value')
# 获取值
value = r.get('key')
print(value.decode())

  • 哈希(Hash)
    • 结构特点:类似于 Python 中的字典,一个哈希键可以包含多个字段和值。
    • 应用场景:存储对象信息,如用户信息、商品信息等,方便对对象的各个属性进行单独操作。

# 设置哈希值
r.hset('user:1', 'name', 'John')
r.hset('user:1', 'age', 30)
# 获取哈希值
name = r.hget('user:1', 'name')
print(name.decode())

  • 列表(List)
    • 结构特点:按照插入顺序排序的字符串元素集合,可以从列表的两端进行插入和删除操作。
    • 应用场景:实现消息队列,如任务队列、日志队列等;实现栈和队列的数据结构。

# 从列表左侧插入元素
r.lpush('mylist', 'element1')
r.lpush('mylist', 'element2')
# 从列表右侧弹出元素
element = r.rpop('mylist')
print(element.decode())

  • 集合(Set)
    • 结构特点无序且唯一的字符串元素集合,支持交集、并集、差集等操作
    • 应用场景:去重操作,如统计网站的独立访客数;实现共同好友、共同兴趣等功能。

# 添加元素到集合
r.sadd('myset', 'value1')
r.sadd('myset', 'value2')
# 判断元素是否在集合中
is_member = r.sismember('myset', 'value1')
print(is_member)

  • 有序集合(Sorted Set)
    • 结构特点:每个元素都关联一个分数,根据分数对元素进行排序,元素也是唯一的。
    • 应用场景:实现排行榜功能,如游戏的积分排行榜、文章的热度排行榜等。

# 添加元素到有序集合
r.zadd('leaderboard', {'player1': 100, 'player2': 200})
# 获取分数最高的元素
top_player = r.zrevrange('leaderboard', 0, 0)
print(top_player[0].decode())

应用场景

  • 缓存:作为缓存中间件,Redis 可以将经常访问的数据存储在内存中,减少对后端数据库的访问压力,提高系统的响应速度。例如,在电商系统中,将商品信息、用户信息等缓存到 Redis 中,用户访问时可以直接从 Redis 中获取数据。
  • 会话管理:在 Web 应用中,使用 Redis 存储用户的会话信息,实现会话的共享和分布式管理。不同的服务器节点可以通过 Redis 来获取和更新用户的会话状态,提高系统的可扩展性和可靠性。
  • 消息队列:利用 Redis 的列表数据结构可以实现简单的消息队列。生产者将消息放入列表中,消费者从列表中取出消息进行处理,实现异步任务处理和系统解耦。
  • 排行榜和计数器:使用有序集合和字符串数据结构可以轻松实现排行榜和计数器功能。例如,在社交平台中,统计用户的粉丝数、点赞数等,并根据这些数据生成排行榜。

二、Redis的分布式部署(三种集群方式)

Redis 的分布式部署是为了满足大规模数据存储、高并发访问以及高可用性等需求而采用的部署方式。以下将详细介绍常见的 Redis 分布式部署方案:主从复制、哨兵模式和 Redis Cluster。

主从复制

原理

主从复制是一种简单且基础的分布式部署方式。在主从复制架构中,存在一个主节点(Master)和多个从节点(Slave)。主节点负责处理写操作,并将写操作产生的数据变化同步到从节点;从节点主要负责处理读操作,通过复制主节点的数据来保证数据的一致性。

部署步骤

  1. 配置主节点:通常使用默认配置即可,无需特殊配置主从复制相关内容,只需确保主节点正常运行。
  2. 配置从节点:在从节点的配置文件(redis.conf)中添加 slaveof <master_ip> <master_port> 配置项,指定主节点的 IP 地址和端口号。例如:
slaveof 192.168.1.100 6379

  1. 启动节点:分别启动主节点和从节点,从节点会自动连接到主节点,并开始复制数据。
优点

  • 读写分离:可以将读操作分散到多个从节点上,减轻主节点的负载,提高系统的读性能。
  • 数据备份:从节点复制主节点的数据,相当于对数据进行了备份,增强了数据的安全性。
缺点

  • 写操作瓶颈:所有的写操作都集中在主节点上,当写操作频繁时,主节点可能成为性能瓶颈。
  • 主节点故障处理复杂:如果主节点发生故障,需要手动将某个从节点提升为主节点,并且重新配置其他从节点指向新的主节点,操作较为复杂。

哨兵模式(Sentinel)

原理

哨兵模式是在主从复制的基础上,引入了哨兵节点(Sentinel)来实现自动故障转移。哨兵节点会监控主节点和从节点的状态,当发现主节点出现故障时,会自动从从节点中选举出一个新的主节点,并通知其他从节点和客户端连接到新的主节点。

部署步骤

  1. 部署主从复制架构:先按照主从复制的方式部署好主节点和从节点。
  2. 配置哨兵节点:创建哨兵节点的配置文件(sentinel.conf),并添加以下配置:
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000

其中,mymaster 是主节点的名称,192.168.1.100 6379 是主节点的 IP 地址和端口号,2 表示至少需要 2 个哨兵节点认为主节点不可用,才会进行故障转移。
3. 启动哨兵节点:启动多个哨兵节点,它们会自动发现并监控主从节点。

优点

  • 自动故障转移:当主节点发生故障时,哨兵节点会自动进行故障转移,无需人工干预,提高了系统的可用性。
  • 监控功能:哨兵节点可以实时监控主从节点的状态,提供了一定的监控和报警功能。
缺点

  • 配置和管理复杂:需要额外配置和管理哨兵节点,增加了系统的复杂度。
  • 写操作仍然存在瓶颈:和主从复制一样,所有的写操作还是集中在主节点上,写操作瓶颈问题依然存在。

Redis Cluster

原理

Redis Cluster 是 Redis 官方提供的分布式解决方案,采用分片(Sharding)的方式将数据分散存储在多个节点上。每个节点负责一部分数据的存储和处理,并且节点之间通过 Gossip 协议进行通信,实现节点状态的同步和故障检测。

部署步骤

  1. 准备多个节点:启动多个 Redis 实例,每个实例可以在不同的服务器上,也可以在同一服务器的不同端口上。
  2. 创建集群:使用 redis-cli --cluster create 命令创建集群,并指定节点的 IP 地址和端口号。例如:
redis-cli --cluster create 192.168.1.100:6379 192.168.1.101:6379 192.168.1.102:6379 --cluster-replicas 1

其中,--cluster-replicas 1 表示为每个主节点创建 1 个从节点。

优点

  • 水平扩展:可以通过添加节点来扩展系统的存储容量和处理能力,适用于大规模数据存储和高并发访问的场景。
  • 高可用性:每个主节点都有对应的从节点,当主节点发生故障时,从节点会自动晋升为主节点,保证系统的正常运行。
  • 自动分片:Redis Cluster 会自动将数据分配到不同的节点上,开发者无需关心数据的存储位置。
缺点

  • 配置和管理复杂:Redis Cluster 的配置和管理相对复杂,需要对 Redis 有较深入的了解。
  • 客户端实现复杂:客户端需要实现 Redis Cluster 的路由算法,才能正确地将请求发送到对应的节点上。

三、Redis的持久化机制

Redis 是基于内存的数据库,为了防止数据因服务器故障、重启等意外情况丢失,提供了两种主要的持久化机制:RDB(Redis Database)和 AOF(Append - Only File),以下为你详细介绍这两种机制。

RDB(Redis Database)

概念

RDB 持久化是将 Redis 在某个时间点上的内存数据快照保存到磁盘文件的过程。这个文件是一个经过压缩的二进制文件,通过它可以在 Redis 重启时将数据恢复到内存中。

触发方式

  • 手动触发:使用 SAVE 或 BGSAVE 命令。SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完成,在此期间,服务器不能处理其他客户端的请求;BGSAVE 命令会派生出一个子进程来创建 RDB 文件,主进程可以继续处理客户端请求,不会被阻塞。
# 手动执行 BGSAVE 命令
redis-cli BGSAVE

  • 自动触发:可以通过配置 Redis 的 save 参数来实现自动触发。例如,在 Redis 配置文件中设置 save 900 1 表示在 900 秒(15 分钟)内,如果至少有 1 个键被修改,Redis 就会自动触发 BGSAVE 操作。
优点

  • 适合备份和灾难恢复:RDB 文件是一个紧凑的二进制文件,占用空间小,便于传输和存储,可以定期将 RDB 文件备份到其他存储设备上,用于灾难恢复。
  • 性能较高:在恢复数据时,加载 RDB 文件的速度比 AOF 文件快,因为 RDB 文件只需要一次性将数据加载到内存中,而不需要像 AOF 那样重新执行一系列的写命令。
  • 对 Redis 性能影响小:使用 BGSAVE 时,主进程不会被阻塞,可以继续处理客户端请求,对 Redis 的正常运行影响较小。
缺点

  • 数据安全性较低:由于 RDB 是定期生成快照,在两次快照之间如果发生服务器故障,这段时间内的数据可能会丢失。例如,如果设置的快照间隔是 5 分钟,在这 5 分钟内服务器崩溃,那么这 5 分钟内的数据将无法恢复。
  • 创建快照时可能会消耗较多资源:在创建 RDB 文件时,子进程需要复制主进程的内存数据,对于内存较大的 Redis 实例,这个过程可能会消耗较多的 CPU 和内存资源。

AOF(Append - Only File)

概念

AOF 持久化是将 Redis 执行的所有写命令以日志的形式追加到文件末尾。当 Redis 重启时,会重新执行这些写命令,将数据恢复到内存中。

触发方式

  • 根据配置策略追加:AOF 持久化的触发是由配置的 appendfsync 参数决定的,有三种策略。
    • always:每次执行写命令后都将缓冲区中的数据同步到磁盘,数据安全性最高,但会影响 Redis 的性能,因为频繁的磁盘 I/O 操作会增加响应时间。
    • everysec:每秒将缓冲区中的数据同步到磁盘,这是默认的配置,在数据安全性和性能之间取得了较好的平衡。即使在发生故障时,最多只会丢失 1 秒钟内的数据。
    • no:由操作系统决定何时将缓冲区中的数据同步到磁盘,Redis 只负责将写命令追加到缓冲区。这种策略性能最高,但数据安全性最低,因为在发生故障时可能会丢失较多的数据。
优点

  • 数据安全性高:由于 AOF 记录了所有的写命令,并且可以根据配置策略及时将数据同步到磁盘,因此在发生故障时,数据丢失的可能性较小。
  • 可读性好:AOF 文件是一个文本文件,内容是 Redis 的写命令,方便进行查看和分析。可以通过编辑 AOF 文件来修复一些数据问题。
缺点

  • 文件体积大:随着时间的推移,AOF 文件会不断增大,因为它记录了所有的写命令。这会占用更多的磁盘空间,并且在恢复数据时,重新执行这些命令的时间也会更长。
  • 性能相对较低:特别是在使用 always 同步策略时,频繁的磁盘 I/O 操作会影响 Redis 的性能。即使使用 everysec 策略,也会有一定的性能开销。

混合持久化(RDB + AOF)

从 Redis 4.0 开始,支持混合持久化模式。在这种模式下,Redis 会在 AOF 重写时,将重写这一刻之前的内存数据以 RDB 的形式写入 AOF 文件,之后的写命令仍然以 AOF 的格式追加到文件末尾。这样既保证了数据的安全性,又能提高数据恢复的速度。可以通过配置 aof - use - rdb - preamble yes 来开启混合持久化。

四、Redis的性能测试方法

对 Redis 进行性能测试有助于了解其在不同工作负载下的表现,发现潜在的性能瓶颈,为系统的优化和调优提供依据。以下是一些常见的 Redis 性能测试方法:

使用 Redis 自带的基准测试工具 redis - bench - mark

  • 原理redis - benchmark 是 Redis 自带的一个命令行工具,它可以模拟多个客户端同时向 Redis 服务器发送请求,通过统计请求的响应时间、吞吐量等指标来评估 Redis 的性能。
  • 使用示例
    • 基本测试:执行 redis - benchmark 命令会进行一个简单的基准测试,它默认会使用 50 个客户端,每个客户端发送 10000 个请求,对 Redis 的多种命令进行测试,并输出测试结果。
      
    redis - benchmark
    
     
    • 指定测试参数:可以通过参数指定客户端数量、请求数量、测试的命令等。例如,使用 100 个客户端,每个客户端发送 20000 个 SET 和 GET 命令进行测试:
      
    redis - benchmark -c 100 -n 20000 -t set,get
    
  • 结果分析:测试结果会显示每个命令的执行时间、吞吐量(每秒处理的请求数)、响应时间的分布等信息。例如,吞吐量越高,说明 Redis 在当前负载下处理请求的能力越强;响应时间越短,说明 Redis 的响应速度越快。

使用自定义脚本进行性能测试

  • 原理:根据具体的业务场景和需求,使用编程语言(如 Python、Java 等)编写自定义的性能测试脚本。脚本可以模拟不同的请求模式、数据量和并发情况,对 Redis 进行更有针对性的测试。
  • Python 示例
import redis
import time
import threading# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0)# 定义测试函数
def test_redis():start_time = time.time()for i in range(1000):r.set(f'key{i}', 'value')r.get(f'key{i}')end_time = time.time()print(f'Time taken: {end_time - start_time} seconds')# 模拟并发测试
threads = []
for _ in range(10):t = threading.Thread(target=test_redis)threads.append(t)t.start()for t in threads:t.join()

  • 结果分析:通过记录脚本的执行时间,可以计算出在特定并发情况下 Redis 处理请求的速度。可以多次运行脚本,取平均值来得到更准确的结果。

使用专业的性能测试工具

  • Apache JMeter
    • 原理:JMeter 是一个功能强大的开源性能测试工具,它可以模拟大量的并发用户向 Redis 服务器发送请求,并收集和分析性能数据。可以通过配置 JMeter 的线程组、采样器等组件来设置测试的参数和场景。
    • 使用步骤
      1. 安装 JMeter 并启动。
      2. 创建一个新的测试计划,添加线程组,设置线程数、循环次数等参数。
      3. 添加 Redis 采样器(可以通过插件实现),配置 Redis 服务器的连接信息和要执行的命令。
      4. 运行测试计划,查看测试结果,包括响应时间、吞吐量、错误率等指标。
  • Gatling
    • 原理:Gatling 是一个基于 Scala 编写的高性能负载测试工具,它具有简洁的 DSL(领域特定语言),可以方便地编写测试脚本。Gatling 可以模拟高并发的用户请求,对 Redis 进行性能测试。
    • 使用步骤
      1. 安装 Gatling 并配置环境。
      2. 使用 Scala 编写测试脚本,定义请求的类型、数据和并发模式。
      3. 运行测试脚本,Gatling 会生成详细的测试报告,包含各种性能指标和图表。

监控 Redis 服务器指标

  • 原理:在性能测试过程中,通过监控 Redis 服务器的各种指标,如内存使用情况、CPU 使用率、网络带宽等,可以了解服务器的资源消耗情况,找出可能影响性能的因素。
  • 监控工具
    • Redis 自带命令:使用 INFO 命令可以获取 Redis 服务器的各种信息,包括内存使用、连接数、命令执行统计等。例如,执行 redis - cli INFO 可以查看详细的服务器信息。
    • 第三方监控工具:如 Prometheus 和 Grafana 的组合。Prometheus 可以定期从 Redis 服务器收集指标数据,Grafana 则可以将这些数据可视化,以图表和报表的形式展示,方便进行分析和监控。

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

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

相关文章

LabVIEW的吞雨测控系统

本案例介绍了一种基于LabVIEW开发的吞雨测控系统&#xff0c;该系统通过建模仿真分析不同控制器模式下的阶跃信号响应&#xff0c;从而选择了最适合的控制器。为了有效解决在控制流量过程中出现的振荡收敛和流量信号大扰动问题&#xff0c;系统采用了改进的积分分离PID算法&…

C++中的顺序容器(一)

文章目录 顺序容器概述所有容器类型都支持的操作迭代器容器定义与初始化将一个容器初始化为另一个容器的拷贝标准库array具有固定大小 赋值和swap关系运算符 顺序容器的特有操作向顺序容器添加元素访问元素删除元素特殊的forward_list操作改变容器的大小容器操作可能是迭代器失…

Javaweb中,使用Servlet编写简单的接口

案例&#xff1a;网页提交用户名和密码信息&#xff0c;后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…

C语言实现的常见排序算法

排序是计算机科学中非常重要的基础算法之一。无论是在数据分析、数据库查询还是图形界面中&#xff0c;我们都可能会遇到排序问题。本文将介绍几种常见的排序算法&#xff0c;并提供其C语言实现代码。排序算法的效率和应用场景有很大关系&#xff0c;不同的算法有不同的时间复杂…

对于简单的HTML、CSS、JavaScript前端,我们可以通过几种方式连接后端

1. 使用Fetch API发送HTTP请求&#xff08;最简单的方式&#xff09;&#xff1a; //home.html // 示例&#xff1a;提交表单数据到后端 const submitForm async (formData) > {try {const response await fetch(http://your-backend-url/api/submit, {method: POST,head…

[论文阅读] SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution

文章目录 一、前言二、主要贡献三、Introduction四、Methodology4.1 Motivation &#xff1a;4.2Framework Overview.** 一、前言 通信作者是香港理工大学 & OPPO研究所的张磊教授&#xff0c;也是图像超分ISR的一个大牛了。 论文如下 SeeSR: Towards Semantics-Aware Rea…

案例-04.部门管理-删除

一.功能演示 二.需求说明 三.接口文档 四.思路 既然是通过id删除对应的部门&#xff0c;那么必然要获取到前端请求的要删除部门的id。id作为请求路径传递过来&#xff0c;那么要从请求路径中获取&#xff0c;id是一个路径参数。因此使用注解PathVariable获取路径参数。 请求方…

Blazor-父子组件传递任意参数

在我们从父组件传参数给子组件时&#xff0c;可以通过子组件定义的[Parameter]特性的公开属性进行传值&#xff0c;但是当我们需要传递多个值的时候&#xff0c;就需要通过[Parameter]特性定义多个属性&#xff0c;有没有更简便的方式&#xff1f; 我们可以使用定义 IDictionar…

DeepSeek 的创新融合:多行业应用实践探索

引言 在数字化转型的浪潮中&#xff0c;技术的融合与创新成为推动各行业发展的关键力量。蓝耘平台作为行业内备受瞩目的创新平台&#xff0c;以其强大的资源整合能力和灵活的架构&#xff0c;为企业提供了高效的服务支持。而 DeepSeek 凭借先进的人工智能技术&#xff0c;在自然…

STM32创建静态库lib

创建静态库lib 1. 新建工程1.1 创建工程文件夹1.2 编写用户相关代码1.2.1 stm32f4xx_it.h1.2.2 stm32f4xx_it.c1.2.3 标准库配置&#xff1a;stm32f4xx_conf.h1.2.4 HAL库的配置&#xff1a;stm32f4xx_hal_conf.h1.2.5 LL库配置&#xff1a;stm32f4xx_ll_conf.h 1.3 移植通用文…

elabradio入门第二讲——BPSK数字调制与解调(插值、升余弦滤波、速率匹配、符号同步)

数字信号可以通过数字基带传输系统进行传输&#xff0c;而基带传输系统仅仅适用于低频信道下的数字信号传输。然而&#xff0c;在实际的通信系统中信道通常具有带通特性&#xff0c;因而需要将基带信号搬移到适合信道传输的高频载波上&#xff0c;使得信号与信道相匹配&#xf…

汽车 OTA 升级:提升下载与升级速度,优化用户体验

摘要&#xff1a; 随着汽车智能化的飞速发展&#xff0c;OTA&#xff08;Over - the - Air&#xff09;升级已成为汽车行业的重要技术&#xff0c;它能为车辆持续带来功能更新与性能优化。然而&#xff0c;下载及升级速度较慢的问题常常影响用户体验。本文深入探讨在汽车 OTA …

【Spring+MyBatis】留言墙的实现

目录 1. 添加依赖 2. 配置数据库 2.1 创建数据库与数据表 2.2 创建与数据库对应的实体类 3. 后端代码 3.1 目录结构 3.2 MessageController类 3.3 MessageService类 3.4 MessageMapper接口 4. 前端代码 5. 单元测试 5.1 后端接口测试 5.2 使用前端页面测试 在Spri…

SQLite Select 语句详解

SQLite Select 语句详解 SQLite 是一个轻量级的数据库管理系统&#xff0c;以其简洁的设计和高效的性能被广泛应用于各种场景。在 SQLite 中&#xff0c;SELECT 语句是用于查询数据库中的数据的命令。本文将详细介绍 SQLite 的 SELECT 语句&#xff0c;包括其基本语法、常用功…

深度学习05 ResNet残差网络

目录 传统卷积神经网络存在的问题 如何解决 批量归一化BatchNormalization, BN 残差连接方式 ​残差结构 ResNet网络 ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出&#xff0c;斩获当年ImageNet竞赛中分类任务第一名&#xff0c;目标检测第一名。获得CO…

组件库地址

react&#xff1a; https://react-vant.3lang.dev/components/dialoghttps://react-vant.3lang.dev/components/dialog vue用v2的 Vant 2 - Mobile UI Components built on Vue

docker 进阶命令(基于Ubuntu)

数据卷 Volume: 目录映射, 目录挂载 匿名绑定: 匿名绑定的 volume 在容器删除的时候, 数据卷也会被删除, 匿名绑定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 绑定卷时修改宿主机的目录或文件, 容器内的数据也会同步修改, 反之亦然 # 查看所有 vo…

从入门到精通:Postman 实用指南

Postman 是一款超棒的 API 开发工具&#xff0c;能用来测试、调试和管理 API&#xff0c;大大提升开发效率。下面就给大家详细讲讲它的安装、使用方法&#xff0c;再分享些实用技巧。 一、安装 Postman 你能在 Postman 官网&#xff08;https://www.postman.com &#xff09;下…

将图片base64编码后,数据转成图片

将图片数据进行base64编码后&#xff0c;可以在浏览器上查看图片&#xff0c;只需在前端加上data:image/png;base64,即可 在线工具&#xff1a; Base64转图片 - 加菲工具

【动态规划】详解 0-1背包问题

文章目录 1. 问题引入2. 从 dfs 到动态规划3. 动态规划过程分析4. 二维 dp 的遍历顺序5. 从二维数组到一维数组6. 一维数组的遍历次序7. 背包的遍历顺序8. 代码总结9. 总结 1. 问题引入 0-1 背包是比较经典的动态规划问题&#xff0c;这里以代码随想录里面的例子来介绍下。总的…