Django 缓存框架
动态网站的一个基本权衡是它们是动态的。每当用户请求页面时,Web 服务器进行各种计算,从数据库查询到模板渲染到业务逻辑,以创建您网站访问者看到的页面。从处理开销的角度来看,这比标准的从文件系统中读取文件的服务器安排要昂贵得多。
对于大多数 Web 应用程序,这种开销并不是什么大问题。大多数 Web 应用程序不像 washingtonpost.com
或 slashdot.org
那样大型,它们是小到中等规模的站点,流量一般。但对于中等到高流量的站点来说,尽量减少开销是非常重要的。
这就是缓存的用武之地。
缓存是指保存昂贵计算的结果,以便下次无需再次执行计算。以下是一些伪代码,说明了如何为动态生成的网页实现缓存:
given a URL, try finding that page in the cache
if the page is in the cache:return the cached page
else:generate the pagesave the generated page in the cache (for next time)return the generated page
Django 自带强大的缓存系统,可以让你保存动态页面,这样就不必为每次请求计算。为了方便,Django 提供了不同级别的缓存粒度。你可以缓存特定视图的输出,你可以只缓存难以生成的部分,或者你可以缓存整个网站。
Django 也与 "下游" 缓存很好地配合, 比如 Squid 和基于浏览器的缓存。这些是您不直接控制但可以通过 HTTP 标头提供提示的缓存类型,用于指示哪些部分的网站应该被缓存,以及如何缓存。
一、设置缓存
缓存系统需要少量的设置。也就是说,你必须告诉它你的缓存数据应该放在哪里 —— 是在数据库中,还是在文件系统上,或者直接放在内存中。这是一个重要的决定,会影响你的缓存的性能;是的,有些缓存类型比其他类型快。
你的缓存首选项在设置文件中的 CACHES 设置中。以下是所有可用值对 CACHES 的解释。
1、Memcached
Memcached 是一个完全基于内存的缓存服务器,最初是为了处理 LiveJournal.com 上的高负载而开发的,并随后由 Danga Interactive 开源。它被类似 Facebook 和 Wikipedia 这样的网站使用,以减少数据库访问并显著提高网站性能。
Memcached 以一个守护进程的形式运行,并且被分配了指定数量的 RAM。它所做的就是提供一个快速接口用于在缓存中添加,检索和删除数据。所有数据都直接存储在内存中,因此不会产生数据库或文件系统使用的开销。
在安装 Memcached 本身之后,您需要安装一个 Memcached 绑定。有几个 Python Memcached 绑定可用,Django 支持的两个是 pylibmc 和 pymemcache。
在 Django 中使用 Memcached :
- 设置 BACKEND 为 django.core.cache.backends.memcached.PyMemcacheCache 或 django.core.cache.backends.memcached.PyLibMCCache (取决于你选择的 memcached 绑定)。
- 将 LOCATION 设置为 ip:port 值,其中 ip 是 Memcached 守护进程的 IP 地址,port 是 Memcached 运行的端口,或者设置为 unix:path 值,其中 path 是 Memcached Unix socket 文件的路径。
在这个例子中,Memcached 运行在 localhost(127.0.0.1)端口 11211,使用 pymemcache
绑定:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache","LOCATION": "127.0.0.1:11211",}
}
在这个例子中,Memcached 可以通过本地 Unix 套接字文件 /tmp/memcached.sock
使用 pymemcache
绑定:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache","LOCATION": "unix:/tmp/memcached.sock",}
}
Memcached 有一个很好的特性,就是它可以在多台服务器上共享一个缓存。这意味着你可以在多台机器上运行 Memcached 守护进程,程序将把这组机器作为一个 单一 的缓存,而不需要在每台机器上重复缓存值。要利用这个特性,请在 LOCATION 中包含所有服务器地址,可以是分号或逗号分隔的字符串,也可以是一个列表。
在这个例子中,缓存是通过运行在 IP 地址 172.19.26.240 和 172.19.26.242 上的 Memcached 实例共享的,这两个实例都在 11211 端口上:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache","LOCATION": ["172.19.26.240:11211","172.19.26.242:11211",],}
}
在下面的例子中,缓存是由运行在 IP 地址 172.19.26.240(端口11211)、172.19.26.242(端口11212)和 172.19.26.244(端口11213)上的 Memcached 实例共享的:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache","LOCATION": ["172.19.26.240:11211","172.19.26.242:11212","172.19.26.244:11213",],}
}
默认情况下,PyMemcacheCache 后端设置以下选项(您可以在 OPTIONS 中覆盖它们):
"OPTIONS": {"allow_unicode_keys": True,"default_noreply": False,"serde": pymemcache.serde.pickle_serde,
}
关于 Memcached 的最后一点是,基于内存的缓存有一个缺点:因为缓存的数据存储在内存中,如果你的服务器崩溃,数据将丢失。显然,内存并不是用来永久存储数据的,所以不要依赖基于内存的缓存作为你唯一的数据存储。毫无疑问,Django 缓存后端中的 每个 都不应该用于永久存储 —— 它们的目的都是为了缓存的解决方案,而不是存储 —— 但我们在这里指出这一点是因为基于内存的缓存是格外临时的。
2、Redis
Redis 是一个内存数据库,可用于缓存。要开始使用它,您需要在本地或远程机器上运行一个 Redis 服务器。
在设置好 Redis 服务器之后,您需要安装 Redis 的 Python 绑定。Django 原生支持的绑定是 redis-py。同时,建议安装 hiredis-py 包。
要在 Django 中使用 Redis 作为缓存后端:
- 将 BACKEND 设置为 django.core.cache.backends.redis.RedisCache。
- 将 LOCATION 设置为指向您的 Redis 实例的 URL,使用适当的方案。
例如,如果 Redis 在本地主机(127.0.0.1)的端口 6379 上运行:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.redis.RedisCache","LOCATION": "redis://127.0.0.1:6379",}
}
通常,Redis 服务器受到身份验证的保护。为了提供用户名和密码,您可以将它们与 URL 一起添加到 LOCATION
中:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.redis.RedisCache","LOCATION": "redis://username:password@127.0.0.1:6379",}
}
如果您在复制模式下设置了多个 Redis 服务器,可以将这些服务器指定为分号或逗号分隔的字符串,或者作为一个列表。在使用多个服务器时,写操作将在第一个服务器(领导者)上执行,读操作将在随机选择的其他服务器(副本)上执行:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.redis.RedisCache","LOCATION": ["redis://127.0.0.1:6379", # leader"redis://127.0.0.1:6378", # read-replica 1"redis://127.0.0.1:6377", # read-replica 2],}
}
from django.core.cache import cache# 设置键值对(默认使用配置中的 TIMEOUT)
cache.set("user:1:name", "Alice")# 设置键值对并指定超时时间(单位:秒)
cache.set("user:1:email", "alice@example.com", timeout=3600)# 获取单个值
name = cache.get("user:1:name") # 返回 "Alice"
email = cache.get("user:1:email") # 返回 "alice@example.com"# 获取不存在的键(返回 None)
age = cache.get("user:1:age") # 返回 None# 设置默认值(如果键不存在)
age = cache.get("user:1:age", default=25) # 返回 25
3、数据库缓存
Django 可以在数据库中存储缓存数据。如果你有一个快速、索引正常的数据库服务器,这种缓存效果最好。
用数据库表作为你的缓存后端:
- 将 BACKEND 设置为 django.core.cache.backends.db.DatabaseCache
- 将 LOCATION 设置为数据库表的 tablename。这个表名可以是没有使用过的任何符合要求的名称。
在这个例子中,缓存表的名称是 my_cache_table
:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.db.DatabaseCache","LOCATION": "my_cache_table",}
}
与其他缓存后端不同,数据库缓存不支持在数据库级别自动清除过期条目。相反,每次调用 add()
, set()
, 或 touch()
时都会清除过期的缓存条目。
创建缓存表
在使用数据库缓存之前,您必须使用以下命令创建缓存表:
python manage.py createcachetable
这将在数据库中创建一个表,该表的格式与 Django 数据库缓存系统期望的一致。该表的表名取自 LOCATION 。
如果你正在使用多个数据库缓存, createcachetable 会为每个缓存创建一个表。
如果你正在使用多个数据库, createcachetable 观察你的数据库路由器的 allow_migrate() 方法(见下文)。
像 migrate 一样, createcachetable 不会影响已经存在的表,它只创建缺失的表。
要打印即将运行的 SQL,而不是运行它,请使用 createcachetable --dry-run 选项。
多数据库
如果在多数据库中使用缓存,你也需要设置数据库缓存表的路由指令。因为路由的原因,数据库缓存表在 django_cache
应用程序中显示为 CacheEntry
的模型名。这个模型不会出现在模型缓存中,但模型详情可用于路由目的。
比如,下面的路由可以将所有缓存读取操作指向 cache_replica
,并且所有的写操作指向 cache_primary
。缓存表将会只同步到 cache_primary
。
class CacheRouter:"""A router to control all database cache operations"""def db_for_read(self, model, **hints):"All cache read operations go to the replica"if model._meta.app_label == "django_cache":return "cache_replica"return Nonedef db_for_write(self, model, **hints):"All cache write operations go to primary"if model._meta.app_label == "django_cache":return "cache_primary"return Nonedef allow_migrate(self, db, app_label, model_name=None, **hints):"Only install the cache model on primary"if app_label == "django_cache":return db == "cache_primary"return None
如果你没有指定路由指向数据库缓存模型,缓存后端将使用 默认
的数据库。
如果没使用数据库缓存后端,则无需担心为数据库缓存模型提供路由指令。
4、文件系统缓存
基于文件的后端序列化并保存每个缓存值作为单独的文件。要使用此后端,可将 BACKEND 设置为 "django.core.cache.backends.filebased.FileBasedCache" 并将 LOCATION 设置为一个合适的路径。比如,在 /var/tmp/django_cache 存储缓存数据,使用以下配置:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.filebased.FileBasedCache","LOCATION": "/var/tmp/django_cache",}
}
如果使用 Windows 系统,将驱动器号放在路径开头,如下:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.filebased.FileBasedCache","LOCATION": "c:/foo/bar",}
}
目录路径应该是绝对路径——因此,它应该以文件系统根目录开始。无需担心是否需要以斜杠结尾。
确保该设置所指向的目录存在,并且具备读写权限,或者可以由您的 Web 服务器运行的系统用户创建。继续上面的示例,如果您的服务器以用户 apache
运行,请确保目录 /var/tmp/django_cache
存在,并且用户 apache
具备读写权限,或者可以由用户 apache
创建。
5、本地内存缓存
如果你的配置文件中没有指定其他缓存,那么这是默认的缓存。如果你想获得内存缓存的速度优势,但又不具备运行 Memcached 的能力,可以考虑使用本地内存缓存后端。这个缓存是每进程所有(见下文)和线程安全的。要使用它,可以将 BACKEND 设置为 "django.core.cache.backends.locmem.LocMemCache"。例如:
CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache","LOCATION": "unique-snowflake",}
}
LOCATION 被用于标识各个内存存储。如果只有一个 locmem 缓存,你可以忽略 LOCATION 。但是如果你有多个本地内存缓存,那么你至少要为其中一个起个名字,以便将它们区分开。
这种缓存使用最近最少使用(LRU)的淘汰策略。
请注意,每个进程都会有自己的私有缓存实例,这意味着不可能进行跨进程缓存。这也意味着本地内存缓存的内存效率不是特别高,所以对于生产环境来说,它可能不是一个好的选择。对于开发来说是不错的选择。
相关文章:
Django 缓存框架
动态网站的一个基本权衡是它们是动态的。每当用户请求页面时,Web 服务器进行各种计算,从数据库查询到模板渲染到业务逻辑,以创建您网站访问者看到的页面。从处理开销的角度来看,这比标准的从文件系统中读取文件的服务器安排要昂贵…...
后缀数组~
子串:在字符串s中,取任意i<j,那么在s中截取从i到j的这一段就叫做s的一个子串。 后缀:后缀就是从字符串的某个位置i到字符串末尾的子串,我们定义以s的第i个字符为第一个元素的后缀为suff(i)。 suff(1)就是从第一个字符到最后一个…...
Rust 学习笔记:编程练习(一)
Rust 学习笔记:编程练习(一) Rust 学习笔记:编程练习(一)Convert temperatures between Fahrenheit and CelsiusGenerate the nth Fibonacci numberPrint the lyrics to the Christmas carol “The Twelve …...
【基础知识】常见的计算公式(一)
目录标题 定时器相关公式1. 定时器分频系数计算2. 定时器定时时间计算 波特率相关公式1. 异步串行通信波特率计算 PWM 相关公式1. PWM 占空比计算 不知道你们是不是和我一样,对定时器中的分频系数相关的计算公式,波特率计算公式等,都有点心生畏惧,其核心原因是不清楚不了解,没有…...
【AI生产力工具】Windsurf,一款AI编程工具
Windsurf 是 Codeium 公司推出的一款 AI 编程助手,它是一款集成深度上下文感知、多模型协作和实时代码管理的综合开发环境(IDE)。 Windsurf 作为 AI 编程工具的核心价值在于 “上下文感知 + 多模型协作 + 自动化工作流”,其深度集成的智能体系统(如 Flows 和 Cascade)正…...
【网络原理】TCP提升效率机制(三):延时应答和捎带应答
目录 一. 延时应答 二. 捎带应答 一. 延时应答 延时应答也是基于滑动窗口的一种提升传输效率的方式(减少ACK数量) 接收方收到数据之后,不会立刻返回一个ACK确认报文,而是等一会再返回ACK报文 这样做的好处? 1&…...
Golang|分布式索引架构
当文档数量巨大时,如一亿个文档,倒排索引难以全部放入单机内存。正排索引将热数据和冷数据分别存储在内存和磁盘中。分布式搜索引擎将数据分布在不同服务器上以应对大量数据。 倒排索引的水平切分 水平切分按关键词划分数据,如JAVA和算法在A服…...
【蓝桥杯省赛真题58】Scratch画台扇 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
目录 scratch画台扇 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C资料 scratch画台扇 第十五届青少年蓝桥杯scratch编程省赛真题解析 一…...
WebRTC SDK是什么?
语音环境每年都在变,OKCC以前代理商的客群都是简单高效外呼为主,今年发现变化很大。很多代理商做的终端客户都是给其他业务系统赋能为主了。主流的还是以API对接为主,但是对接中发现webrtc SDK使用频率很高。 那么什么是WebRTC SDK…...
反向代理、负载均衡与镜像流量:原理剖析、区别对比及 Nginx 配置实践
在现代网络架构中,反向代理、负载均衡和镜像流量是保障系统高效、稳定、安全运行的关键技术。虽然它们都涉及网络流量的管理与分发,但在功能、应用场景和实现方式上有着显著差异。本文将深入探讨三者的区别,并结合 Nginx 这一强大的开源服务器…...
PyCharm 2023升级2024 版本
windows下把老版本卸载之后,需要把环境变量,注册表信息删除。 并且把C:\Users\用户\AppData 文件夹下的 Local\JetBrains和Roaming\JetBrains 都删除,再重新安装 原旧项目升级的方式: 1.2023虚拟机的文件夹是venv 改为.venv…...
for(auto it: vec)和for(auto it: vec)的区别以及使用场景
目录 1.for(auto it: vec) 2.for(auto& it: vec) 3.总结 在 C 里,for(auto it: vec) 和 for(auto& it: vec) 都属于基于范围的 for 循环,可用于遍历容器(像 std::vector、std::list 等)或者数组。不过,它们…...
系统思考提升培训效能
彼得德鲁克曾说:管理者的价值,不在于处理了多少事务,而在于创造了多少不可替代的成果。效率是以正确的方法做事,效能则是做正确的事。在系统思考中我们看到:效率往往是对单点问题的反应,而效能则是对整体系…...
第1篇:Egg.js框架入门与项目初始化
一、Egg.js框架优势与设计理念 1. 为什么选择Egg.js? 作为基于Koa 2.x的渐进式企业级框架,Egg.js在阿里系大规模生产环境中验证成熟,具备以下核心优势: 约定优于配置 通过app/config目录结构自动加载机制,减少冗余配置…...
CMU-15445(1)——环境搭建
前言 最近在找完暑期实习之后,终于有了一些干项目外的空余时间学习新的知识,在这么多轮面试中,数据库的考察非常多,但孱弱的数据库基础导致我有很多次面试被问住,因此我希望在学习CMU-15445(Fall 2024&…...
Web基础与HTTP协议
目录 一:Web基础 1.域名和dns 1.1域名的概念 (1)域名的结构 (2)域名结构类型 2.Hosts文件 (1)hosts文件的作用 (2)修改hosts文件 3.DNS 4.域名注册 ࿰…...
数量关系7_行程问题
目录 一、基础行程1. 基础行程2. 比例法运用3. 相遇追及二、特殊情境1. 多次相遇问题(简单)2. 流水问题3. 火车过桥4. 等距离平均速度问题(简单)5. 匀加速一、基础行程 1. 基础行程 公式1:S = Vt 公式2:平均速度=(2 V1V2) / (V1+V2) 例题3(2023 广东) 某地举办了“铁…...
MTK Android12-13 App卸载加锁
实现:App 卸载时候需要加一层拦截锁,客户输入密码后才能正常卸载 文章目录 参考资料:实现方案涉及到修改文件修改方案实现效果 源码分析- 卸载方式一) 设置界面进行卸载InstalledAppDetailsAppInfoDashboardFragmentAppButtonsPre…...
文号验证-同时对两个输入框验证
文号验证-同时对两个输入框验证 效果: 一、如果有多个文号: <div v-for"(item, index) in approvalForm.productApprovalTypeEvents" :key"index"> <el-form-itemlabel"文号":prop"productApprovalTypeEv…...
嵌入式面试八股文(十二)·FreeRTOS中·堆和栈
目录 1. 堆和栈 1.1 堆 1.2 栈 1.3 堆和栈的区别 1.3.1 分配方式 1.3.2 分配效率 1.3.3 生长方向 1.3.4 空间管理 1.3.5 存放内容 1. 堆和栈 1.1 堆 堆是一块用于动态分配内存的区域,用于存储程序运行时动态创建的对象。堆的大小可以在程序运行…...
表的增删改查
目录 1、增删改查(CRUD) 2、新增(C) 3、查询(R) 3.1、全列查询 3.2、指定列查询 3.3、查询字段为表达式 3.4、别名 3.5、去重:distinct 3.6、查询时排序 1、增删改查(CRUD&…...
软考-软件设计师中级备考 4、数据结构
1、数据结构三要素 要素定义分类特点逻辑结构数据元素之间的逻辑关系,是从具体问题抽象出来的数学模型,与数据存储无关1. 集合结构:数据元素同属一个集合,无其他特殊关系 如一盒麦丽素豆子 2. 线性结构:元素存在一对…...
CMake:设置编译C++的版本
CMake提供了CMAKE_CXX_STANDARD用于设置C++的版本,比如可以通过如下方式设置使用C++23 set(CMAKE_CXX_STANDARD 23) 同时也提供了CMAKE_CXX_STANDARD_REQUIRED可以要求强制使用某个C++版本,比如: set(CMAKE_CXX_STANDARD_REQUIRED ON) 如果设置为 `ON`,那么 CMake 会要求编…...
【angular19】入门基础教程(一):项目的搭建与启动
angular现在发展的越来越能完善了,在vue和react的强势竞争下,它迎来了自己的巨大变革。项目工程化越来越好,也开始拥抱了vite这种高效的构建方式。所以,我们有必要来学习这么一个框架了。 项目实现效果 nodejs环境 Node.js - v^…...
在使用Python的Selenium库打卡网页后,通过CDP命令获取所有cookies(包括Httponly和Secure的cookies)
通过 Chrome DevTools Protocol (CDP) 结合 Selenium 可以直接获取浏览器存储的所有 Cookies(包括所有域名下的 Cookies),以下是详细步骤: 步骤 1:配置 Chrome 启用 CDP启动 Chrome 浏览器时需启用远程调试端口&#…...
Deepseek-v3+cline+vscode java自动化编程
1、Deepseek DeepSeek 充值后,创建apikey 2、vscode Visual Studio Code - Code Editing. Redefined 3、下载插件cline 4、配置deepeseek-v3 的密钥到cline 5、不可用 在开始的几次调用能正常使用起来,用了几次后,不能使用了,请求…...
5G育种技术之植物性状订制
行业展望 我国农作物种业市场规模逐年增长,其中以粮食作物种子市场规模较大。目前我国育种产业发展仍处于初级阶段,存在龙头企业市场占有率和行业集中度不高、企业育种技术和水平落后于发达国家、种企研发投入不足等问题。虽然基因编辑技术的出现有望改…...
12前端项目----添加购物车1.0
商品添加购物车 商品数量添加购物车浏览器本地存储localStoragesessionStorage添加成功页面 商品数量 输入为数字,最少为1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…...
Elastic Platform 8.18 和 9.0:ES|QL Lookup Joins 功能现已推出,Lucene 10!
作者:来自 Elastic Elastic Platform Team Elastic 最新发布的 8.18 和 9.0 版本包含了强大的更新,将显著提升你的体验、增强查询性能并优化日志管理。无论你是在处理搜索、可观察性还是安全用例,本次发布都带来了大量新特性,旨在…...
两地三中心
1. 什么是同城备份 ✅ 定义: 主机房和备份机房都在同一座城市,通常距离几十公里以内(比如10-50公里)。 ✅ 特点: 网络延迟很低(毫秒级),可以做到实时同步/热备份。 恢复速度快&am…...
数据结构第七章(一)-顺序查找和折半查找
数据结构第七章(一) 顺序查找和折半查找一、查找1.平均查找长度(ASL) 二、顺序查找1.实现2.算法优化 三、折半查找1.实现2.查找判定树 四、分块查找1.算法思想2.查找效率分析(ASL) 总结 顺序查找和折半查找…...
springboot项目之websocket的坑:spring整合websocket后进行单元测试后报错的解决方案
前排提醒:还是博主菜,见识短浅,没遇到过这个问题。。。 起因 前段时间学习websocket和sse,写demo用了spring框架。后来又写了新的spring单元测试类demo去测试,结果启动后报错,报错信息提示websocket的相关…...
在单片机编程中充分使用抽象工厂模式,确保对象创建的限制,多使用抽象接口避免多变具体实现类
背景 在软件架构设计上追求稳定,就必须多使用稳定的抽象接口,少依赖多变的实现;具体编码时可以充分使用抽象工厂模式 举例进行详细讲解和说明抽象工厂模式在单片机开发中的应用 抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组相关的对象创建封装到一个…...
喷泉码技术在现代物联网中的应用的总结和参考文献
总结 物联网与 5G 技术高速发展,数据传输对可靠性和实时性提出严苛要求。前向纠错码是增强通信鲁棒性的关键,但平衡冗余资源开销与编解码效率的矛盾是核心难题。LT 码和 Raptor 码是无率码典型。理论上它们能达渐进最优性能,然而实际系统受数据包规模、计算资源等限制,其工…...
vuex与vuex-persistedstate 插件固化数据
一,vuex与vuex-persistedstate 插件固化数据 的小案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Vuex基础案例</title></head><body><div id"app"&…...
如何在WordPress网站中设置双重验证,提升安全性
随着互联网的不断进步,网站的安全问题越来越受到重视。尤其对于WordPress这样常用的建站平台,安全性显得尤为重要。尽管WordPress自带一定的安全性,但仅依靠用户名和密码的登录方式仍然存在风险。因此,启用“双重验证”便成为了提…...
2025系统架构师---基于规则的系统架构风格
引言 在业务规则频繁变更、决策逻辑高度动态化的现代企业环境中,基于规则的系统架构风格(Rule-Based System Architecture Style)通过将核心业务逻辑抽象为可配置规则、规则引擎与决策服务的分离,实现了业务敏捷…...
Python排序中lambda函数详解
在 Python 中,lambda 函数是一种匿名函数,通常用于需要一个函数但又不想为其定义一个正式名称的情况。在排序操作中,lambda 函数用于指定排序的依据。 lambda 函数的基本语法 lambda 函数的基本语法如下: lambda arguments: ex…...
web 基础与 http 协议
目录 一 Web 基础 1. 域名和 DNS 1.1 域名的概念 1.2 DNS 2. 网页与HTML 2.1 HTML 概述 2.2 HTML 基本标签 2.3 网站和主页 3. 静态网页与动态网页 3.1 静态网页 3.2 动态网页 二 HTTP 协议 1. HTTP 协议概述 2. HTTP 方法 3. HTTP 状态码 4. HTTP 请求流程分析…...
记一次奇妙的Oracle注入绕WAF之旅
0x01 一个登陆框 上班时遇到了一个登陆框 看着这个复古的界面,于是上手除了admin123456之外顺手点了个 于是弹出了一条有意思的报错 这就有意思了,毕竟已经很久没在登陆框遇到sql注入了,当我想当然的认为万能密码可以秒时,事情出…...
python裁剪小说封面标题
一张矩形图片 比如50*100 大小 中心点的坐标是是(0,0) 左上角是(-25,50) 右上角是(25,50) 左下角是(-25,-50) 右下角是(25,-50) 我希望你能用python,帮我对本地指定图片切割大小,计算出该图片的中心坐标,然后按照我输入的长宽具体值,比…...
高性价比手机如何挑选?
这四个关键点,助你找到心仪机~ 一、性能强者:游戏娱乐畅快到底 处理器相当于手机的 “大脑”,处理速度快、能力强,运行大型游戏毫无压力。 搭配上大容量运存,多任务切换也能秒速完成,再也不怕游戏卡顿啦。…...
Java面试场景深度解析
Java面试场景深度解析 在互联网大厂Java求职者的面试中,经常会被问到关于Java项目中的各种技术场景题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我们公司的面试现场。请问您对Java内存模型…...
【DeepSeek认证】最好的MODBUS调试工具
根据搜索结果,MThings 和 Modbus Poll 是当前被广泛推荐且功能强大的MODBUS调试工具。以下是两者的详细对比及推荐理由: 1. MThings 核心优势: 主从一体化:支持同时模拟MODBUS主站和从站,无需切换工具即可完成双向调…...
欧莱雅集团:利用 Google Maps Platform Environment API 提供个性化护肤推荐
在欧莱雅集团,美丽绝不仅仅停留在表面。如今,这一点比以往任何时候都更加真实,因为公司将其深厚的科学专业知识与尖端技术相结合,以重塑美丽的未来。其成功的关键在于承诺不为科技而使用科技。其所有创新都满足了消费者的明确需求…...
2025三掌柜赠书活动第十五期:高并发系统:设计原理与实践
目录 前言 什么是高并发? 高并发系统的挑战 设计原理 1、分布式架构 2、缓存与异步处理 3、数据库优化 4、弹性扩展 实践方法 1、性能监控与分析 2、压力测试 3、故障排查与容错机制 关于《高并发系统:设计原理与实践》 编辑推荐 内容简介…...
【Spark入门】Spark架构解析:组件与运行机制深度剖析
1 Spark架构全景图 Apache Spark作为当今最流行的大数据处理框架之一,其卓越性能的背后是一套精心设计的分布式架构。理解Spark的架构组成和运行机制,对于性能调优和故障排查至关重要。 1.1 核心组件架构 组件交互流程: Driver初始化…...
电子电器架构 -- 汽车零部件DV试验与PV试验的定义及关键差异
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
交换机配置DHCP
交换机配置DHCP 背景先关闭路由器的DHCPconsole口连接到交换机配置交换机 背景 路由器的dhcp分配IP地址变慢,怎么处理 先关闭路由器的DHCP 查看路由器中DHCP地址池范围; 关闭路由器的DHCP console口连接到交换机 协议Serial端口COMX波特率9600流控无 配置交换机…...
【人工智能】边缘智能的突破:Ollama模型压缩技术与DeepSeek部署实践
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着边缘计算的兴起,将大型语言模型(LLM)部署到资源受限的边缘设备成为研究热点。Ollama凭借其高效的模型压缩技术和轻量级推理框架,为…...