当前位置: 首页 > news >正文

Redis 实现分布式缓存

一、引言

在当今互联网时代,随着业务的不断发展和用户量的持续增长,系统的性能和可扩展性成为了关键挑战。分布式缓存作为一种重要的技术手段,能够有效地缓解数据库压力、提高系统响应速度、增强系统的可扩展性。Redis 作为一种高性能的内存数据库,具有丰富的数据结构、快速的读写速度、强大的分布式功能等特点,被广泛应用于分布式缓存领域。本文将详细介绍如何使用 Redis 实现分布式缓存,帮助读者深入理解 Redis 在分布式缓存中的应用价值和实现方法。

二、Redis 的基本特性和优势

(一)Redis 的基本特性

  1. 数据结构丰富
    • Redis 支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。这些数据结构可以满足不同的应用场景需求,为分布式缓存提供了灵活的数据存储方式。
  2. 内存存储
    • Redis 将数据存储在内存中,具有非常高的读写速度,可以快速响应应用程序的请求。相比传统的磁盘存储,内存存储可以大大减少数据的访问时间,提高系统的性能。
  3. 持久化机制
    • Redis 提供了两种持久化机制,即 RDB(Redis Database Backup)和 AOF(Append Only File)。RDB 是一种快照方式的持久化,可以将 Redis 数据库在某个时间点的数据保存到磁盘上。AOF 是一种日志方式的持久化,可以将 Redis 执行的所有写命令记录到磁盘上,以便在 Redis 重启时可以重新执行这些写命令,恢复数据。
  4. 分布式功能
    • Redis 支持主从复制和哨兵模式,可以实现高可用的分布式部署。主从复制可以将数据同步到多个从节点上,当主节点出现故障时,可以自动切换到从节点上,保证系统的可用性。哨兵模式可以自动监控主从节点的状态,当主节点出现故障时,自动进行故障转移。

(二)Redis 的优势

  1. 高性能
    • 由于 Redis 将数据存储在内存中,并且采用了高效的数据结构和算法,因此具有非常高的读写速度。在分布式缓存中,Redis 可以快速响应应用程序的请求,减少数据库的访问压力,提高系统的性能。
  2. 可扩展性
    • Redis 支持主从复制和集群模式,可以轻松地进行水平扩展。当系统的负载增加时,可以通过添加更多的 Redis 节点来提高系统的处理能力,满足不断增长的业务需求。
  3. 丰富的数据结构
    • Redis 提供了多种数据结构,可以满足不同的应用场景需求。在分布式缓存中,可以根据实际情况选择合适的数据结构来存储数据,提高缓存的效率和灵活性。
  4. 高可用性
    • Redis 支持主从复制和哨兵模式,可以实现高可用的分布式部署。当主节点出现故障时,可以自动切换到从节点上,保证系统的可用性。此外,Redis 还支持数据持久化,可以将数据保存到磁盘上,防止数据丢失。

三、Redis 在分布式缓存中的应用场景

(一)Web 应用缓存

  1. 页面缓存
    • 在 Web 应用中,可以将经常访问的页面内容存储在 Redis 中,以提高页面的加载速度。当用户请求一个页面时,首先从 Redis 中获取页面内容,如果 Redis 中存在该页面,则直接返回缓存中的内容,否则从后端服务器获取页面内容,并将其存储到 Redis 中,以便下次访问时能够快速获取。
  2. 数据缓存
    • 在 Web 应用中,可以将频繁访问的数据存储在 Redis 中,以减少对数据库的访问次数,提高系统的性能。例如,在一个电商系统中,可以将商品的基本信息、用户的购物车信息等存储在 Redis 中,以提高系统的响应速度。

(二)移动应用缓存

  1. 数据缓存
    • 在移动应用中,可以将频繁访问的数据存储在 Redis 中,以减少对服务器的访问次数,提高应用的响应速度。例如,在一个新闻类移动应用中,可以将热门新闻、用户的阅读历史等存储在 Redis 中,以提高应用的响应速度。
  2. 离线缓存
    • 在移动应用中,可以将一些数据存储在本地缓存中,以便在离线状态下也能够访问这些数据。例如,在一个地图类移动应用中,可以将地图数据存储在本地缓存中,以便在离线状态下也能够查看地图。

(三)大数据处理缓存

  1. 中间结果缓存
    • 在大数据处理中,可以将一些中间结果存储在 Redis 中,以减少重复计算,提高处理效率。例如,在一个数据分析系统中,可以将一些中间计算结果存储在 Redis 中,以便在后续的分析中能够快速获取这些结果,减少重复计算。
  2. 数据共享
    • 在大数据处理中,可以将一些数据存储在 Redis 中,以便多个节点之间能够共享这些数据。例如,在一个分布式计算系统中,可以将一些公共数据存储在 Redis 中,以便多个计算节点之间能够共享这些数据,提高计算效率。

四、Redis 分布式缓存的架构设计

(一)Redis 主从复制架构

  1. 架构原理
    • Redis 主从复制是一种数据同步机制,它可以将一个 Redis 服务器的数据同步到多个从服务器上。主服务器负责接收写请求,并将数据同步到从服务器上。从服务器只负责接收读请求,不接收写请求。当主服务器出现故障时,可以自动切换到从服务器上,保证系统的可用性。
  2. 配置方法
    • 在 Redis 中,可以通过配置文件或命令行参数来配置主从复制。首先,需要在主服务器的配置文件中设置slaveof参数,指定从服务器的 IP 地址和端口号。然后,在从服务器的配置文件中设置masterauth参数,指定主服务器的密码(如果主服务器设置了密码)。最后,启动主服务器和从服务器,主服务器会自动将数据同步到从服务器上。
  3. 应用场景
    • Redis 主从复制架构适用于读多写少的应用场景。在这种场景下,可以将读请求分配到多个从服务器上,提高系统的读性能。同时,主服务器负责接收写请求,并将数据同步到从服务器上,保证数据的一致性。

(二)Redis 哨兵模式架构

  1. 架构原理
    • Redis 哨兵模式是一种高可用架构,它可以自动监控 Redis 主从服务器的状态,并在主服务器出现故障时自动进行故障转移。哨兵模式由多个哨兵节点组成,这些哨兵节点会定期向主从服务器发送心跳检测请求,以确定主从服务器的状态。当主服务器出现故障时,哨兵节点会自动选举出一个新的主服务器,并将从服务器切换到新的主服务器上。
  2. 配置方法
    • 在 Redis 中,可以通过配置文件或命令行参数来配置哨兵模式。首先,需要在每个哨兵节点的配置文件中设置sentinel monitor参数,指定要监控的主服务器的 IP 地址和端口号。然后,启动每个哨兵节点,哨兵节点会自动发现其他哨兵节点,并组成一个哨兵集群。最后,当主服务器出现故障时,哨兵集群会自动进行故障转移,选举出一个新的主服务器,并将从服务器切换到新的主服务器上。
  3. 应用场景
    • Redis 哨兵模式架构适用于对系统可用性要求较高的应用场景。在这种场景下,哨兵模式可以自动监控主从服务器的状态,并在主服务器出现故障时自动进行故障转移,保证系统的高可用性。

(三)Redis 集群模式架构

  1. 架构原理
    • Redis 集群是一种分布式架构,它可以将数据分散存储在多个 Redis 节点上,实现数据的分布式存储和读写。Redis 集群由多个节点组成,每个节点负责存储一部分数据。当客户端向 Redis 集群发送请求时,Redis 集群会根据请求的键值,自动将请求转发到相应的节点上进行处理。
  2. 配置方法
    • 在 Redis 中,可以通过配置文件或命令行参数来配置 Redis 集群。首先,需要在每个节点的配置文件中设置cluster-enabled参数,开启集群模式。然后,使用 Redis 提供的redis-cli工具,执行cluster create命令,创建 Redis 集群。在创建集群时,需要指定每个节点的 IP 地址和端口号,并将这些节点组成一个集群。最后,启动每个节点,Redis 集群会自动进行数据分配和节点间的通信。
  3. 应用场景
    • Redis 集群模式架构适用于数据量较大、读写请求较高的应用场景。在这种场景下,Redis 集群可以将数据分散存储在多个节点上,实现数据的分布式存储和读写,提高系统的性能和可扩展性。

五、Redis 分布式缓存的数据存储策略

(一)键值对存储

  1. 存储方式
    • Redis 采用键值对的方式存储数据,其中键是一个字符串,值可以是字符串、哈希表、列表、集合、有序集合等数据结构。在分布式缓存中,可以根据实际情况选择合适的数据结构来存储数据。
  2. 键的设计
    • 在设计键时,需要考虑键的唯一性、可读性和可维护性。键应该具有唯一性,以便能够准确地标识一个数据项。同时,键应该具有可读性,以便能够方便地理解键所代表的含义。此外,键应该具有可维护性,以便能够方便地进行修改和扩展。
  3. 值的类型选择
    • 在选择值的类型时,需要考虑数据的特点和应用场景需求。如果数据是一个简单的字符串,可以选择字符串类型来存储。如果数据是一个对象,可以选择哈希表类型来存储。如果数据是一个列表,可以选择列表类型来存储。如果数据是一个集合,可以选择集合类型来存储。如果数据是一个有序集合,可以选择有序集合类型来存储。

(二)数据过期策略

  1. 过期时间设置
    • Redis 可以为每个键设置一个过期时间,当键的过期时间到达时,Redis 会自动删除该键。在分布式缓存中,可以根据数据的特点和应用场景需求,为不同的键设置不同的过期时间。例如,对于一些临时数据,可以设置较短的过期时间;对于一些长期有效的数据,可以设置较长的过期时间。
  2. 过期时间的管理
    • Redis 提供了多种方式来管理键的过期时间,如EXPIREPEXPIREEXPIREATPEXPIREAT等命令。这些命令可以分别设置键的秒级过期时间、毫秒级过期时间、绝对时间过期时间等。在使用这些命令时,需要注意过期时间的精度和单位,以免出现过期时间不准确的情况。
  3. 过期数据的处理
    - 当键的过期时间到达时,Redis 会自动删除该键。在分布式缓存中,可以根据实际情况选择不同的处理方式来处理过期数据。例如,可以在键过期时,将过期数据从缓存中删除,并从后端数据库中重新加载数据;也可以在键过期时,将过期数据标记为无效,并在下次访问时从后端数据库中重新加载数据。

(三)数据淘汰策略

  1. 淘汰策略的选择
    • Redis 提供了多种数据淘汰策略,如volatile-lruallkeys-lruvolatile-randomallkeys-randomvolatile-ttlnoeviction等。这些淘汰策略可以根据不同的应用场景需求,选择不同的淘汰策略来处理缓存中的数据。例如,对于一些内存资源有限的应用场景,可以选择volatile-lruallkeys-lru策略,淘汰最近最少使用的数据;对于一些需要随机淘汰数据的应用场景,可以选择volatile-randomallkeys-random策略;对于一些需要根据数据的过期时间来淘汰数据的应用场景,可以选择volatile-ttl策略。
  2. 淘汰策略的配置
    • 在 Redis 中,可以通过配置文件或命令行参数来配置数据淘汰策略。例如,可以在配置文件中设置maxmemory-policy参数,指定数据淘汰策略。在选择数据淘汰策略时,需要考虑系统的内存资源、数据的访问模式、数据的重要性等因素,以选择最合适的淘汰策略。

六、Redis 分布式缓存的性能优化

(一)缓存命中率优化

  1. 数据预热
    • 在系统启动时,可以将一些热点数据预先加载到 Redis 中,以提高缓存的命中率。可以通过分析历史数据、用户行为等方式,确定热点数据,并将其加载到 Redis 中。
  2. 缓存更新策略优化
    • 合理设置缓存的更新策略,避免频繁更新缓存,以提高缓存的命中率。可以采用异步更新、批量更新等方式,减少对缓存的更新次数,提高缓存的命中率。
  3. 缓存失效策略优化
    • 合理设置缓存的失效策略,避免缓存同时失效,以提高缓存的命中率。可以采用随机失效、分段失效等方式,避免缓存同时失效,提高缓存的命中率。

(二)缓存读写性能优化

  1. 缓存读写分离
    • 可以将 Redis 的读操作和写操作分离,以提高缓存的读写性能。可以采用主从复制架构,将读操作分配到多个从服务器上,提高系统的读性能。同时,将写操作分配到主服务器上,保证数据的一致性。
  2. 缓存批量操作
    • 可以将多个缓存操作合并为一个批量操作,以提高缓存的读写性能。例如,可以将多个SET操作合并为一个MSET操作,将多个GET操作合并为一个MGET操作。这样可以减少网络开销和 Redis 的处理时间,提高缓存的读写性能。
  3. 缓存异步操作
    • 可以将缓存的操作异步化,以提高缓存的读写性能。例如,可以使用 Redis 的发布 / 订阅功能,将缓存的写操作异步化。当有数据需要写入缓存时,先将数据写入消息队列,然后由后台线程从消息队列中读取数据,并写入缓存。这样可以避免写操作对读操作的影响,提高缓存的读写性能。

(三)内存优化

  1. 数据压缩
    • 可以对 Redis 中的数据进行压缩,以减少内存的占用。Redis 支持多种数据压缩算法,如 LZF、Snappy 等。可以根据实际情况选择合适的数据压缩算法,对 Redis 中的数据进行压缩,以减少内存的占用。
  2. 内存淘汰策略优化
    • 合理设置 Redis 的内存淘汰策略,以避免内存溢出。可以根据系统的实际情况,选择合适的内存淘汰策略,如volatile-lruallkeys-lruvolatile-randomallkeys-randomvolatile-ttlnoeviction等。在选择内存淘汰策略时,需要考虑系统的内存资源、数据的访问模式、数据的重要性等因素,以选择最合适的淘汰策略。
  3. 内存碎片整理
    • Redis 在运行过程中,可能会产生内存碎片,导致内存利用率降低。可以定期对 Redis 的内存进行碎片整理,以提高内存的利用率。可以使用 Redis 的MEMORY PURGE命令或MEMORY USAGE命令,对 Redis 的内存进行碎片整理。

七、Redis 分布式缓存的安全与可靠性

(一)安全策略

  1. 访问控制
    • 可以对 Redis 的访问进行控制,限制只有授权的用户或应用程序才能访问 Redis。可以使用 Redis 的密码认证功能,设置访问密码,只有知道密码的用户或应用程序才能访问 Redis。此外,还可以使用网络访问控制列表(ACL),限制只有特定的 IP 地址或网络段才能访问 Redis。
  2. 数据加密
    • 可以对 Redis 中的数据进行加密,以防止数据泄露。可以使用 Redis 的加密模块,对 Redis 中的数据进行加密存储。此外,还可以使用 SSL/TLS 协议,对 Redis 的通信进行加密,防止数据在传输过程中被窃取。

(二)可靠性策略

  1. 数据备份
    • 可以定期对 Redis 中的数据进行备份,以防止数据丢失。可以使用 Redis 的 RDB 或 AOF 持久化机制,将 Redis 中的数据定期保存到磁盘上。此外,还可以使用第三方备份工具,如rdbtoolsredis-dump等,对 Redis 中的数据进行备份。
  2. 故障恢复
    • 当 Redis 出现故障时,可以快速恢复数据,保证系统的可用性。可以使用 Redis 的主从复制或哨兵模式,实现高可用部署。当主服务器出现故障时,可以自动切换到从服务器上,保证系统的可用性。此外,还可以使用 Redis 的集群模式,实现分布式部署,提高系统的可靠性和可扩展性。

八、实际案例分析

(一)电商系统中的 Redis 分布式缓存应用

  1. 场景描述
    • 在电商系统中,商品信息、用户购物车、订单状态等数据需要频繁访问。使用 Redis 分布式缓存可以大大提高系统的响应速度,减轻数据库的压力。
  2. 架构设计
    • 采用 Redis 主从复制架构,将 Redis 服务器部署在多个节点上,实现高可用部署。主服务器负责接收写请求,并将数据同步到从服务器上。从服务器只负责接收读请求,不接收写请求。当主服务器出现故障时,可以自动切换到从服务器上,保证系统的可用性。
  3. 数据存储策略

    • 使用键值对存储方式,将商品信息、用户购物车、订单状态等数据存储在 Redis 中。根据数据的特点和应用场景需求,选择合适的数据结构。例如,对于商品信息,可以使用哈希表类型存储,方便快速查询商品的各个属性;对于用户购物车,可以使用列表类型存储,记录用户添加的商品列表。
    • 设置合理的过期时间,对于一些临时数据,如购物车中的未结算商品,可以设置较短的过期时间,避免占用过多内存。对于商品信息等相对稳定的数据,可以设置较长的过期时间或者不设置过期时间,根据实际情况进行更新。
    • 选择合适的数据淘汰策略,当内存不足时,优先淘汰最近最少使用的数据或者根据数据的过期时间进行淘汰。
  4. 性能优化

    • 进行数据预热,在系统启动时,将热门商品信息、常用的用户购物车模板等数据预先加载到 Redis 中,提高缓存命中率。
    • 采用缓存读写分离,将读请求分配到多个从服务器上,提高读性能。同时,写请求发送到主服务器,保证数据的一致性。
    • 对于批量的商品查询操作,可以使用 Redis 的批量操作命令,如MGET,减少网络开销和 Redis 的处理时间。
    • 定期清理过期数据和无用数据,释放内存空间,提高缓存的利用率。
  5. 安全与可靠性措施

    • 设置 Redis 的访问密码,限制只有授权的应用程序可以访问 Redis 服务器。
    • 对 Redis 服务器进行定期备份,使用 RDB 或 AOF 持久化机制,将数据保存到磁盘上,以便在出现故障时进行恢复。
    • 监控 Redis 服务器的运行状态,包括内存使用情况、连接数、命令执行时间等指标,及时发现潜在的问题并进行处理。

  6. 场景描述

    • 在社交网络系统中,用户动态、好友列表、消息通知等数据需要快速访问。Redis 分布式缓存可以提高系统的性能,提升用户体验。
  7. 架构设计

    • 采用 Redis 集群模式架构,将数据分散存储在多个 Redis 节点上,实现高可扩展性和高可用性。通过哈希算法将数据均匀地分布在各个节点上,当系统负载增加时,可以方便地添加更多的节点。
    • 使用哨兵模式对 Redis 集群进行监控,当主节点出现故障时,自动进行故障转移,保证系统的稳定性。
  8. 数据存储策略

    • 对于用户动态,可以使用列表类型存储,按照时间顺序记录用户的发布内容。对于好友列表,可以使用集合类型存储,方便快速查询用户的好友关系。对于消息通知,可以使用有序集合类型存储,根据通知的时间戳进行排序。
    • 根据数据的访问频率和重要性设置不同的过期时间。例如,对于热门用户的动态,可以设置较短的过期时间,以保证数据的实时性;对于好友关系等相对稳定的数据,可以设置较长的过期时间。
    • 选择合适的数据淘汰策略,当内存不足时,优先淘汰访问频率较低的数据或者根据数据的过期时间进行淘汰。
  9. 性能优化

    • 对热门用户的动态进行数据预热,在系统启动时或者用户访问量较大时,将热门用户的动态预先加载到 Redis 中,提高缓存命中率。
    • 利用 Redis 的发布 / 订阅功能,实现消息通知的实时推送。当有新的消息通知时,将其发布到相应的频道,订阅了该频道的客户端可以及时收到通知。
    • 对于大规模的好友查询操作,可以采用分页查询的方式,避免一次性查询过多数据导致性能下降。
    • 定期对 Redis 集群进行性能测试和优化,调整参数,如内存分配、连接数限制等,以提高系统的性能。
  10. 安全与可靠性措施

    • 使用网络访问控制列表(ACL)限制对 Redis 集群的访问,只允许特定的 IP 地址或网络段进行访问。
    • 对 Redis 集群进行定期备份,将数据保存到多个备份节点上,以防止数据丢失。同时,建立备份恢复机制,确保在出现故障时能够快速恢复数据。
    • 监控 Redis 集群的运行状态,包括节点的健康状况、数据的一致性等指标。当发现节点故障或数据不一致时,及时进行处理,保证系统的可靠性。

相关文章:

Redis 实现分布式缓存

一、引言 在当今互联网时代,随着业务的不断发展和用户量的持续增长,系统的性能和可扩展性成为了关键挑战。分布式缓存作为一种重要的技术手段,能够有效地缓解数据库压力、提高系统响应速度、增强系统的可扩展性。Redis 作为一种高性能的内存数…...

Chrome与火狐哪个浏览器的移动版本更流畅

在当今的数字化时代,移动设备已经成为我们生活中不可或缺的一部分。而浏览器作为我们访问互联网的重要工具,其性能和用户体验直接影响到我们的使用感受。本文将对比Chrome和火狐(Firefox)两款主流浏览器的移动版本,探讨…...

7篇Python爬虫实例,直接代码可运行,全网最全,注释超详细(适合收藏)——2、爬取图片信息。

7篇Python爬虫实例,可直接运行,适合收藏 python爬虫7篇实例,分七个文章进行发布;第二篇:爬取图片信息。 爬取图片信息,并将每张图片都下载下来。 爬虫主要三部分: 1、获取数据 2、数据解析 3、…...

25.停车场管理系统(基于web的Java项目)

目录 1.系统的受众说明 2.相关技术与方法 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 需求分析 3.2.1 系统功能描述 3.2.2 用例图分析 4. 系统设计 4.1 系统类分析 5. 系统详细设计与实现 5.1 用户登录 5.2 系统信…...

展览搭建公司怎么跟展会主办打好交道

与展会主办打好交道的重要性 首先,我们得明白,展览搭建公司为何要跟展会主办打交道。简单地说,展会主办拥有大量的参展商信息。这些参展商是展览搭建公司潜在的客户群体,与主办打好交道,就等于拿到了通向这些客户的 “…...

软件开发方法

软件开发方法是一种用于指导软件开发过程的系统性方法,它涵盖了从需求分析、设计、编码、测试到维护的整个软件生命周期。软件开发方法通常包括一系列的步骤、技术和工具,以确保软件的质量、可维护性和可扩展性。 常见的软件开发方法有瀑布模型、敏捷开发、螺旋模型等。这些…...

「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目

本篇将带领你实现一个互动性十足的灯光控制小项目,用户可以通过点击按钮来控制灯光的开关。该项目将涉及状态管理、动态图片加载以及按钮交互,是学习鸿蒙应用开发的重要基础。 关键词 UI互动应用状态管理动态图片加载用户交互 一、功能说明 在这个灯光…...

十二:java web(4)-- Spring核心基础

目录 创建项目 Spring 核心基础 Spring 容器 Spring 容器的作用 Spring 容器的工作流程 Bean Bean 的生命周期 IOC(控制反转)与依赖注入(DI) 控制反转的概念 依赖注入的几种方式(构造器注入、Setter 注入、接…...

new和malloc有什么区别,他们的用法是什么?malloc分配失败会导致什么问题

1) new和malloc的区别,和他们的用法 new 和 malloc 主要有以下区别: 一、性质和来源 new :是 C 的运算符,在操作时会调用构造函数进行对象的初始化。它是 C 语言层面的操作,能更好地与 C 的面向对象特性结合。 malloc …...

了解SQLExpress数据库

SQLExpress(Microsoft SQL Server Express)是由微软公司开发的一款免费且轻量级的数据库管理系统。以下是关于SQLExpress的详细解释: 一、定义与特点 定义: SQLExpress是Microsoft SQL Server的一个缩减版或基础版,旨在…...

geoserver创建一个根据属性显示不同形状的点样式

geoserver创建一个根据属性显示不同形状的点样式 三角形 -triangle 圆形 - circle 正方形 - square 星形 - star 十字形 - cross 菱形 -diamond 代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <StyledLayerDescriptor version"…...

中国遗传学会2024全国学术研讨会在长沙成功召开

2024年11月3日至6日&#xff0c;备受瞩目的中国遗传学会2024全国学术研讨会在长沙盛大召开&#xff0c;此次盛会由中国遗传学会携手湖南省遗传学会共同主办&#xff0c;中南大学与南华大学共同承办。大会以“遗传学&#xff1a;前沿与交叉”为主题&#xff0c;吸引了来自全国各…...

Android Studio 多工程公用module引用

在Android Studio中&#xff0c;如果有多个工程需要共享同一个module&#xff0c;你可以通过以下步骤来实现module的公用&#xff1a; 1.将你想共享的module移动到一个单独的目录&#xff0c;比如一个新建的"libraries"文件夹。 2.修改module的build.gradle文件&am…...

(实战)WebApi第9讲:EFCore性能优化(IQueryable延迟查询、取消跟踪机制)

一、例子是第8讲的四、6&#xff08;EFCore的静态化处理 &#xff09;&#xff1a;分析ToList() ToList()在下图绿色框内。 二、在没有最终取数据的时候&#xff0c;使用 IQueryable<T> 延迟执行查询 &#xff08;1&#xff09;在没有最终取数据的时候&#xff0c;不要使…...

Java实现pdf转图片

第一步 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.32</version> <!-- 请检查最新版本 --> </dependency> 第二步 package com.example.demo.file.pdf;import or…...

健身房管理新纪元:SpringBoot技术应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…...

Java之字符串分割转换List

Java之字符串分割转换List 字符串分割成数组然后转换成List有多种方式&#xff0c;以下是每种方式的示例&#xff0c;推荐Java8的新特性Stream。 使用Java8的新特性Stream API String str "aaa,bbb,ccc"; // 使用Arrays.stream() List<String> list1 …...

RabbitMQ如何保证发送的消息可靠(RabbitMQ的Confirm模式和2.Return模式)

RabbitMQ如何保证发送的消息可靠&#xff08;RabbitMQ的Confirm模式和2.Return模式&#xff09; 1、RabbitMQ消息Confirm模式&#xff08;保证从生产者到交换机的消息可靠&#xff09;1.1、Confirm模式简介1.2、具体代码实现1.2.1、application.yml 开启确认模式1.2.2、生产者方…...

适配器模式:类适配器与对象适配器

适配器模式是一种结构性设计模式&#xff0c;旨在将一个接口转换成客户端所期望的另一种接口。它通常用于解决由于接口不兼容而导致的类之间的通信问题。适配器模式主要有两种实现方式&#xff1a;类适配器和对象适配器。下面&#xff0c;我们将详细探讨这两种方式的优缺点及适…...

volatile原理

volatile原理 volatile的底层实现原理是内存屏障,Memory Barrier(Memory Fence) 对volatile变量的写指令后会加入写屏障 对volatile变量的读指令前会加入读屏障 如何保证可见性 写屏障保证在该屏障之前的,对共享变量的改动,都同步到主存当中 public void actor2(I_Resu…...

【AI神器】SD(Stable Diffusion)一键安装包

是否还在无法使用Stable Diffusion 而烦恼&#xff0c;今天就给大家带来sd的私有化部署&#xff0c;一键安装包 https://pan.quark.cn/s/c16aa752ac6a 当然对电脑配置略微有些要求&#xff1a; 首先&#xff0c;本地安装对电脑配置有一些基本要求&#xff0c; 本地电脑安装…...

lanqiaoOJ 1112:小王子双链表 ← STL list

【题目来源】https://www.lanqiao.cn/problems/1112/learning/【题目描述】 小王子有一天迷上了排队的游戏&#xff0c;桌子上有标号为 1-10 的 10 个玩具&#xff0c;现在小王子将他们排成一列&#xff0c;可小王子还是太小了&#xff0c;他不确定他到底想把那个玩具摆在哪里&…...

C#WPF之快速理解MVVM模式

MVVM是一种设计模式&#xff0c;特别适用于WPF等XAML-based的应用程序开发。MVVM模式主要包含三个部分&#xff1a;Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和ViewModel&#xff08;视图模型&#xff09;。 Model&#xff08;模型&#xff09;&a…...

微积分[1]|微积分的底层逻辑——解析几何、不等式与极限(含博主推荐的数理阅读教材共计21本书籍)

原创首发于CSDN&#xff0c;禁止转载&#xff0c;谢谢&#xff01; 文章目录 微积分的底层逻辑探究一篇网络文章《数学分析的核心——不等式》高中数学与大学数学的脱节&#xff5c;脱节的实质含义&#xff5c;高中与大学的衔接数理书籍推荐 我个人所认为的数学分析的根基更新时…...

1-磁盘建立空闲分区

学习目标&#xff1a; 掌握磁盘分区的基本知识和操作技能&#xff0c;能够独立创建和管理磁盘空闲分区&#xff0c;以优化存储空间和提高系统性能&#xff0c;为后续的系统安装和数据管理打下基础。 学习内容&#xff1a; 1 选择一个适合的磁盘分区软件。推荐DiskGenius、Par…...

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面&#xff0c;不会被记录和追踪。作为开发者&#xff0c;SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…...

InnoDB 存储引擎<五>undo log, redo log,以及双写缓冲区

目录 撤销⽇志 - Undo Log 双写缓冲区 - Doublewrite Buffer 重做⽇志 - Redo Log 本篇是继承自上篇InnoDB存储引擎的磁盘文件 上篇链接&#xff1a;InnoDB 存储引擎&#xff1c;四&#xff1e;磁盘文件一 撤销⽇志 - Undo Log 1.什么是撤销⽇志&#xff1f; 解答问题&a…...

Find My运动耳机|苹果Find My技术与耳机结合,智能防丢,全球定位

运动耳机是为运动时候佩带的耳机&#xff0c;而是一种区别于一般耳机的能稳定固定在佩戴部位的耳机&#xff0c;该种耳机不会因为身体运动而使耳机从耳朵里掉落&#xff0c;普遍带有防滴溅、轻便等特性&#xff0c;透气性能较好&#xff0c;属于开放式耳机。 在智能化加持下&…...

书生大模型实战营Linux+InternStudio 关卡任务

一、端口映射 使用以下命令进行端口映射 ssh -p {YOUR_PORT} rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno 命令解释&#xff1a; -p 37367&#xff1a;是指定 SSH 连接的端口为 37367。rootssh.intern-ai.org.cn&#xff1a;表示要以…...

研究实锤:别让大模型「想」太多,OpenAI o1准确率竟下降36.3%

思维链&#xff08;CoT&#xff09;已被证明可以在许多任务&#xff08;如多步骤推理&#xff09;上显著提升大模型的性能。然而&#xff0c;在哪些情况下&#xff0c;CoT 会系统性地降低大模型的性能&#xff0c;这仍然是一个有待进一步讨论的问题。 如今&#xff0c;来自普林…...