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

Java操作redis

目录

一:Jedis

二:使用Spring Data Redis


Redis 的 Java 客户端很多,官方推荐的有三种:

1.Jedis

2.Lettuce

3.Redisson

同时,Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。

一:Jedis

使用jedis操作redis有以下的优点和缺点

使用Jedis操作Redis的优点有:

1. 简单易用:Jedis是一个简单而直观的Java库,易于使用和理解。
2. 性能高:Jedis使用基于套接字的连接,并通过连接池来管理连接,因此在处理高并发请求时表现出色。
3. 多功能:Jedis支持Redis的所有数据类型和命令,可以用于各种不同的应用场景。
4. 可扩展性好:Jedis可以与其他框架和工具集成,如Spring和Hibernate等,以支持更复杂的应用需求。
5. 社区支持:Jedis是一个流行的Redis Java客户端,有一个活跃的社区,提供了许多示例代码和解决方案。

使用Jedis操作Redis的缺点包括:

1. 需要手动管理连接池:由于Jedis使用连接池来管理与Redis的连接,因此需要手动管理连接池的大小和连接的获取和释放。
2. 不支持异步操作:Jedis不支持异步操作,所有操作都是同步的,可能会阻塞线程。
3. 执行命令的方式有限:Jedis只支持将命令以字符串的形式传递给Redis,不支持类似构建器模式的方式来构建和执行命令。
4. 对象序列化的开销:Jedis将Java对象序列化为字节数组存储到Redis中,因此会产生额外的开销。

具体操作如下: 

1.导入Maven坐标

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version>
</dependency>

2.常用方法

注意:在jedis中每个方法名就其实就是在redis客户端操作的命令名称,并且在每次访问Redis数据库的时候,都需要创建一个Jedis对象。每个Jedis对象似于JDBC中Connection对象。

连接和关闭功能
new Jedis(host, port)创建Jedis连接对象,参数: host: 服务器地址 port:端口号6379
void close()关闭连接
对STRING操作的方法说明
set(String key,String value)添加字符串类型的键和值
String get(String key)通过键得到字符串的值
del(String ... keys)删除一个或多个键
对HASH操作的方法说明
hset(String key,String field,String value)添加一个hash类型的键,字段和值
Map<String,String> hgetall(String key)通过一个键得到所有的字段和值,返回Map
对LIST操作的方法说明
lpush(String key,String...values)从左边添加多个值到list中
List<String> lrange(String key,long start,long end)通过键得到指定范围的元素
对SET操作的方法说明
sadd(String key,String...values)添加一个或多个元素
Set<String> smembers(String key)通过键得到集合所有的元素
对ZSET操作的方法说明
zadd(String key, double score, String member)添加一个键,分数和值
Set<String> zrange(String key, long start, long end)查询一个指定范围的元素

 3.案例分析:

1.例如在Java中用jedis操作redis的String数据类型

/*** @author: dlwlrma* @data 2024年06月14日 16:18* @Description: TODO:用java操作redis 使用jedis操作String数据类型*/
public class jedis {/**** @author dlwlrma* @date 2024/6/14 16:31* TODO: 使用jedis操作String类型数*/@Testpublic void testJedis(){//1.建立连接 输入在linux上的redis的ip地址,端口号为固定端口号:6379Jedis jedis = new Jedis("192.168.81.129", 6379);//2.使用jedis对象调用方法向redis中存储字符串数据String set = jedis.set("NBA", "斯蒂芬库里");System.out.println("set = " + set);//3.获取数据String nba = jedis.get("NBA");System.out.println("nba = " + nba);//4.释放资源jedis.close();}
}

2.在Java中用jedis操作redis的hash数据类型


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.Map;/*** @author: dlwlrma* @data 2024年06月14日 16:18* @Description: TODO:用java操作redis 使用jedis*/
public class jedis {/**** @author dlwlrma* @date 2024/6/14 16:31* TODO: 使用jedis操作hash类型数据*/@Testpublic void testHash(){//1.建立连接 输入在linux上的redis的ip地址,端口号为固定端口号:6379Jedis jedis = new Jedis("192.168.81.129", 6379);//2.使用jedis操作hash类型数据Long hset = jedis.hset("第一号", "鼠标", "3");Long hset2 = jedis.hset("第二号", "水杯", "5");//返回的是操作的个数System.out.println("hset = " + hset);//3.获取存入的hash数据Map<String, String> map = jedis.hgetAll("第一号");//遍历map集合map.forEach((filed,value)->{System.out.println(filed+"---------"+value);});Map<String, String> map2 = jedis.hgetAll("第二号");//遍历map集合map2.forEach((filed1,value1)->{System.out.println(filed1+"---------"+value1);});//4.释放资源jedis.close();}}

二:使用Spring Data Redis

官网网址:Spring Data Redis

1.导入相应的maven坐标

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.4.8</version>
</dependency>

2.Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对类似 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作(String类型)

  • SetOperations:set类型数据操作

  • ZSetOperations:zset类型数据操作

  • HashOperations:针对hash类型的数据操作

  • ListOperations:针对list类型的数据操作

3.案例分析:

注意:在进行代码测试的时候,在springboot项目中要编写一个redis的配置类,是为了防止在redis客户端访问时出现一下情况:

配置类如下:(注意:一定要放在和APP,即springboot启动类同一级目录上,即建立一个config的包,存放一些项目的配置类) 

import org.springframework.cache.annotation.CachingConfigurerSupport;
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.StringRedisSerializer;/**** @author dlwlrma* @date 2024/6/14 16:45* @param* @return null* TODO:这是表明为redis的配置类,解决的是redis底层默认的以JdkSerializationRedisSerializer的序列化操作转换为以StringRedisSerializer的序列化*      可以在redis的客户端可以看到存入的中文数据*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {/*1.RedisConnectionFactory 是获取RedisConnection对象的,RedisConnection相当于jdbc中的连接对象Connection表示和Redis进行连接*/@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {//创建Redis模板对象RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默认的Key序列化器为:JdkSerializationRedisSerializer//StringRedisSerializer支持字符串类型的转化,而且默认使用UTF-8编码//下面代码的意思是使用StringRedisSerializer序列化器替换默认的Key序列化器JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}}

在springboot的资源下,去配置redis

 配置application.yml

spring:#Redis相关配置redis:host: 192.168.81.129 #注意:这是我在linux系统下的ip地址port: 6379database: 0 #操作的是0号数据库

3.1使用spring data redis操作的方式进行String类型数据的操作

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;import java.util.concurrent.TimeUnit;@SpringBootTest
public class SpringDataRedisTest {//自动注入@Autowiredprivate RedisTemplate redisTemplate;/*** 操作String类型的数据*/@Testpublic void test01String(){/**** @author dlwlrma* @date 2024/6/14 16:01* TODO :需求:*            1.存入数据和取出数据*            2.存值并设置过期时间*            3.如果存在值则不执行任何操作**///根据redisTemplate模板类获取操作String类型的ops接口对象ValueOperations ops = redisTemplate.opsForValue();//1.存入String类型的数据ops.set("username","zhangsan");Object username = ops.get("username");System.out.println("username = " + username);//2.存值并设置过期时间//使用valueOperations调用方法设置过期时间//TimeUnit.MINUTES 为枚举类型,意味着是秒的单位//若key一样则会覆盖value的值(key唯一)ops.set("地点","上海",10, TimeUnit.MINUTES);Object object = ops.get("地点");System.out.println("object = " + object);//3.如果存在值则不执行任何操作//setIfAbsent 表示如果值不存在则存储,如果存在则不存储Boolean absent = ops.setIfAbsent("age", "18");System.out.println("absent = " + absent);//setIfPresent: 表示如果存在则执行代码将数据覆盖之前的value值,如果不存在则不执行代码Boolean present = ops.setIfPresent("age","男");System.out.println("present = " + present);}/*** 操作hash类型的数据*/

3.2使用spring data redis操作的方式进行hash类型数据的操作

/*** 操作hash类型的数据*/@Testpublic void test02Hash(){/**** @author dlwlrma* @date 2024/6/15 15:47* TODO:需求:1.存储几个哈希类型的数据*           2.获取哈希类型的数据*           3.根据键获取哈希类型中的所有字段*           4.获得hash结构中的所有值*///获取执行hash操作的接口对象HashOperations hashOperations = redisTemplate.opsForHash();//1.存储几个哈希类型的数据hashOperations.put("大学","数计学院","1个");hashOperations.put("大学","艺术学院","1个");hashOperations.put("大学","法学学院","1个");//2.获取哈希类型的数据Object o = hashOperations.get("大学", "数计学院");System.out.println("o = " + o);Object o1 = hashOperations.get("大学", "艺术学院");System.out.println("o1 = " + o1);//3.根据键获取哈希类型中的所有字段Set keys = hashOperations.keys("大学");//返回值类型为set集合类,因此用增强for遍历集合for (Object key : keys) {System.out.println("key = " + key);}//4.获得hash结构中的所有值List list = hashOperations.values("大学");for (Object object : list) {System.out.println("object = " + object);}}

3.3使用spring data redis操作的方式进行list类型数据的操作

/*** 操作List类型的数据*/@Testpublic void testList(){/**** @author dlwlrma* @date 2024/6/15 15:59* TODO:需求: 1.向列表中添加数据*           2.查询列表中所有数据*///获取执行list操作的接口对象ListOperations listOperations = redisTemplate.opsForList();//1.向列表中添加数据(添加多个数据)Long pushAll = listOperations.leftPushAll("字母","A","B","C","d","e","f");//2.查询列表中所有数据List range = listOperations.range("字母", 0, -1);//返回结果为list集合类,用增强for循环for (Object object : range) {System.out.println("object = " + object);}}

 3.4使用spring data redis操作的方式进行set类型数据的操作

/*** 操作Set类型的数据*/@Testpublic void testSet(){/**** @author dlwlrma* @date 2024/6/15 16:18* TODO: 1.向set集合中添加数据*       2.获取指定set集合的所有的元素*       3.删除指定set集合的数据*///获取取执行set操作的接口对象SetOperations setOperations = redisTemplate.opsForSet();//        //1.向set集合中添加数据
//        setOperations.add("年龄","18","20");//2.获取指定set集合的所有的元素//该方法类似于在redis客户端操作获取所有元素的命令: smembers 键Set members = setOperations.members("年龄");//返回的set集合,用增强for循环for (Object member : members) {System.out.println("member = " + member);}//3.删除指定set集合的数据Long l = setOperations.remove("年龄", "18","60");System.out.println("l = " + l);}

 3.5使用spring data redis操作的方式进行zset类型数据的操作 

 /*** 操作ZSet类型的数据*/@Testpublic void testZset(){/**** @author dlwlrma* @date 2024/6/15 16:39* TODO: 1.向zset中添加数据*       2.从zset中取出数据*       3.对某个值的分数进行加20*       4.删除数据*///获取执行zset的接口对象ZSetOperations zSetOperations = redisTemplate.opsForZSet();//1.向zset中添加数据zSetOperations.add("myzset","杜伊",10);zSetOperations.add("myzset","张三",25);zSetOperations.add("myzset","李四",5);zSetOperations.add("myzset","王五",30);//2.从zset中取出数据Set<String> myzset = zSetOperations.range("myzset", 0, -1);//根据分数值从小到大开始排序for (String object : myzset) {System.out.println("object = " + object);}//3.对某个值的分数进行加50//incrementScor() 中的三个参数表示: 键 字段值 加的分数Double score = zSetOperations.incrementScore("myzset","李四",50);System.out.println("score = " + score);//4.删除数据Long l = zSetOperations.remove("myzset", "杜伊", "王五");System.out.println("l = " + l);//5.取值Set<ZSetOperations.TypedTuple> set = zSetOperations.rangeWithScores("myzset",0,-1);for (ZSetOperations.TypedTuple typedTuple : set) {Object value = typedTuple.getValue();Double score1 = typedTuple.getScore();System.out.println(value +"------------"+score1);}}

  3.6使用spring data redis操作的方式进行通用类型数据的操作 

/*** 通用操作,针对不同的数据类型都可以操作*/@Testpublic void testCommon(){/**** @author dlwlrma* @date 2024/6/15 17:04* TODO: 需求:1.获取Redis中所有的key*            2.判断某个key是否存在*            3.删除指定key*            4.获取指定key对应的value的数据类型*///1.获取Redis中所有的key//*表示通配符Set<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println("key = " + key);}//2.判断某个key是否存在Boolean b = redisTemplate.hasKey("字母");System.out.println("b = " + b);//3.删除指定keyBoolean b1 = redisTemplate.delete("第二号");System.out.println("b1 = " + b1);//4.获取指定key对应的value的数据类型DataType type = redisTemplate.type("age");System.out.println(type.name());}

总结:

Jedis是一个Java的Redis客户端,而Spring Data Redis是一个针对Redis的数据访问和集成框架。

Jedis的优点:
1. 简单易用:Jedis提供了直接与Redis进行交互的方法和API,使用起来非常简单和直观。
2. 功能全面:Jedis支持Redis的所有功能和命令,可以满足大多数开发需求。
3. 性能高效:Jedis使用线程池和连接池来管理与Redis的连接,可以实现高并发的数据访问。

Jedis的缺点:
1. 功能相对有限:Jedis只提供了与Redis交互的基本方法和API,对于高级的数据操作和查询可能需要自己编写复杂的代码。
2. 手动管理连接:Jedis需要手动管理与Redis的连接,包括连接的获取、释放和异常处理,增加了开发的复杂性。

Spring Data Redis的优点:
1. 简化开发:Spring Data Redis提供了丰富的功能和API,可以通过简洁的代码实现复杂的数据操作和查询,大大简化了开发工作。
2. 集成方便:Spring Data Redis与Spring框架紧密集成,可以方便地与其他Spring组件(如Spring Boot)一起使用。
3. 自动管理连接:Spring Data Redis可以自动管理与Redis的连接,包括连接的获取、释放和异常处理,减少了开发的复杂性。

Spring Data Redis的缺点:
1. 学习曲线较陡:Spring Data Redis提供了丰富的功能和注解,但相对于Jedis而言,学习和理解其使用方法可能需要一些时间和精力。
2. 性能相对较低:由于Spring Data Redis提供了更高级的功能和抽象,可能会带来一些性能损失,尤其在高并发场景下。

综上所述,Jedis适合对Redis的基本功能进行简单操作的场景,而Spring Data Redis适合需要更高级功能和更方便集成的场景。选择哪个取决于具体的开发需求和项目情况。

相关文章:

Java操作redis

目录 一&#xff1a;Jedis 二&#xff1a;使用Spring Data Redis Redis 的 Java 客户端很多&#xff0c;官方推荐的有三种&#xff1a; 1.Jedis 2.Lettuce 3.Redisson 同时&#xff0c;Spring 对 Redis 客户端进行了整合&#xff0c;提供了 Spring Data Redis&#xff0c;在S…...

【数据结构(邓俊辉)学习笔记】图03——拓扑排序

文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事&#xff0c;如编讲义&#xff0c;将已经知道的知识点串起来变成讲课序列。那…...

C#参数使用场景简要说明

C#参数使用场景简要说明 1、传值参数 方法、类成员的初始化 2、输出参数 方法返回值不能满足&#xff0c;需要多个返回值时&#xff1b; 3、引用参数 方法需要修改变量需带回原变量时&#xff1b; 4、具名参数 代码可读性高&#xff0c;参数可交换位置 5、方法扩展&#xff08…...

线性代数|机器学习-P10最小二乘法的四种方案

文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候&#xff0c;就会用到 最小二乘法 .根据矩阵A的情况&#xff0c;有如下四种方法 在r n m 时&#xff0c;SVD奇异…...

【Android面试八股文】你能描述一下JVM中的类加载过程吗?

文章目录 一、Java类的生命周期二、JVM类加载过程1. 加载(Loading)2. 链接(Linking)a. 验证(Verification)b. 准备(Preparation)b.1 准备阶段的初始值b.2 用户定义的初值b.3 常量的初始化c. 解析(Resolution)3. 初始化(Initialization)3.1 什么是 `<clinit>`…...

MYSQL八、MYSQL的SQL优化

一、SQL优化 sql优化是指&#xff1a;通过对sql语句和数据库结构的调整&#xff0c;来提高数据库查询、插入、更新和删除等操作的性能和效率。 1、插入数据优化 要一次性往数据库表中插入多条记录&#xff1a; insert into tb_test values(1,tom); insert into tb_tes…...

鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS

1、LFS文件系统结构体介绍 会分2部分来介绍结构体部分&#xff0c;先介绍LittleFS文件系统的结构体&#xff0c;然后介绍LiteOS-M内核中提供的和LittleFS相关的一些结构体。 1.1 LittleFS的枚举结构体 在openharmony/third_party/littlefs/lfs.h头文件中定义LittleFS的枚举、…...

【ARMv8/ARMv9 硬件加速系列 3 -- SVE 指令语法及编译参数详细介绍】

文章目录 SVE 汇编语法SVE 单通道谓词SVE 测试代码 SVE 软件和库支持SVE 编译参数配置-marcharmv8-alseprofilememtagsve2-aessve2-bitpermcryptosve2sve2-sha3sve2-sm4 SVE 汇编语法 在介绍 SVE 汇编指令语法之前&#xff0c;先介绍下如何判断自己所使用的芯片是否实现了SVE功…...

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开

Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统&#xff08;Hospital Information System简称HIS&#xff09;是一门医学、信息、管理、计算机等多种学科为一体的边缘科学&#xff…...

工业机器人远程运维,增强智慧工厂运营管理

1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加&#xff0c;制造业对于生产线稳定性和效率的要求不断提高。然而&#xff0c;传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题&#xff0c;迫切需要一种更具灵活性和效率的监控方式。…...

理解Python的元类

1.type()函数 type 函数是一个内置函数&#xff0c;用来获取一个对象的类型。它可以接受一个参数&#xff0c;返回这个参数的数据类型。type也可以用来创建类&#xff0c;type就是元类 x333 list["ab"] tuple (1, "a", True, 3.14) dict {name: Alice,…...

web前端黑马下载:探索学习资源的海洋

web前端黑马下载&#xff1a;探索学习资源的海洋 在数字化时代&#xff0c;Web前端技术日益成为互联网行业的核心驱动力。为了跟上这一趋势&#xff0c;众多学习者纷纷投身于Web前端的学习之中。而在这个过程中&#xff0c;“黑马”作为一个备受瞩目的品牌&#xff0c;其Web前…...

最新版jd-gui下载

对于java开发的工程师来说&#xff0c;jd-gui应该是经常会用到的工具了 官网的jd-gui目前只支持到JAVA13&#xff0c;更新版本JAVA编译出来的JAR包就反编译不出来了 此版本支持到了JAVA23 如果需要win以外的其他版本&#xff0c;可以查看我的其他上传 如果不想花积分&#…...

(051)FPGA时钟--->(001)时钟介绍

(001)时钟介绍 1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时钟介绍 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电…...

Java程序员英语单词通关:

Java程序员英语单词通关&#xff1a; abstract - 抽象的 boolean - 布尔值 break - 打断 byte - 字节 case - 情况&#xff0c;实例 catch - 捕获 char - 字符 class - 类 continue - 继续 default - 默认&#xff0c;通常 do - 做&#xff0c;运行 double - 双精度…...

数据库开发-Mysql03

目录 1. 多表查询 1.1 概述 1.1.1 数据准备 1.1.2 介绍 1.1.3 分类 1.2 内连接 1.3 外连接 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 1.5 案例 2. 事务 2.1 介绍 2.2 操作 2.3 四大特性 3. 索引 3.1 介绍 3…...

0-1 背包问题(动态规划 查询背包元素)

描述 给定n种物品和一个背包&#xff0c;物品i的重量是Wi​&#xff0c;其价值为Vi​&#xff0c;问如何选择装入背包的物品&#xff0c;使得装入背包的物品的总价值最大&#xff1f; 在选择装入背包的物品时&#xff0c;对每种物品i只能有两种选择&#xff0c;装入或者不装入…...

elasticsearch快照生成与恢复

Elasticsearch快照生成与恢复的场景主要涉及到数据的备份与恢复需求。当需要对Elasticsearch集群中的数据进行备份&#xff0c;或者在数据丢失、损坏等情况下需要恢复数据时&#xff0c;就可以使用快照功能。 快照生成的方法通常包括以下步骤&#xff1a; 1、创建一个快照仓库…...

178.二叉树:最大二叉树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…...

跨境电商中的IP隔离是什么?怎么做?

一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时&#xff0c;我们实际上是在讨论一种网络安全策略&#xff0c;旨在通过技术手段将网络划分为不同的区域或子网&#xff0c;每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...