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

SpringBoot | Spring Boot“整合Redis“

目录:

    • 1. Redis 介绍
    • 2. Redis 下载安装
    • 3. Redis “服务开启”和“连接配置”
    • 4. Spring Boot整合Redis的“前期准备” :
      • ① 编写实体类
      • ② 编写Repository 接口
      • ③ 在“全局配置文件”中添加 “Redis数据库” 的 “相关配置信息”
    • 5. Spring Boot整合“Redis” (案例展示)

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Boot企业级开发教程》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


  • Spring Boot 除了关系型数据库整合支持 外,Spring Boot非关系型数据库 也提供了非常好的支持。如 : Spring Boot非关系型数据库Redis整合使用

1. Redis 介绍

  • Redis 是一个 开源(BSD 许可)的、内存 中的 数据结构存储系统 ,它可以用作 数据库缓存消息中间件,并提供多种语言的API

  • Redis 支持 多种类型数据结构,例如 字符串(strings)散列( hashes )列表( lists )集合( sets)等。同时,Redis内部内置复本(replication)LUA 脚本( Lua scripting )LRU 驱动事件( LRU eviction )事务(Transaction)不同级别的磁盘持久化( persistence ),并通过Redis Sentinel自动分区提供高可用性( high availability )。相较于其他的 key-value 键值存储系统而言

    Redis主要有以下优点
    存取速度快 : Redis 速度非常快每秒可执行大约 110000次设值操作,或者执行 81000 次读取操作

    支持丰富的数据类型 : Redis 支持开发人员常用的大多数数据类型,例如列表集合排序集散列等

    操作具有原子性 : 所有 Redis 操作 都是 原子操作,这确保如果两个客户端并发访问Redis服务器接收更新后的值

    提供多种功能 : Redis 提供了多种功能特性,可用作非关系型数据库缓存中间件消息中间件等

2. Redis 下载安装

  • Redis下载安装
    Redis入门 (Redis下载安装)-跳转博客

3. Redis “服务开启”和“连接配置”

  • 完成 Redis下载安装后启动Redis 服务,并使用 可视化客户端工具 连接对应的Redis
    服务进行效果测试具体操作步骤如下 :

    (1) 开启Redis服务

    (2) Redis可视化客户端工具正常安装连接

    Redis入门 (Redis “服务开启”和“连接配置”)-跳转博客

4. Spring Boot整合Redis的“前期准备” :

① 编写实体类

  • 编写实体类中最重要的是懂得使用SpringBoot整合Redis中的常用注解

    注解描述
    @RedisHash( " 存储空间的名称" )注解用于指定操作 实体类对象Redis 数据库 中的 存储空间
    :
    @RedisHash(“persons”) 表示此处的的Redis数据都存储在 Redis 数据库中 名为 persons存储空间 下。
    @ld注解用于 标识实体类 “主键”。在Redis数据库中会 默认生成“字符串形式”HashKey唯一 的实体对象id,当然也可以在数据存储手动指定id
    @Indexed注解用于 标识 “对应属性”Redis数据库生成二级索引使用该注解后会在Redis数据库中生成属性对应二级索引索引名称就是属性名,可以方便地进行数据条件查询
  • 例子如 :

    person.java( 实体类 ) :

    package com.myh.chapter_08.domain;import org.springframework.data.annotation.Id;
    import org.springframework.data.redis.core.RedisHash;
    import org.springframework.data.redis.core.index.Indexed;@RedisHash("RedisPersonInfo") //将要存储的数据都存储在Redis数据库中的RedisPersonInfo的这个命名空间下
    public class Person {@Id //标识“实体类”的“主键”private String id;//在redis数据库中生成“属性”对应的“二级索引”@Indexed //表述该属性,在redis数据库中生成"二级索引" (“索引名”就是“属性名”)private String firstname;@Indexed //在数据库中生成“属性”对应的“二级索引”private String lastname;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getFirstname() {return firstname;}public void setFirstname(String firstname) {this.firstname = firstname;}public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}@Overridepublic String toString() {return "Person{" +"id='" + id + '\'' +", firstname='" + firstname + '\'' +", lastname='" + lastname + '\'' +'}';}public Person(String id, String firstname, String lastname) {this.id = id;this.firstname = firstname;this.lastname = lastname;}public Person() { //无参构造方法}
    }
    

    Address.java :

    package com.myh.chapter_08.domain;import org.springframework.data.annotation.Id;
    import org.springframework.data.redis.core.RedisHash;
    import org.springframework.data.redis.core.index.Indexed;public class Address {@Indexed //表述该属性,在redis数据库中生成"二级索引" (“索引名”就是“属性名”)private String city;@Indexed //在数据库中生成“属性”对应的“二级索引”private String country;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}@Overridepublic String toString() {return "Address{" +"city='" + city + '\'' +", country='" + country + '\'' +'}';}public Address(String city, String country) {this.city = city;this.country = country;}public Address() {}}
    

    Address.java :

    package com.myh.chapter_08.domain;import org.springframework.data.redis.core.index.Indexed;public class Family {@Indexedprivate String type;@Indexedprivate String username;public String getType() {return type;}public void setType(String type) {this.type = type;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Family(String type) {this.type = type;}@Overridepublic String toString() {return "Family{" +"type='" + type + '\'' +", username='" + username + '\'' +'}';}public Family(String type, String username) {this.type = type;this.username = username;}public Family() { //无参构造方法}
    }
    

② 编写Repository 接口

  • Spring Boot 针对包括 Redis在内 的一些 常用数据库 提供了 自动化配置,可以通过 实现 Repository接口 简化数据库中的数据进行增删改查操作,这些操作方法 Spring Data JPA操作数据使用方法基本相同,可以使用方法名关键字行数据操作

    (方法名关键字查询(也称为 方法名约定查询)是一种 约定大于配置查询方式。这种方式允许开发者通过简单的方法命名定义查询 ( 方法的命名是有一定的规律的 ) )

  • 例子如

    PersonRepository.java ( Repository接口 )

    package com.myh.chapter_08.Repository.Repository;import com.myh.chapter_08.domain.Person;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.repository.CrudRepository;import java.util.List;//CrudRepository<T, ID> , T表示实体类对象类型; ID表示实体类中的主键的“类型”
    public interface PersonRepository extends CrudRepository<Person,String> { //Person类对应的"Repository接口" : 该接口中为"操作数据库"的"方法"/*** 使用"方法名关键字" 的方式进行数据操作 :**///根据lastname属性值进行数据查询//相当于 select * from 表名 where lastname = ?1List<Person> findByLastname(String lastname);//根据lastname属性进行“分页查询”//findPersonByLastname 中的 Person表示“最后的返回值”为Person类型对象 (当然还要结合形成“分页效果”)Page<Person> findPersonByLastname(String lastname, Pageable page);//根据firstname 和 lastname两个参数进行数据查询//相当于 select * from 表名 where firstname = ?1 and lastname = ?2List<Person> findByFirstnameAndLastname(String firstname, String lastname);/*根据city属性进行查询 (但这个city属性为Person对象中的Address对象类型属性中的子属性),所以用Address_City这种表示形式findByAddress_City 本质上和 findByLastname 都是“同一种” "方法名关键字查询"的方式 (Address_City 表示 Address对象属性中的子属性)*/List<Person> findByAddress_City(String city); //根据City属性查询数据/*findByFamilyList_Username 本质上和 findByLastname都是“同一种” "方法名关键字查询"的方式 (FamilyList_Username 表示 Family对象属性中的子属性)*/List<Person> findByFamilyList_Username(String usernmae); //根据usernmae属性查询数据}
    

    上面的代码中PersonRepository接口 继承CrudRepository接口,该接口中定义了若干查询方法。需要说明的是,在 操作Redis 数据库时编写的 Reposiitory 接口 文件 需要继承CrudRepository接口,而 不是继承JpaRepository,这是因为 JpaReposiitorySpring Boot 整合 JPA特有的。当然,也可以在项目pom.xml 文件中同时导入Spring Boot 整合的 JPA 依赖Redis依赖这样就可以编写一个继承JpaRepository接口操作 Redis数据库了。

③ 在“全局配置文件”中添加 “Redis数据库” 的 “相关配置信息”

#配置Redis数据库连接信息/连接参数
#Redis服务器地址
spring.redis.host = 127.0.0.1
#Redis服务器连接端口(默认为6379)
spring.redis.port=6379
#Redis服务连接器密码(默认为空)
spring.redis.password=root

上述代码中,在Spring Boot项目的全局配置文件application.properties 中额外添加了 Redis数据库的相关配置信息,这与之前介绍的使用 Redis 客户端可视化工具连接设置的参数基本一致。除了一些基本配置外,还可以根据需要添加Redis数据库相关的其他配置

注意点
在上述示例 application.properties 中主要配置了Redis数据库服务地址端口号,而Spring Boot内部默认 Redis服务地址为本机( localhost127.0.0.1),服务端口号6379,这与前面开启的Redis服务一致,所以这种情况省略上述配置仍可以正常连接访问本地开启的Redis服务

5. Spring Boot整合“Redis” (案例展示)

  • Spring Boot整合“Redis” ,例子如 :

    创建项目
    在这里插入图片描述

    Address.java :

    package com.myh.chapter_08.domain;import org.springframework.data.annotation.Id;
    import org.springframework.data.redis.core.RedisHash;
    import org.springframework.data.redis.core.index.Indexed;public class Address {@Indexed //表述该属性,在redis数据库中生成"二级索引" (“索引名”就是“属性名”)private String city;@Indexed //在数据库中生成“属性”对应的“二级索引”private String country;//省略属性的get、set方法//省略有参和无参构造方法//省略toString()方法public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}@Overridepublic String toString() {return "Address{" +"city='" + city + '\'' +", country='" + country + '\'' +'}';}public Address(String city, String country) {this.city = city;this.country = country;}public Address() {}
    }
    

    Family.java :

    package com.myh.chapter_08.domain;import org.springframework.data.redis.core.index.Indexed;public class Family {@Indexedprivate String type;@Indexedprivate String username;//省略属性的get、set方法//省略有参和无参构造方法//省略toString()方法public String getType() {return type;}public void setType(String type) {this.type = type;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Family(String type) {this.type = type;}@Overridepublic String toString() {return "Family{" +"type='" + type + '\'' +", username='" + username + '\'' +'}';}public Family(String type, String username) {this.type = type;this.username = username;}public Family() { //无参构造方法}
    }
    

    Person.java :

    package com.myh.chapter_08.domain;import org.springframework.data.annotation.Id;
    import org.springframework.data.redis.core.RedisHash;
    import org.springframework.data.redis.core.index.Indexed;import java.util.List;@RedisHash("RedisPersonInfo") //将要存储的数据都存储在Redis数据库中的RedisPersonInfo的这个命名空间下
    public class Person {@Id //标识“实体类”的“主键”private String id;//在redis数据库中生成“属性”对应的“二级索引”@Indexed //表述该属性,在redis数据库中生成"二级索引" (“索引名”就是“属性名”)private String firstname;@Indexed //在数据库中生成“属性”对应的“二级索引”private String lastname;private Address address;private List<Family> familyList;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getFirstname() {return firstname;}public void setFirstname(String firstname) {this.firstname = firstname;}public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public List<Family> getFamilyList() {return familyList;}public void setFamilyList(List<Family> familyList) {this.familyList = familyList;}@Overridepublic String toString() {return "Person{" +"id='" + id + '\'' +", firstname='" + firstname + '\'' +", lastname='" + lastname + '\'' +", address=" + address +", familyList=" + familyList +'}';}public Person(String id, String firstname, String lastname, Address address, List<Family> familyList) {this.id = id;this.firstname = firstname;this.lastname = lastname;this.address = address;this.familyList = familyList;}public Person() { //无参构造方法}public Person(String firstname, String lastname) {this.firstname = firstname;this.lastname = lastname;}
    }
    

    PersonRepository.java :

    package com.myh.chapter_08.Repository.Repository;import com.myh.chapter_08.domain.Person;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.repository.CrudRepository;import java.util.List;//CrudRepository<T, ID> , T表示实体类对象类型; ID表示实体类中的主键的“类型”
    public interface PersonRepository extends CrudRepository<Person,String> { //Person类对应的"Repository接口" : 该接口中为"操作数据库"的"方法"/*** 使用"方法名关键字" 的方式进行数据操作 :**///根据lastname属性值进行数据查询//相当于 select * from 表名 where lastname = ?1List<Person> findByLastname(String lastname);//根据lastname属性进行“分页查询”//findPersonByLastname 中的 Person表示“最后的返回值”为Person类型对象 (当然还要结合形成“分页效果”)Page<Person> findPersonByLastname(String lastname, Pageable page);//根据firstname 和 lastname两个参数进行数据查询//相当于 select * from 表名 where firstname = ?1 and lastname = ?2List<Person> findByFirstnameAndLastname(String firstname, String lastname);/*根据city属性进行查询 (但这个city属性为Person对象中的Address对象类型属性中的子属性),所以用Address_City这种表示形式findByAddress_City 本质上和 findByLastname 都是“同一种” "方法名关键字查询"的方式 (Address_City 表示 Address对象属性中的子属性)*/List<Person> findByAddress_City(String city); //根据City属性查询数据/*findByFamilyList_Username 本质上和 findByLastname都是“同一种” "方法名关键字查询"的方式 (FamilyList_Username 表示 Family对象属性中的子属性)*/List<Person> findByFamilyList_Username(String usernmae); //根据usernmae属性查询数据}
    

    application.properties :

    #配置Redis数据库连接信息/连接参数
    #Redis服务器地址
    spring.redis.host = 127.0.0.1
    #Redis服务器连接端口(默认为6379)
    spring.redis.port=6379
    #Redis服务连接器密码(默认为空)
    spring.redis.password=root
    

    pom.xml :

    <?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>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.myh</groupId><artifactId>chapter_08</artifactId><version>0.0.1-SNAPSHOT</version><name>chapter_08</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test</scope></dependency></dependencies><!--    <build>-->
    <!--        <plugins>-->
    <!--            <plugin>-->
    <!--                <groupId>org.springframework.boot</groupId>-->
    <!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
    <!--            </plugin>-->
    <!--        </plugins>-->
    <!--    </build>--></project>
    

    Chapter08ApplicationTests.java :

    package com.myh.chapter_08;import com.myh.chapter_08.Repository.Repository.PersonRepository;
    import com.myh.chapter_08.domain.Address;
    import com.myh.chapter_08.domain.Family;
    import com.myh.chapter_08.domain.Person;
    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;
    import java.util.List;@RunWith(SpringRunner.class)
    @SpringBootTest
    class Chapter08ApplicationTests {@Autowiredprivate PersonRepository personRepository;@Testpublic void savePerson() {Person person = new Person("张", "有才");Person person2 = new Person("James", "Harden");//创建并添加地址信息Address address = new Address("北京", "China");person.setAddress(address);//创建并添加家庭成员List<Family> list = new ArrayList<>();Family dad = new Family("父亲", "张良");Family mom = new Family("母亲", "李香君");list.add(dad);list.add(mom);person.setFamilyList(list);//向Redis数据库添加数据Person save = personRepository.save(person);Person save2 = personRepository.save(person2);System.out.println(save);System.out.println(save2);System.out.println("向Redis数据库中插入成功");}@Testpublic void selectPerson() {List<Person> list = personRepository.findByAddress_City("北京");System.out.println(list);}@Testpublic void updatePerson() {Person person = personRepository.findByFirstnameAndLastname("张", "有才").get(0);//修改该对象的属性值person.setLastname("小明");Person update = personRepository.save(person);System.out.println(update);}@Testpublic void deletePerson() {Person person = personRepository.findByFirstnameAndLastname("张", "小明").get(0);personRepository.delete(person);//删除Redis数据库中的数据System.out.println("删除Redis数据库中的数据成功!");}
    }
    

相关文章:

SpringBoot | Spring Boot“整合Redis“

目录: 1. Redis 介绍2. Redis 下载安装3. Redis “服务开启”和“连接配置”4. Spring Boot整合Redis的“前期准备” :① 编写实体类② 编写Repository 接口③ 在“全局配置文件”中添加 “Redis数据库” 的 “相关配置信息” 5. Spring Boot整合“Redis” (案例展示) 作者简介…...

SV学习笔记(四)

OCP Open Closed Principle 开闭原则 文章目录 随机约束和分布为什么需要随机&#xff1f;为什么需要约束&#xff1f;我们需要随机什么&#xff1f;声明随机变量的类什么是约束权重分布集合成员和inside条件约束双向约束 约束块控制打开或关闭约束内嵌约束 随机函数pre_random…...

Midjourney艺术家分享|By Moebius

Moebius&#xff0c;本名让吉拉德&#xff08;Jean Giraud&#xff09;&#xff0c;是一位极具影响力的法国漫画家和插画师&#xff0c;以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价&#xff0c;也为电影、时尚和广告等多个领域提供了灵感。…...

Vue - 1( 13000 字 Vue 入门级教程)

一&#xff1a;Vue 导语 1.1 什么是 Vue Vue.js&#xff08;通常称为Vue&#xff09;是一款流行的开源JavaScript框架&#xff0c;用于构建用户界面。Vue由尤雨溪在2014年开发&#xff0c;是一个轻量级、灵活的框架&#xff0c;被广泛应用于构建单页面应用&#xff08;SPA&am…...

Vue关键知识点

watch侦听器 Vue.js 中的侦听器&#xff08;Watcher&#xff09;是 Vue提供的一种响应式系统的核心机制之一。 监听数据的变化&#xff0c;并在数据发生变化时执行相应的回调函数。 目的:数据变化能够自动更新到视图中 原理&#xff1a; Vue 的侦听器通过观察对象的属性&#…...

Prometheus+grafana环境搭建redis(docker+二进制两种方式安装)(四)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前三篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环境搭建m…...

宝塔面板安装nginx流媒体服务器(http-flv)

前文介绍了使用nginx搭建流媒体服务器,实现了hls切片方式播放,不过延迟较长。本文采用nginx搭建支持http-flv方式的流媒体服务器,用以测试期性能。 目录 一、服务器操作系统安装 二、在控制台安装宝塔面板...

LNMP环境:揭秘负载均衡与高可用性设计

lb1: 192.168.8.5 lb2: 192.168.8.6 web1:192.168.8.7 web2:192.168.8.8 php-fpm: 192.168.8.9 mysql: 192.168.8.10 nfs:192.168.8.11 分别插入镜像 8.5-8.8 分别安装nginx,并设置启动 8.9 安装php 8.10 安装mysql 先配置一台web服务器然后同步 设置网站根目录 cp -…...

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…...

Docker实战教程 第1章 Linux快速入门

2-1 Linux介绍 为什么要学Linux 三个不得不学习 课程需要&#xff1a;Docker开发最好在Linux环境下。 开发需要&#xff1a;作为一个后端程序员&#xff0c;是必须要掌握Linux的&#xff0c;这是找工作的基础门槛。 运维需要&#xff1a;在服务器端&#xff0c;主流的大型服…...

java数据结构与算法刷题-----LeetCode172. 阶乘后的零

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学&#xff1a;阶乘的10因子个数数学优化:思路转变为求5的倍数…...

掌握数据相关性新利器:基于R、Python的Copula变量相关性分析及AI大模型应用探索

在工程、水文和金融等各学科的研究中&#xff0c;总是会遇到很多变量&#xff0c;研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果&#xff0c;但这些系数都存在着无法克服的困难。例如&#xff0c;…...

Centos7环境下安装MySQL8详细教程

1、下载mysql安装包 下载哪个版本&#xff0c;首先需要确定一下系统的glibc版本&#xff0c;使用如下命令&#xff1a; rpm -qa | grep glibc ​​​​​​​ 2、检查是否安装过mysql ps:因为以前用yum安装过&#xff0c;所以先用yum卸载。如果不是此方式或者没安装过则跳过…...

趣学前端 | 综合一波CSS选择器的用法

背景 最近睡前习惯翻会书&#xff0c;重温了《HTML5与CSS 3权威指南》。这本书&#xff0c;分上下两册&#xff0c;之前读完了上册&#xff0c;下册基本没翻过。为了对得起花过的每一分钱&#xff0c;决定拾起来近期读一读。 CSS 选择器 在CSS3中&#xff0c;提倡使用选择器…...

数据库 06-04 恢复

01 一.事务故障 二.系统 三.磁盘 02. 重点是稳定存储器 组成...

基于MPPT的风力机发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1风能与风力发电机模型 4.2风力机功率特性与最大功率点 4.3 MPPT 5.完整工程文件 1.课题概述 基于MPPT的风力机发电系统simulink建模与仿真。MPPT使用S函数编写实现。基于最大功率点跟踪&#xff08…...

GD32F30x IO 复用问题

1.PE9 复用PWM 引脚 需要使能 gpio_pin_remap_config(GPIO_TIMER0_FULL_REMAP,ENABLE);...

BPMNJS 在原生HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不…...

HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问

场景介绍 典型跨应用访问数据的用户场景下&#xff0c;数据提供方会存在多次被拉起的情况。 为了降低数据提供方拉起次数&#xff0c;提高访问速度&#xff0c;OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式&#xff0c;即静默数据访问。 静默数据访问通过数据…...

ubuntu强密码支持

接到新需求&#xff0c;欧盟需要ubuntu使用强密码&#xff0c;网络上找到一个包可以增加ubuntu密码增强机制&#xff0c;以下是调试过程。 sudo apt-get install libpam-pwquality 然后&#xff0c;编辑位于/etc/pam.d/目录中的common-password文件&#xff1a; sudo vim /et…...

一分钟看懂大模型备案

大模型备案&#xff0c;全称 “生成式人工智能服务上线备案”&#xff0c;是国内面向公众提供大模型服务的法定合规流程&#xff0c;核心是审核模型安全、数据合规与内容可控&#xff0c;未备案违规上线最高罚一千万元&#xff0c;该处罚依据主要来自两大核心法规&#xff1a;1…...

微信消息自动转发终极指南:5分钟实现跨群智能消息同步

微信消息自动转发终极指南&#xff1a;5分钟实现跨群智能消息同步 【免费下载链接】wechat-forwarding 在微信群之间转发消息 项目地址: https://gitcode.com/gh_mirrors/we/wechat-forwarding 在微信群管理和协作场景中&#xff0c;消息的自动转发与同步是提升效率的关…...

基于LLM的多智能体协作框架:从原理到实践构建自主开发团队

1. 项目概述与核心价值最近在开源社区里&#xff0c;一个名为zxkane/autonomous-dev-team的项目引起了我的注意。乍一看这个标题&#xff0c;你可能会联想到科幻电影里的全自动机器人编程&#xff0c;或者是一些过于理想化的“AI接管开发”的噱头。但在我花时间深入研究和实践之…...

2026年医疗卫生/护理求职AI工具横评:白衣天使的求职神器大比拼

导语 2026年&#xff0c;医疗卫生行业依然是最具社会价值和就业稳定性的行业之一。随着中国老龄化加速&#xff0c;医护人员需求持续扩大&#xff0c;仅公立医院护士岗位需求量就突破200万。然而&#xff0c;医护求职并不轻松&#xff1a;编制紧张、规培政策复杂、职称考试压力…...

混元图像3.0对话P图技术解析:本地化可控生成新范式

1. 项目概述&#xff1a;这不是又一个“AI修图”功能&#xff0c;而是本地化P图工作流的临界点“腾讯混元图像3.0图生图模型上线&#xff0c;元宝也支持对话P图啦&#xff01;”——这句话在科技圈刷屏那天&#xff0c;我正用本地部署的Stable Diffusion给客户改第十版电商主图…...

构建AI长短期记忆系统:从向量检索到混合架构的工程实践

1. 项目概述&#xff1a;当AI开始拥有“记忆”最近在折腾一个挺有意思的东西&#xff0c;我把它叫做“Memory Bear”。这名字听起来有点萌&#xff0c;但内核其实挺硬核的。简单来说&#xff0c;它不是一个具体的产品&#xff0c;而是一套关于如何让AI系统拥有更接近人类“记忆…...

渗透PHP伪协议

一、debug调试 1、定义 Debug&#xff0c;又叫断点调试&#xff0c;就是对写好的程序进行逐步运行、分解、调试的过程&#xff0c;通过这个过程&#xff0c;我们可以跟踪程序的详细运行过程&#xff0c; 是程序员的开发神器&#xff0c;也是开发必会的一个重要技能。 2、意义…...

WeChatMsg:如何用开源工具构建你的个人数字记忆库

WeChatMsg&#xff1a;如何用开源工具构建你的个人数字记忆库 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg…...

深度解析VMDE:Windows系统虚拟机检测的终极武器

深度解析VMDE&#xff1a;Windows系统虚拟机检测的终极武器 【免费下载链接】VMDE Source from VMDE paper, adapted to 2015 项目地址: https://gitcode.com/gh_mirrors/vm/VMDE 在网络安全研究的世界里&#xff0c;有一个永恒的问题困扰着分析师们&#xff1a;"我…...

Windows系统清理神器:DriverStore Explorer深度使用教程

Windows系统清理神器&#xff1a;DriverStore Explorer深度使用教程 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾经遇到过Windows系统盘空间莫名减少的情况&#xff1f;是否…...