Alions 8.6 下 Redis 7.2.0 集群搭建和配置
Redis 7.2.0 搭建和集群配置
- 一.Redis 下载与单机部署
- 1.Redis 下载
- 2.虚拟机配置
- 3.Redis 单机源码安装和测试
- 4.Java 单机连接测试
- 1.Pom 依赖
- 2.配置文件
- 3.启动类
- 4.配置类
- 5.单元测试
- 6.测试结果
- 二.Redis 集群部署
- 1.主从
- 1.从节点配置
- 2.Java 测试
- 2.哨兵
- 1.哨兵节点配置
- 2.复制一个哨兵节点(双哨兵)
- 3.Java 测试访问哨兵
- 3.集群
- 1.集群配置文件修改
- 2.Java 访问 Redis 集群测试
一.Redis 下载与单机部署
1.Redis 下载
Redis 官网
2.虚拟机配置
## 1.关闭防火墙
systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
## 2.配置域名解析
echo '192.168.1.103 rd1' >> /etc/hosts
echo '192.168.1.104 rd2' >> /etc/hosts
echo '192.168.1.105 rd3' >> /etc/hosts
echo '192.168.1.106 rd4' >> /etc/hosts
echo '192.168.1.107 rd5' >> /etc/hosts
echo '192.168.1.108 rd6' >> /etc/hosts
关闭并禁用防火墙
3.Redis 单机源码安装和测试
## 1.解压缩
tar zxvf redis-7.2.0.tar.gz
## 2.进入源码安装目录
cd /home/redis-7.2.0/src/
## 3.编译和安装
make && make install PREFIX=/usr/local/redis
## 4.进入Redis解压目录
cd /home/redis-7.2.0/
## 5.修改配置
vim redis.conf
## 6.启动服务
/usr/local/redis/bin/redis-server redis.conf &
## 7.停止服务
kill -9 `ps aux |grep redis|grep -v grep | awk '{print $2}'`
以下行号仅供参考,增加配置后会有微小变动
行号 | 原值 | 新值 | 含义 |
---|---|---|---|
87 | bind 127.0.0.1 -::1 | bind 0.0.0.0 -::1 | 绑定地址 |
111 | protected-mode yes | #protected-mode no | 防火墙保护 |
533 | replicaof | replicaof rd1 6379 | 配置主节点(主从同步) |
541 | masterauth | masterauth 123456 | 配置主节点密码(主从同步) |
535 | requirepass 123456 | 密码(在空行添加) |
哨兵配置(可在配置哨兵模式时参考)
行号 | 原值 | 新值 | 含义 |
---|---|---|---|
92 | sentinel monitor | sentinel monitor mymaster 192.168.1.103 6379 1 | 哨兵初始监控的主机地址 |
112 | sentinel auth-pass mymaster MySUPER–secret-0123passw0rd | sentinel auth-pass mymaster 123456 | 哨兵配置主节点密码(保持所有节点密码一致,避免重新选取主节点后连接失败) |
170 | requirepass | requirepass 456789 | 哨兵密码 |
服务启动
连接测试
连接
4.Java 单机连接测试
1.Pom 依赖
<?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>redis-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>20</maven.compiler.source><maven.compiler.target>20</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.1.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.1.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version></dependency><!-- 测试类 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>3.1.2</version></dependency></dependencies>
</project>
2.配置文件
spring:data:redis:host: 192.168.1.103port: 6379password: 123456
3.启动类
package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author zhuwd && moon* @Description* @create 2023-08-22 22:28*/
@SpringBootApplication
public class RedisApp {public static void main(String[] args) {SpringApplication.run(RedisApp.class,args);}
}
4.配置类
package org.example.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;/*** @author zhuwd && moon* @Description* @create 2023-08-22 22:29*/
@Component
public class RedisConfig {private RedisConnectionFactory redisConnectionFactory;@Autowiredpublic void setRedisConnectionFactory(RedisConnectionFactory redisConnectionFactory) {this.redisConnectionFactory = redisConnectionFactory;}@Bean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(){RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 序列化keyredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());// 序列化hashredisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());// 连接redis数据库redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}
5.单元测试
import org.example.RedisApp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;/*** @author zhuwd && moon* @Description* @create 2023-08-22 22:29*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RedisApp.class)
public class TestApp {@AutowiredRedisTemplate<String, Object> redisTemplate;@Testpublic void test(){redisTemplate.opsForValue().set("test","haha");}
}
6.测试结果
查看值
二.Redis 集群部署
集群信息
Host | IP |
---|---|
rd1 | 192.168.1.103 |
rd2 | 192.168.1.104 |
rd3 | 192.168.1.105 |
rd4 | 192.168.1.106 |
rd5 | 192.168.1.107 |
rd6 | 192.168.1.108 |
## 1.将修改后的配置文件复制到安装目录
cp /home/redis-7.2.0/redis.conf /usr/local/redis/
1.主从
1.从节点配置
## 1.将 Redis 包拷贝到 rd2 / rd3
scp -r /usr/local/redis root@rd2:/usr/local/redis
scp -r /usr/local/redis root@rd3:/usr/local/redis
## 2.修改 rd2 / rd3 上 redis.conf 配置增加主节点信息 replicaof rd1 6379 / masterauth 123456
vi /usr/local/redis/redis.conf
## 3.依次启动 rd1 rd2 rd3
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
## 4.客户端连接
/usr/local/redis/bin/redis-cli
## 5.认证
auth 123456
Redis 安装包复制
增加主节点配置
主节点启动信息
从节点启动信息
查看主从信息
2.Java 测试
通过上面测试代码写入主节点
主从模式故障不支持自动恢复,需要人为处理,从节点读需要手动写读取代码
2.哨兵
1.哨兵节点配置
## 1.复制 redis 包到 rd4
scp -r /usr/local/redis root@rd4:/usr/local/redis
## 2.拷贝 sentinel 配置文件
scp -r /home/redis-7.2.0/sentinel.conf root@rd4:/usr/local/redis/
## 3.修改哨兵配置
# sentinel monitor <master-redis-name> <master-redis-ip> <master-redis-port> <quorum>
# quorum 表示当有多少个 sentinel 认为一个 master 失效时才算真正失效(取值参考 sentinels/2 + 1)
vi /usr/local/redis/sentinel.conf
## 将 92 行修改为 sentinel monitor mymaster 192.168.1.103 6379 1
## 在 112 行增加 sentinel auth-pass mymaster 123456
## 在 170 行增加 requirepass 123456
## 4.启动哨兵
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf &
## 5.查看信息
/usr/local/redis/bin/redis-cli -p 26379
127.0.0.1:26379> info
修改配置
哨兵启动信息,注意端口为 26379
查看哨兵信息
2.复制一个哨兵节点(双哨兵)
## 1.停止所有节点
kill -9 `ps aux |grep redis|grep -v grep | awk '{print $2}'`
## 2.创建日志目录
mkdir -p logfile /var/log/redis
## 3.修改配置文件 增加日志输出 大概 355 行
vi /usr/local/redis/redis.conf
vi /usr/local/redis/sentinel.conf
## 增加 logfile /var/log/redis/redis.log
## 增加 logfile /var/log/redis/sentinel.log
## 4.复制配置好的哨兵文件到 rd5
scp -r /usr/local/redis root@rd5:/usr/local/redis
## 5.启动 rd1 / rd2 / rd3
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
## 6.启动 rd4 / rd5 的哨兵
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf &
3.Java 测试访问哨兵
配置文件
spring:data:redis:password: 123456 # 访问主从节点的密码sentinel:master: mymasternodes: 192.168.1.106:26379,192.168.1.107:26379password: 123456 # 访问哨兵的密码lettuce:pool:max-idle: 50min-idle: 10max-active: 100max-wait: 1000logging:level:root: infoio.lettuce.core: debugorg.springframework.data.redis: debug
配置类
package org.example.config;import io.lettuce.core.ReadFrom;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;import java.time.Duration;
import java.util.HashSet;/*** @author zhuwd && moon* @Description* @create 2023-08-22 22:29*/
@Component
public class RedisConfig {/*** 配置 Redis 工厂* @param properties* @return*/@Bean(name = "redisConnectionFactory")public RedisConnectionFactory redisConnectionFactory(RedisProperties properties) {//取配置RedisProperties.Cluster cluster = properties.getCluster();RedisProperties.Sentinel sentinel = properties.getSentinel();RedisProperties.Pool pool = properties.getLettuce().getPool();//池化配置LettucePoolingClientConfiguration poolingClientConfiguration = LettucePoolingClientConfiguration.builder().readFrom(ReadFrom.ANY_REPLICA).build();if (null != pool){if (pool.getMaxIdle() > 0){poolingClientConfiguration.getPoolConfig().setMaxIdle(pool.getMaxIdle());}if (pool.getMinIdle() > 0){poolingClientConfiguration.getPoolConfig().setMinIdle(pool.getMinIdle());}if (pool.getMaxActive() > 0){poolingClientConfiguration.getPoolConfig().setMaxTotal(pool.getMaxActive());}if (pool.getMaxWait().compareTo(Duration.ZERO) > 0){poolingClientConfiguration.getPoolConfig().setMaxWait(pool.getMaxWait());}}//Redis 配置if (null != cluster){//集群RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(cluster.getNodes());if (null != properties.getPassword()){clusterConfiguration.setPassword(properties.getPassword());}if (null != cluster.getMaxRedirects()){clusterConfiguration.setMaxRedirects(cluster.getMaxRedirects());}return new LettuceConnectionFactory(clusterConfiguration,poolingClientConfiguration);} else if (null != sentinel){//哨兵RedisSentinelConfiguration sentinelConfiguration = new RedisSentinelConfiguration(sentinel.getMaster(),new HashSet<>(sentinel.getNodes()));sentinelConfiguration.setSentinelPassword(sentinel.getPassword());sentinelConfiguration.setPassword(properties.getPassword());//设置从节点读return new LettuceConnectionFactory(sentinelConfiguration,poolingClientConfiguration);} else {//单机RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();config.setHostName(properties.getHost());config.setPort(properties.getPort());config.setPassword(properties.getPassword());return new LettuceConnectionFactory(config);}}/*** redis 配置* @param redisConnectionFactory* @return*/@Bean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(@Qualifier("redisConnectionFactory") RedisConnectionFactory redisConnectionFactory){RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 序列化keyredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());// 序列化hashredisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());// 连接redis数据库redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}}
启动类
package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author zhuwd && moon* @Description* @create 2023-08-22 22:28*/
@SpringBootApplication
public class RedisApp {public static void main(String[] args) {SpringApplication.run(RedisApp.class,args);}
}
测试类
package org.example.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author zhuwd && moon* @Description* @create 2023-08-23 20:13*/
@RequestMapping("/redis")
@RestController
public class RedisTest {@AutowiredRedisTemplate<String, Object> redisTemplate;@GetMapping("/write")public void write(String key,String val){redisTemplate.opsForValue().set(key,val);}@GetMapping("/read")public void read(String key){System.out.println(redisTemplate.opsForValue().get(key));}
}
查看主节点:/usr/local/redis/bin/redis-cli -p 26379
启动服务
测试写集群:127.0.0.1:8080/redis/write?key=test&val=hello
写节点:rd3
读数据:rd2
杀掉主节点并等待:kill -9 ps aux |grep redis|grep -v grep | awk '{print $2}'
查看 rd4 哨兵,主节点切为 rd2
查看 rd5 哨兵,主节点
写测试:127.0.0.1:8080/redis/write?key=test&val=reHello
读测试:127.0.0.1:8080/redis/read?key=test
恢复 rd5 服务:/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
通过 rd1 查看从节点信息
3.集群
清除之前测试写入的数据
查找持久化文件:find / -type f -name dump.rdb 如果存在也删掉
1.集群配置文件修改
## 1.在 rd1 复制配置文件
cp /home/redis-7.2.0/redis.conf /usr/local/redis/redis-cluster.conf
## 2.编辑
vim /usr/local/redis/redis-cluster.conf
## 设置密码 requirepass 123456
## 关闭保护模式 protected-mode no
## 开启集群 cluster-enabled yes 约1586行
## 设置配置文件 cluster-config-file redis-cluster.conf 约1594行
## 设置超时 cluster-node-timeout 15000 约1600行
## 设置主节点密码 masterauth 123456
## 设置日志 logfile /var/log/redis/redis-cluster.log
## 3.将 redis-cluster.conf 分发到 rd2 / rd3 / rd4 / rd5 / rd6
scp /usr/local/redis/redis-cluster.conf root@rd2:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf root@rd3:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf root@rd4:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf root@rd5:/usr/local/redis/
scp /usr/local/redis/redis-cluster.conf root@rd6:/usr/local/redis/
## 4.依次启动 rd1 / rd2 /rd3 /rd4 /rd5 / rd6
/usr/local/redis/bin/redis-server /usr/local/redis/redis-cluster.conf &
## 5.清空已有数据
## 5.创建集群 在任一节点执行
## -a 密码认证,若没写密码无效带这个参数
## --cluster create 创建集群实例列表 IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT
## --cluster-replicas 复制因子1(即每个主节点需2个从节点)
/usr/local/redis/bin/redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.1.103:6379 192.168.1.104:6379 192.168.1.105:6379 192.168.1.106:6379 192.168.1.107:6379 192.168.1.108:6379
启动所有节点服务
创建集群:集群至少要三个主节点,
查看集群信息和集群节点
新建三台虚拟机
Host | IP |
---|---|
rd7 | 192.168.1.109 |
rd8 | 192.168.1.110 |
rd9 | 192.168.1.111 |
## 1.新建三台虚拟机并分发配置 rd7 / rd8 /rd9
scp -r /usr/local/redis root@192.168.1.109:/usr/local/
scp -r /usr/local/redis root@192.168.1.110:/usr/local/
scp -r /usr/local/redis root@192.168.1.111:/usr/local/
## 2.创建日志目录 / 关闭防火墙并禁用
mkdir -p /var/log/redis
systemctl stop firewalld && systemctl disable firewalld
## 3.启动 rd7 / rd8 /rd9
/usr/local/redis/bin/redis-server /usr/local/redis/redis-cluster.conf &
## 4.将新节点添加到当前集群 在 rd1 执行
## -a 密码认证,若没写密码无效带这个参数
## --cluster add-node 创建集群实例列表 IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT IP:PORT
## 要有一个节点为当前集群的节点
## /usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.109:6379 192.168.1.110:6379 192.168.1.111:6379 192.168.1.103:6379
查看集群命令说明:/usr/local/redis/bin/redis-cli --cluster help
## 添加主节点
/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.109:6379 192.168.1.103:6379
## 如果 slot 分配不均,可以用如下命令修复集群
## 分配不均报错如下 [ERR] Not all 16384 slots are covered by nodes.
/usr/local/redis/bin/redis-cli -a 123456 --cluster fix 192.168.1.103:6379
## 执行 resharding 指令来为它分配 hash slots
## 执行下面命令后要依次设置移动 slot 的节点 ID 源节点列表,可直接用 all
/usr/local/redis/bin/redis-cli -a 123456 --cluster reshard 192.168.1.103:6379
添加主节点并查看结果(部分截图)
查看主从节点状态:/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.1.103:6379 | grep ‘M|S’
## 随机添加从节点,优先添加到从节点少的节点下
/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.110:6379 192.168.1.103:6379 --cluster-slave
## 添加到指定主节点下(添加到 103 即 rd1 下面)
/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.111:6379 192.168.1.103:6379 --cluster-slave --cluster-master-id 9e99c815e3660680439261573c5c5b382573cf1c
随机添加
查看主从节点状态:/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.1.103:6379
2.Java 访问 Redis 集群测试
配置集群主节点
spring:data:redis:password: 123456 # 访问主从节点的密码cluster:max-redirects: 10nodes: 192.168.1.103:6379,192.168.1.105:6379,192.168.1.108:6379,192.168.1.109:6379lettuce:pool:max-idle: 50min-idle: 10max-active: 100max-wait: 1000enabled: truelogging:level:root: infoio.lettuce.core: debugorg.springframework.data.redis: debug
修改插入方法计算 SLOT
package org.example.controller;import io.lettuce.core.codec.CRC16;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author zhuwd && moon* @Description* @create 2023-08-23 20:13*/
@RestController
@RequestMapping("/redis")
public class RedisTest {@AutowiredRedisTemplate<String, Object> redisTemplate;private static final int SLOT_S = 16384;@GetMapping("/write")public void write(String key,String val){int slot = CRC16.crc16(key.getBytes())%SLOT_S;redisTemplate.opsForValue().set(key,val);System.out.println("slot " + slot + " key " + key + " val " + val);}@GetMapping("/read")public void read(String key){System.out.println(redisTemplate.opsForValue().get(key));}
}
测试插入数据:127.0.0.1:8080/redis/write?key=test&val=reHello
查看日志插入主节点为 rd3【192.168.1.105】,槽号为 6918
读数据:127.0.0.1:8080/redis/read?key=test
从节点 192.168.1.104 为 rd2,查看其是否为 rd3 从节点:/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.1.103:6379
客户端查看数据
查看集群槽号 12376 属于 103 节点 rd1
插入 Key 测试其节点:127.0.0.1:8080/redis/write?key=RedisTJXY&val=12376
查看客户端数据
相关文章:
Alions 8.6 下 Redis 7.2.0 集群搭建和配置
Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…...
Android Retrofit 使用及原理详解~
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理,帮助读者更全面地理解和应用这一库。 什么是…...
三种主要的云交付服务和安全模型
对于许多企业来说,当今的数字化转型之旅包括一个关键决策:采用符合其需求的云交付服务。 云计算已成为现代 IT 基础设施的主要组成部分,具有从可扩展性到成本效率等诸多优势。然而,与所有技术一样,云也有其自身的网络…...
python爬虫实战(3)--爬取某乎热搜
1. 分析爬取地址 打开某乎首页,点击热榜 这个就是我们需要爬取的地址,取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头,从Accept往下的请求头全部复制,转换成json headers {Accep…...
IPv4,IPv6,TCP,路由
主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…...
Java 计算文本相似度
接受一个字符串和一个字符串列表作为参数的 Java 方法,用于计算两个字符串之间的相似度。 方法 import java.util.HashSet; import java.util.List; import java.util.Set;public class StringSimilarity {/*** 计算两个字符串之间的相似度* param str1 第一个字符…...
MySQL 视图
目录 一、视图概述 二、视图的作用和优点 三、视图的使用规则 四、视图操作 1、创建视图 2、查看视图 1)查看视图基本信息 2)查看视图详细信息 3、修改视图 4、更新视图 5、删除视图 一、视图概述 视图是数据库中的一个虚拟表,同真…...
深入理解回调函数qsort:从入门到模拟实现
🍁博客主页:江池俊的博客 💫收录专栏:C语言进阶之路 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 前…...
【Git基础】获取远程仓库
我们通常从远程服务器克隆一个Git仓库或者将本地仓库初始化为Git仓库。 1 从远程服务器克隆一个Git仓库 $ git clone https://github.com/your-username/your-repo-name你可以自定义其仓库名称: $ git clone https://github.com/your-username/your-repo-name cu…...
chatGPT界面
效果图: 代码: <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…...
windows一键启动jupyter
windows一键启动jupyter jupyter简介 Jupyter是一个开源的交互式计算环境,主要用于数据分析、数据可视化和科学计算。它的名字来源于三种编程语言的缩写:Julia、Python和R,这三种语言都可以在Jupyter环境中运行。如果您想进行数据分析、科学…...
树形结构的快速生成
背景 相信大家都遇到过树形结构,像是文件列表、多级菜单、评论区的设计等等,我们都发现它有很多层级,第一级可以有多个,下边的每一个层级也可以有多个;有的可以设计成无限层级的,有的只能设计成两级。那么…...
Android笔记(二十七):自定义Dialog实现居中Toast
背景 记录实现符合项目需求的Toast弹窗 具体实现 class MyTipDialog private constructor(val context: Activity): Dialog(context, R.style.MyTipTheme) {val resId ObservableField(0)private val mainHandler Handler(Looper.getMainLooper())init {setCanceledOnTouc…...
css实现文字的渐变,适合大屏
1 在全局写一个全局样式,文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 ?_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…...
软考高级系统架构设计师系列论文八十七:论企业应用集成
软考高级系统架构设计师系列论文八十七:论企业应用集成 一、企业应用集成相关知识点二、摘要三、正文四、总结一、企业应用集成相关知识点 软考高级系统架构设计师系列之:企业集成平台技术的应用和架构设计二、摘要 本文讨论了某公司的应用系统集成项目。某公司为了应对市场变…...
C++设计模式之适配器模式
一、适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类所期望的接口,以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题,使得原本因接口不…...
山西电力市场日前价格预测【2023-08-24】
日前价格预测 预测明日(2023-08-24)山西电力市场全天平均日前电价为319.98元/MWh。其中,最高日前电价为370.78元/MWh,预计出现在19: 30。最低日前电价为272.42元/MWh,预计出现在12: 45。 价差方向预测 1: 实…...
一文速学-让神经网络不再神秘,一天速学神经网络基础(一)
前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…...
百度Q2财报:营收341亿元实现加速增长,净利润高速增长44%,增长强劲全线重构
北京时间8月22日,百度发布了截至2023年6月30日的第二季度未经审计的财务报告。第二季度,百度实现营收341亿元,同比增长15%;归属百度的净利润(non-GAAP)达到80亿元,同比增长44%。营收和利润双双实…...
ARM DIY(二)配置晶振频率
文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言 上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接,包括电源、SOC、SD 卡座等,板子已经可以跑起来了。 但是发现串口乱码,今天就来解决串口乱码问…...
高等数学:线性代数-第三章
文章目录 第3章 矩阵的初等变换与线性方程组3.1 矩阵的初等变换3.2 矩阵的秩3.3 方程组的解 第3章 矩阵的初等变换与线性方程组 3.1 矩阵的初等变换 矩阵的初等变换 下面三种变换称为矩阵的初等变换 对换两行(列),记作 r i ↔ r j ( c i …...
深入理解 SQL 注入攻击原理与防御措施
系列文章目录 文章目录 系列文章目录前言一、SQL 注入的原理二、防御 SQL 注入攻击的措施1. 使用参数化查询2.输入验证与过滤3.最小权限原则4.不要动态拼接 SQL5.ORM 框架6.转义特殊字符三、实例演示总结前言 SQL 注入是一种常见的网络攻击方式,攻击者通过在输入框等用户交互…...
QT5.12.12通过ODBC连接到GBase 8s数据库(CentOS)
本示例使用的环境如下: 硬件平台:x86_64(amd64)操作系统:CentOS 7.8 2003数据库版本(含CSDK):GBase 8s V8.8 3.0.0_1 为什么使用QT 5.12.10?该版本包含QODBC。 1&#…...
爱校对发布全新PDF校对工具,为用户带来更为便捷的校正体验
随着数字化文档使用的普及,PDF格式已经成为最为广泛使用的文件格式之一。为满足广大用户对于高效、准确PDF文档校对的需求,爱校对团队经过深入研发,正式推出全新的PDF校对工具! 这一全新工具针对PDF文件格式进行了深度优化&#…...
记录protocol buffers Mac安装
使用brew安装最新的protobuf 在Mac 上安装,使用brew 可以安装最新的protobuf。这个也比较简单,简单说一下。 首先先检查一下是否安装了brew。如果没有安装brew的话,请先安装brew.可以通过brew --version来检查 使用brew install protobuf 来…...
基于Jenkins自动打包并部署docker、PHP环境,ansible部署-------从小白到大神之路之学习运维第86天
第四阶段提升 时 间:2023年8月23日 参加人:全班人员 内 容: 基于Jenkins部署docker、PHP环境 目录 一、环境部署 (一)实验环境,服务器设置 (二)所有主机关闭防火墙和selinu…...
【附安装包】Midas Civil2019安装教程
软件下载 软件:Midas Civil版本:2019语言:简体中文大小:868.36M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.…...
Apache StreamPark系列教程第一篇——安装和体验
一、StreamPark介绍 实时即未来,在实时处理流域 Apache Spark 和 Apache Flink 是一个伟大的进步,尤其是Apache Flink被普遍认为是下一代大数据流计算引擎, 我们在使用 Flink & Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验…...
mysql replace insert update delete
目录 mysql replace && insert && update && delete replace mysql replace && insert && update && delete replace 我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向…...
实现SSM简易商城项目的商品查询功能
实现SSM简易商城项目的商品查询功能 介绍 在SSM(SpringSpringMVCMyBatis)框架下,我们可以轻松地实现一个简易商城项目。本博客将重点介绍如何实现商品查询功能,帮助读者了解并掌握该功能的开发过程。 步骤 1. 创建数据库表 首…...
网站开发算是固定资产吗/今日广州新闻头条
Camtasia是一款专业的屏幕录制和软件,用户可以通过它来录制自己的电脑屏幕,包括实时动画、PPT播放,兼以音频录制、视频制作等功能,支持用户一站式完成屏幕录制和后期处理操作。 自软件发行以来,Camtasia每个版本都在不…...
品牌网站设计哪家好/北京网络营销
C语言中求绝对值的函数为abs(),在C中对函数abs()进行了重载。 这个函数被封装进了cmath,在使用的时候需要把它包含进来: 例如:#include<cmath> //C语言是math.h...
abcd设计官网/seo中文意思
点击上方蓝色字体,关注我们今天想写一下关于用qml创建QTabWidget的案例,查看了Qt Creator中的示例,发现有这个示例,就拿出来进行了修改。源示例请按照下图查找。对其进行了少许的修改,如下图当你打开这个项目你会发现它…...
网站建设-纵横网络/磁力宝最佳搜索引擎入口
在指定的文件夹下执行npm init -y命令来初始化当前文件夹下的package.json文件。下载相关依赖: npm install --save typescriptnpm install --save webpack4.41.5 webpack-cli3.3.10 webpack-dev-server3.10.2npm install --save html-webpack-plugin4.4.1 clean-we…...
专门做av字幕的网站/seo网站培训优化怎么做
前言:在前面一些文章中,经常能看到介绍某某参数的作用,可能有些小伙伴仍搞不清楚 MySQL 参数是啥。本篇文章我们来聊聊 MySQL 参数,学习下如何管理维护 MySQL 参数。1.MySQL参数概念我们所说的参数在官方文档中称为 系统变量(syst…...
织梦欧美网站模板/友情链接的定义
1、先在机器上安装了VMWare,版本为VMware-workstation-4.0.5-6030,可以到其官方网站去下载,然后在下载一个注册机或注册码,我用的注册码为:M1ER8-HRW45-N0HFP-4U0JM 。VMWare的安装没有什么可说的,按照提示…...