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,这是因为 JpaReposiitory 是 Spring 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服务地址为本机( localhost 或 127.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 开闭原则 文章目录 随机约束和分布为什么需要随机?为什么需要约束?我们需要随机什么?声明随机变量的类什么是约束权重分布集合成员和inside条件约束双向约束 约束块控制打开或关闭约束内嵌约束 随机函数pre_random…...
Midjourney艺术家分享|By Moebius
Moebius,本名让吉拉德(Jean Giraud),是一位极具影响力的法国漫画家和插画师,以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价,也为电影、时尚和广告等多个领域提供了灵感。…...
Vue - 1( 13000 字 Vue 入门级教程)
一:Vue 导语 1.1 什么是 Vue Vue.js(通常称为Vue)是一款流行的开源JavaScript框架,用于构建用户界面。Vue由尤雨溪在2014年开发,是一个轻量级、灵活的框架,被广泛应用于构建单页面应用(SPA&am…...
Vue关键知识点
watch侦听器 Vue.js 中的侦听器(Watcher)是 Vue提供的一种响应式系统的核心机制之一。 监听数据的变化,并在数据发生变化时执行相应的回调函数。 目的:数据变化能够自动更新到视图中 原理: Vue 的侦听器通过观察对象的属性&#…...
Prometheus+grafana环境搭建redis(docker+二进制两种方式安装)(四)
由于所有组件写一篇幅过长,所以每个组件分一篇方便查看,前三篇 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)
异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面,异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式; 1.利用trycatchfinaly语句处理异常,优点是分开了处理异常代码和程序正常代码…...
Docker实战教程 第1章 Linux快速入门
2-1 Linux介绍 为什么要学Linux 三个不得不学习 课程需要:Docker开发最好在Linux环境下。 开发需要:作为一个后端程序员,是必须要掌握Linux的,这是找工作的基础门槛。 运维需要:在服务器端,主流的大型服…...
java数据结构与算法刷题-----LeetCode172. 阶乘后的零
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学:阶乘的10因子个数数学优化:思路转变为求5的倍数…...
掌握数据相关性新利器:基于R、Python的Copula变量相关性分析及AI大模型应用探索
在工程、水文和金融等各学科的研究中,总是会遇到很多变量,研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果,但这些系数都存在着无法克服的困难。例如,…...
Centos7环境下安装MySQL8详细教程
1、下载mysql安装包 下载哪个版本,首先需要确定一下系统的glibc版本,使用如下命令: rpm -qa | grep glibc 2、检查是否安装过mysql ps:因为以前用yum安装过,所以先用yum卸载。如果不是此方式或者没安装过则跳过…...
趣学前端 | 综合一波CSS选择器的用法
背景 最近睡前习惯翻会书,重温了《HTML5与CSS 3权威指南》。这本书,分上下两册,之前读完了上册,下册基本没翻过。为了对得起花过的每一分钱,决定拾起来近期读一读。 CSS 选择器 在CSS3中,提倡使用选择器…...
数据库 06-04 恢复
01 一.事务故障 二.系统 三.磁盘 02. 重点是稳定存储器 组成...
基于MPPT的风力机发电系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1风能与风力发电机模型 4.2风力机功率特性与最大功率点 4.3 MPPT 5.完整工程文件 1.课题概述 基于MPPT的风力机发电系统simulink建模与仿真。MPPT使用S函数编写实现。基于最大功率点跟踪(…...
GD32F30x IO 复用问题
1.PE9 复用PWM 引脚 需要使能 gpio_pin_remap_config(GPIO_TIMER0_FULL_REMAP,ENABLE);...
BPMNJS 在原生HTML中的引入与使用
BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程,竟然没有在HTML使用的示例,有也是很简单的介绍核心库的引入和使用,并没有涉及到扩展库。于是简单看了下,真的是一波三折,坎坎坷坷。不…...
HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问
场景介绍 典型跨应用访问数据的用户场景下,数据提供方会存在多次被拉起的情况。 为了降低数据提供方拉起次数,提高访问速度,OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式,即静默数据访问。 静默数据访问通过数据…...
ubuntu强密码支持
接到新需求,欧盟需要ubuntu使用强密码,网络上找到一个包可以增加ubuntu密码增强机制,以下是调试过程。 sudo apt-get install libpam-pwquality 然后,编辑位于/etc/pam.d/目录中的common-password文件: sudo vim /et…...
C语言中文分词 Friso的使用教程
Friso是使用C语言开发的一款高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入到其他程序中,例如:MySQL,PHP等。同时支持对UTF-8/GBK编码的切分。 官方地址:https://…...
MySQL中drop、truncate和delete的区别
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏:…...
Deep Image Prior
自监督的开创性工作 从简单分布到复杂分布的映射,本质上是将重建限制到某一流形,在流形上通过观测图像的数据保真项作为监督。 称之为先验也是很准确,流形就是先验。 这个扰动也很关键,本质上一个平滑正则项。直观理解是各种扰动…...
leetcode148. 排序链表
方法1:插入方法进行改进 class Solution {public ListNode sortList(ListNode head) {/*想法:设置两个指针first,last分别指向当前有序子链表的头和尾节点;并遍历链表,当遍历到的节点值大于last的值时,就将该节点插入到有序子链表…...
【深度学习环境配置】一文弄懂cuda,cudnn,NVIDIA Driver version,cudatoolkit的关系
【深度学习环境配置】一文弄懂cuda,cuDNN,NVIDIA Driver version,cudatoolkit的关系 NVIDIA Driver version(NVIDIA驱动程序)CUDAcuDNNcudatoolkit深度学习环境配置顺序 今天突然发现配置的环境有些问题,意…...
C语言中的字符与字符串:魔法般的函数探险
前言 在C语言的世界里,字符和字符串是两个不可或缺的元素,它们像是魔法般的存在,让文字与代码交织出无限可能。而在这个世界里,有一批特殊的函数,它们如同探险家,引领我们深入字符与字符串的秘境࿰…...
【JAVASE】带你了解面向对象三大特性之一(继承)
✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 1.继承 1.1 为什么需要继承 Java 中使用类对现实世界中实体来…...
Git 如何去使用
目录 1. Git暂存区的使用 1.1. 暂存区的作用 1.2. 暂存区覆盖工作区(注意:完全确认覆盖时使用) 1.3. 暂存区移除文件 1.4. 练习 2. Git回退版本 2.1. 概念 2.2. 查看提交历史 2.3. 回退命令 2.4. 注意 3. Git删除文件 3.1. 需求 …...
C语言 | Leetcode C语言题解之第12题整数转罗马数字
题目: 题解: const char* thousands[] {"", "M", "MM", "MMM"}; const char* hundreds[] {"", "C", "CC", "CCC", "CD", "D", "DC"…...
【软件工程】测试规格
1. 引言 1.1简介 本次的测试用例是基于核心代码基本开发完毕,在第一代系统基本正常运行后编写的,主要目的是为了后续开发与维护的便利性。 该文档主要受众为该系统后续开发人员,并且在阅读此文档前最后先阅读本系统的需求文档、概要设计文…...
大连城建设计研究院网站/深圳外包网络推广
1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C、java、Pascal等语言。gcc支持多种硬件平台。 2. gcc的特…...
扬中网站优化公司/百度大全下载
来源: http://www.jobcoding.com/array/one-sorted-array/rotate_array/ 1. 问题描述 已知有序数组a[N], 从中间某个位置k(k未知,k-1表示整个数组有序)分开,然后将前后两部分互换, 得到新的数组…...
大气绿色网站模板/绍兴seo推广公司
问题描述: 之前使用电脑管家满30min后,qq会自动加速0.2天,现在不加速了如下图: 解决办法:由于版本问题现在需要手动加速。 1、进入到个人中心:登陆电脑管家后,点击左上角自己的头像进入即可&am…...
网站建设流程案例/拓客团队怎么联系
我在github上写的文章,复制过来格式太乱,还是直接用链接吧。 http://sunmh207.github.io/2016/02/01/recommendcourses/...
旅游网站自己怎么做/免费建站哪个比较好
FAT32数据恢复原理结构:MBR-DBR-DBR2-FAT1-FAT2-DIR-DATA重点:FAT32数据恢复原理由于FAT与FDT对数据的链式存储管理的,可以通过链式搜索查找。只有FAT表和FDT配合使用,才能可以统一管理整个磁盘文件,也就可以准确定位被删除的文件…...
网络销售话术和技巧/外链seo招聘
JDialog 2011-08-29 15:16:33| 分类: JFC|字号 订阅 JDialog 用途 JDialog是创建对话框窗口的主要类,可以使用此类创建自定义的对话框。该类继承了AWT的Dialoglei,支持Swing体系结构的高级GUI属性。与JFrame类似,只不过JDialog…...