Redis专题-基础篇
题记
本文涵盖了Redis的各种数据结构和命令,Redis的各种常见Java客户端的应用和最佳实践
jedis案例github地址:https://github.com/whltaoin/fedis_java_demo
SpringbootDataRedis案例github地址:https://github.com/whltaoin/springbootDataRedis_demo
一、初始Redis
SQL与NoSQL对比
- 结构化(Structured)对比
- SQL具有严格的结构化格式(左图)
- NoSQL的数据存储格式相对随意(右图)
- 关系对比
- SQL在表和表间**可能存在联系**,在操作一张表时,需要考虑对应关联表的完整性。
2. NoSQL数据间是**<font style="color:#DF2A3F;">无关联</font>**的,(下图为存储方式)
- 查询对比
- SQL查询有**固定的语法**,只要是SQL都可以使用相同的语句查询。
2. NoSQL没有固定的语法,每个NoSQL都有自己的语法糖(下图为查询同一个东西,出现了不同的语法)
- SQL需要满足**事务的ACID特性**(原子性、一致性、隔离性、持久性)
- NoSQL只是**基本满足事务的ACID**
- 差异总结:
初始Redis
- 简介
Redis(远程词典服务器),是一个基于内存的**键值型NoSQL**数据库
- 特征:
- 键值型:key-value
- 单线程:命令具有原子性
- 低延迟、数据块原因:(基于**内存**、IO多路复用、良好的编码)
- 支持数据持久化
- 支持主从集群(主服务器和副服务器)、分片集群(将数据拆分,分别存在不同的服务器上)
- 支持多语言客户端(java、C…)
安装Redis(Linux安装)
忽略…
二、Redis常见命令
数据类型介绍
- String
1. - Hash
- 哈希表
- List
- 有序集合,本质是链表
- Set
- 无序集合,不可重复
- SortedSet
- 有序集合,不可重复
- GEO
- 地理坐标
通用命令
- 查询所有通用命令:
help @generic
- 查看符合模版的所有key
- 注意:不建议在生产环境设备上使用该命令,因为模糊查询,效率不高且浪费资源。
# 语法
keys +[pattern]
- 删除key
- 可以单个删除,也可以多个一起删除
del [key]
删除一个或多个示例
- 判断key是否存在
- 可以判断单个,也可以判断多个
exists [key]
判断单个和多个示例
- 给key设置有效期,到期后自动删除(单位秒)
- TTL查看可以的有效时间
expire [key] [seconds]
ttl key
示例:设置age1的有效期为10s,到期后自动删除
- 总结
String类型
- set
- get
- mset
- mget
- incr
- incrby
- incrbyfloat
- setnx(新增,存在则不创建)
- 等价于:set [key value] nx
- setex
- 等价于:set
Key的层级格式
- 思考:
- 解决方法
- 示例
heima:user:1
herma:product:1
层级结构:
Hash类型
- Hash类型(散列),其中的value是一个**无序字典**
- 类似于java 中的HashMap结构
- 使用场景:
- 当要修改JSON数据中某个属性的值时,使用String存储的需要重新覆盖数据,而我们的需求只是**想要修改某个值**
- 常用命令
- 示例
- hset
2. hget
3. hmset
4. hmget
5. hgetall
6. hkeys
7. hvals
8. hincrby
9. hsetnx(已存在,不新建)
List类型
- Redis中的List类型于java中的LinkedList类似,可以当它是一个双向链表结构。
- 既可以支持正向检索也可以支持反向检索。
- 特征:
- 有序
- 元素可重复
- 插入和删除快
- 查询速度一般
- 使用场景举例:
- 朋友圈点赞列表,评论列表等
- 常用命令:
1. 示例:
Set类型
- Redis的Set结构和Java中的HashSet类似,可以看做一个value为null的HashMap。
- 特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
- 单个set常见命令
1. 示例
- 多个set操作命令
- 求交集(sinter):两集合公共的
2. 求并集(sunion):所有元素合并
3. 求差集(sdiff):set中有,但是set2中没有
- 练习题:
1. 张三的好友人数
2. 张三和李四的共同好友
3. 查询那些人是张三的好友但是不是李四的好友
4. 查询张三和李四的共同好友
5. 判断李四是否是张三的好友
6. 判断张三是否是李四的好友
7. 将李四从张三的好友列表中移除
SortedSet类型
- 特性:
- 可排序
- 元素不可重复
- 查询快
- 应用场景:
- 因为可排序,常用于实现**排行榜**功能
- 常用命令
- 练习题:
1. 添加数据
2. 删除Tom
3. 获取Amy分数
4. 获取Rose排名
5. 查询80分以上人数
6. 给Amy加2分
7. 查询排名前三的同学
8. 查询80以下的同学
三、Redis的Java客户端
常用Java客户端的优缺点对比
Jedis使用(单线程)
github地址:https://github.com/whltaoin/fedis_java_demo
- 使用Jedis分为了四步骤:
- 导入依赖
- 初始化Jedis对象
- 执行Jedis中的操作方法
- 释放Jedis对象
- 具体实现
- 导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>jedis-test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies>
<!-- 核心--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>6.0.0</version></dependency>
<!-- 测试类--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies></project>
b. 测试类方法内容
package cn.varin;import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;public class JedisTest {private Jedis jedis;@Beforepublic void init(){jedis = new Jedis("ip",6379);jedis.auth("密码");jedis.select(0);}@Testpublic void StringTest(){String set = jedis.set("name", "varin");System.out.println("执行set后结果为:"+set);String name = jedis.get("name");System.out.println("key为name的value为:"+name);}@Afterpublic void close(){if(jedis !=null){jedis.close();}}}
3. 执行结果
Jedis使用(使用连接池)
github地址:https://github.com/whltaoin/fedis_java_demo
- 使用步骤:
- 创建连接池
- 获取Jedis对象
- 操作Jedis对象
- 归还连接池对象
- 具体代码
- 创建连接池对象
package cn.varin.jedis.utils;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;// Jedis连接池对象
public class JedisConnectionFactory {//static public final JedisPool jedisPool;static {// 创建配置JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 最大连接数jedisPoolConfig.setMaxTotal(10);// 最大空闲数jedisPoolConfig.setMaxIdle(10);// 最小空闲数jedisPoolConfig.setMinIdle(2);// 空闲等待时间jedisPoolConfig.setMaxWaitMillis(1000);jedisPool = new JedisPool(jedisPoolConfig,"host",6379,100,"password");}public static Jedis getResource(){return jedisPool.getResource();}
}
2. 测试类代码
package cn.varin;import cn.varin.jedis.utils.JedisConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;public class JedisTest {private Jedis jedis;@Beforepublic void init(){jedis = JedisConnectionFactory.getResource();jedis.select(0);}@Testpublic void StringTest(){String set = jedis.set("name", "varya");System.out.println("执行set后结果为:"+set);String name = jedis.get("name");System.out.println("key为name的value为:"+name);}@Afterpublic void close(){if(jedis !=null){jedis.close();}}}
3. 执行结果:
SpringDataRedis使用
github示例案例地址:https://github.com/whltaoin/springbootDataRedis_demo
springData介绍
- 项目地址:https://spring.io/projects/spring-data-redis#learn
- Redis模版版本信息
SpringDataRedis快速入门
SpringbootDataRedis使用步骤
基本示例
- 导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.varin</groupId><artifactId>springbootDataRedis_demo</artifactId><version>0.0.1-SNAPSHOT</version><name>springbootDataRedis_demo</name><description>springbootDataRedis_demo</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><dependencies>
<!-- springbootDataRedis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
<!-- pool2--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
- 配置yml
spring:data:redis:port: 6379password: passworddatabase: 0lettuce:pool:max-active: 10max-idle: 10min-idle: 0max-wait: 100mshost: address
- 编写测试类
package cn.varin.springbootdataredis_demo;import cn.varin.springbootdataredis_demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;@SpringBootTest
class SpringbootDataRedisDemoApplicationTests {@AutowiredRedisTemplate redisTemplate;@Testvoid setTest() {ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("user:1",new User("varin",1).toString());Object o = valueOperations.get("user:1");System.out.println(o);}}
- 结果:
重构redisTemplate序列化和反序列化工具
- 问题
1. 在我们直接使用redisTemplate时,存入到redis的内容,是经过编译的字节,
2. 影响阅读性
3. 增加了存储空间
- 解决方案:
- 自定义序列化和反序列话的编码格式
- 步骤
- 建立template
- 设置连接工厂
- 设置序列化工具
- 分别对key和value设置不同的格式
package cn.varin.springbootdataredis_demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;@Configuration
public class RedisTamplateConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){RedisTemplate<String,Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(factory);// 创建序列化工具GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 对keytemplate.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 对valuetemplate.setValueSerializer(genericJackson2JsonRedisSerializer);template.setHashValueSerializer(genericJackson2JsonRedisSerializer);return template;}
}
测试类
package cn.varin.springbootdataredis_demo;import cn.varin.springbootdataredis_demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;@SpringBootTest
class SpringbootDataRedisDemoApplicationTests {@AutowiredRedisTemplate redisTemplate;@Testvoid setTest() {ValueOperations valueOperations = redisTemplate.opsForValue();// value为user对象valueOperations.set("user:2",new User("varin",1));Object o = valueOperations.get("user:1");System.out.println(o);}}
- 测试结果
StringRedisTamplate类使用
- 问题:
- 虽然自定义序列化工具可以解决上一问题,但是修改后在JSON字符串中会多存储一个类的包名
- 导致增大存储的空间
- 虽然自定义序列化工具可以解决上一问题,但是修改后在JSON字符串中会多存储一个类的包名
- 解决方法,
- 使用StringRedisTamplate类,在加上自己使用第三方的序列化工具进行存储。
- 优点:在存储时不会增加额外的数据
- 缺点:增加少许的代码量
- 使用StringRedisTamplate类,在加上自己使用第三方的序列化工具进行存储。
- 示例代码
@AutowiredStringRedisTemplate stringRedisTemplate;// 用于转Json格式private static final ObjectMapper mapper = new ObjectMapper();@Testvoid StringRedisTamplateTest() throws JsonProcessingException {User user = new User("varya",1);// 转JSON格式String s = mapper.writeValueAsString(user);// 写入数据stringRedisTemplate.opsForValue().set("user:3",s);// 读取数据String s1 = stringRedisTemplate.opsForValue().get("user:3");// 反序列化User user1 = mapper.readValue(s1, User.class);System.out.println(user1);}
相关文章:

Redis专题-基础篇
题记 本文涵盖了Redis的各种数据结构和命令,Redis的各种常见Java客户端的应用和最佳实践 jedis案例github地址:https://github.com/whltaoin/fedis_java_demo SpringbootDataRedis案例github地址:https://github.com/whltaoin/springbootData…...

springMVC-11 中文乱码处理
前言 本文介绍了springMVC中文乱码的解决方案,同时也贴出了本人遇到过的其他乱码情况,可以根据自身情况选择合适的解决方案。 其他-jdbc、前端、后端、jsp乱码的解决 Tomcat导致的乱码解决 自定义中文乱码过滤器 老方法,通过javaW…...

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程
前言 越狱iPhone之后,一定记得安装一下用于屏蔽更新的描述文件(可使用爱思助手) 因为即便关闭了自动更新,iPhone仍会在某些时候自动更新系统,导致越狱失效;更为严重的是,更新后的iOS版本可能是…...
MongoDB检查慢查询db.system.profile.find 分析各参数的作用
db.system.profile.find() 是分析 MongoDB 性能的关键工具,其返回的文档包含丰富的性能指标。下面是对各参数的详细解释和优化建议: {"op": "query", // 操作类型(query/update/remove)"ns": "test.users", // 命名…...

智能标志桩图像监测装置如何守护地下电缆安全
在现代城市基础设施建设中,大量电缆、管道被埋设于地下,这虽然美化了城市景观,却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响,都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…...

【网站建设】网站 SEO 中 meta 信息修改全攻略 ✅
在做 SEO 优化时,除了前一篇提过的Title之外,meta 信息(通常指 <meta> 标签)也是最基础、最重要的内容之一,主要包括: <meta name="description"> <meta name="keywords"> 搜索引擎重点参考这些信息,决定你网页的展示效果与排名。…...

计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)
一、采集视频 VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自 多种源的视频。 cv2.VideoCapture() 打开摄像头或视频文件。 cap cv2.VideoCapture(0) # 0表示默认摄像头,1是第二个摄像头,传递视频文件路径也可以 …...
elasticsearch基本操作笔记
1.通过kibana查看elasticsearch版本信息 a.左上角三道横->Management->Dev Tools b.GET / 执行 c.执行结果 { “name” : “xxxx”, “cluster_name” : “xxxxxxx”, “cluster_uuid” : “vl1UudAoQp-aHWAzyPoMyw”, “version” : { “number” : “7.15.1”, “build…...
LVGL手势识别事件无上报问题处理记录
最近在使用LVGL8.3开源库开源UI界面时,碰到使用FB驱动显示UI时,触摸屏手势识别事件接收不到的情况,通过如下调整可以处理该问题: 1、创建Top Object时,不能使用如下语句: lv_obj_t *page_obj = lv_obj_create(lv_scr_act()); 而要使用如下语句: lv_obj_t *page_obj =…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 第一篇:MIPI CSI-2基础入门
第一篇:MIPI CSI-2基础入门 1. 为什么需要CSI-2? 痛点场景对比 (用生活案例降低理解门槛) 传统并行接口CSI-2接口30根线传输720P图像仅需5根线(1对CLK4对DATA)线距>5cm时出现重影线缆可长达1…...

变幻莫测:CoreData 中 Transformable 类型面面俱到(一)
概述 各位似秃似不秃小码农们都知道,在苹果众多开发平台中 CoreData 无疑是那个最简洁、拥有“官方认证”且最具兼容性的数据库框架。使用它可以让我们非常方便的搭建出 App 所需要的持久存储体系。 不过,大家是否知道在 CoreData 中还存在一个 Transfo…...

开源技术驱动下的上市公司财务主数据管理实践
开源技术驱动下的上市公司财务主数据管理实践 —— 以人造板制造业为例 引言:财务主数据的战略价值与行业挑战 在资本市场监管日益严格与企业数字化转型的双重驱动下,财务主数据已成为上市公司财务治理的核心基础设施。对于人造板制造业而言࿰…...
婚恋小程序直播系统框架搭建
逻辑分析 直播流管理:需要处理主播端的直播流推送,确保直播流能够稳定、高效地传输到各个观看用户的设备上。这涉及到选择合适的流媒体协议,如 RTMP(Real-Time Messaging Protocol)、HLS(HTTP Live Streami…...
day46 python预训练模型补充
目录 一、预训练模型的背景知识 二、实验过程 (一)实验环境与数据准备 (二)预训练模型的选择与适配 (三)训练策略 三、实验结果与分析 四、学习总结与展望 一、预训练模型的背景知识 在传统的神经网…...
CCPC chongqing 2025 H
题目链接:https://codeforces.com/gym/105887 题目背景: 方框上有上下两排小球,下面的紧贴框底,上面的部分贴框顶,每牌小球上都有一个一个数字(1~n),将相同的小球连接到一起,是否在不交叉的情况…...

Java建造者模式(Builder Pattern)详解与实践
一、引言 在软件开发中,我们经常会遇到需要创建复杂对象的场景。例如,构建一个包含多个可选参数的对象时,传统的构造函数或Setter方法可能导致代码臃肿、难以维护。此时,建造者模式(Builder Pattern)便成为…...
ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示
目录 一、问题 二、解决方法 三、总结 一、问题 1.代码里有一个基于ant封装的公共组件数字输入框,测试突然说 无效了,输入其他字符也会显示;改了只有又发现某些 输入法 需要连续输入两次 才能显示出来。 二、解决方法 1.就离谱࿰…...
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表. 将原来SQLAlchemy的模型,修改依赖为: from bee.helper import SQLAlchemy 然后就可以开始生成了。很简单,主要是两个接口。 db.create_all(True) #创建所有模型的表…...
【win | 自动更新关闭】win11
利用本地组策略编辑器 对于Windows 11专业版或更高版本的用户,可以利用本地组策略编辑器来完全关闭自动更新。按下“WinR”键,输入“gpedit.msc”并回车。在本地组策略编辑器中,依次展开“计算机配置”>“管理模板”>“Windows组件”&…...

win32相关(IAT HOOK)
IAT HOOK 什么是IAT Hook? IAT Hook(Import Address Table Hook,导入地址表钩子)是一种Windows平台下的API钩取技术,通过修改目标程序的导入地址表(IAT)来拦截和重定向API调用 在我们之前学习pe文件结构的导入表时&am…...
大模型高效提示词Prompt编写指南
大模型高效Prompt编写指南 一、引言二、核心原则1. 清晰性原则:明确指令与期望2. 具体性原则:提供详细上下文3. 结构化原则:组织信息的逻辑与层次4. 迭代优化原则:通过反馈改进Prompt5. 简洁性原则:避免冗余信息 三、文…...

零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 TCP服务器通信配置与交互 3.1 硬件连接 3.2 开启TCP服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 TCP是TCP/IP体系中的传输层协议,全称为Transmiss…...
十一、【ESP32开发全栈指南: TCP通信服务端】
一、TCP与UDP协议对比 1.1 基本特性比较 TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的传输层协议,它们在ESP32网络编程中都有广泛应用: 连接方式 TCP是面向连接的协议,通信前需要先建立连接(三次握手)UDP是无连接的协议ÿ…...

ESP32开发之LED闪烁和呼吸的实现
硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程 硬件电路介绍 电路图如下: 只要有硬件基础的应该都知道上图中,当GPIO4的输出电平为高时,LED灯亮,反之则熄灭。如果每间…...

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录
【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表; 分别是: 订单主表:jjy_orderMain订单产…...

2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践
项目背景:近年来,云计算、AI人工智能、大数据等信息技术的不断发展、各行各业的信息电子化的步伐不断加快、信息化的水平不断提高,网络安全的风险不断累积,金融证券行业面临着越来越多的威胁挑战。特别是近年以来,开源…...
Linux安装jdk、tomcat
1、安装jdk sudo yum install -y java-1.8.0-openjdk-devel碰到的问题:/var/run/yum.pid 已被锁定 Another app is currently holding the yum lock; waiting for it to exit… https://blog.csdn.net/u013669912/article/details/131259156 参考&#…...

WebRTC通话原理与入门难度实战指南
波煮的实习公司主要是音视频业务,所以最近在补习WebRTC的相关内容,会不定期给大家分享学习心得和笔记。 文章目录 WebRTC通话原理进行媒体协商:彼此要了解对方支持的媒体格式网络协商:彼此要了解对方的网络情况,这样才…...

N元语言模型 —— 一文讲懂!!!
目录 引言 一. 基本知识 二.参数估计 三.数据平滑 一.加1法 二.减值法/折扣法 编辑 1.Good-Turing 估计 编辑 2.Back-off (后备/后退)方法 3.绝对减值法 编辑4.线性减值法 5.比较 三.删除插值法(Deleted interpolation) 四.模型自适应 引言 本章节讲的…...

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快
一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下,服务依赖的外部资源往往不可…...