Redis 安装部署
文章目录
- 1、前言
- 2、安装部署
- 2.1、单机模式
- 2.1.1、通过 yum 安装(不推荐,版本老旧)
- 2.1.1、通过源码编译安装(推荐)
- 2.2、主从模式
- 2.3、哨兵模式
- 2.4、集群模式
- 2.5、其他命令
- 2.6、其他操作系统
- 3、使用
- 3.1、Java 代码 —— SpringBoot
- 4、总结
1、前言
参考文档:
- Redis 官网
- Redis 官方下载地址
- 相关文章:Redis 四种模式的介绍
环境说明:
- 操作系统版本:CentOS Linux release 7.9.2009 (Core)
- 操作系统安装包:CentOS-7-x86_64-Minimal-2009.iso
- Redis 版本:7.2.3
- Redis 客户端(Windows):RedisDesktopManager 0.8.3.3850
- Redis 客户端(Windows)安装文件:redis-desktop-manager-0.8.3.3850.exe
2、安装部署
2.1、单机模式
Redis 可通过 yum 进行安装部署,但是默认安装的版本比较老旧,配置第三方非官方源存在一定风险。因此,安装部署较新版本最安全的方法,是需要通过 Redis 源码编译,进行安装的方式。
服务器配置如下:
序号 | 服务器IP | 服务器配置 | 说明 |
---|---|---|---|
1 | 192.168.2.131 | 4C 8G | 源码编译(资源多点吧,要不有点慢) |
2.1.1、通过 yum 安装(不推荐,版本老旧)
# 安装 epel 源
yum install epel-release
# 安装 Redis
yum install redis
# Redis 版本 3.2.12-2.el7
# 查看安装版本
redis-server --version
# Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7897e7d0e13773f
# 卸载
rpm -e redis
2.1.1、通过源码编译安装(推荐)
Redis 源码下载地址
安装
# 安装相关依赖
yum -y install wget python3 gcc
# 安装目录
cd /opt
# 获取源码
wget https://codeload.github.com/redis/redis/tar.gz/refs/tags/7.2.3
# 解压
tar -zxvf 7.2.3
# 进入目录
cd redis-7.2.3
# 编译 && 安装
make && make install
# 启动服务(未更改配置,需要新窗口启动 redis-cli 客户端)
# redis-server
# 创建日志目录
mkdir logs
# 后台启动服务(未更改默认配置文件)
nohup redis-server redis.conf >./logs/stdout.log 2>&1 &
测试
# 通过 Redis 客户端访问 Redis 服务
[root@localhost redis-7.2.3]# redis-cli
127.0.0.1:6379> ping
PONG# redis-cli -h 192.168.56.108
配置文件没有变更,使用源码默认配置文件。此时,只能本地通过 redis-cli 客户端进行访问。需要通过网络访问,需要修改配置文件 redis.conf
vi /opt/redis-7.2.3/redis.conf
更改内容如下
bind 0.0.0.0
# 不设置 bind IP 和密码,只允许本地通过 127.0.0.1:6379 访问,拒绝远程访问
protected-mode no
# 默认密码
requirepass foobared
重启服务
# 停止服务
[root@localhost redis-7.2.3]# ps -ef|grep redis
root 6747 1530 0 14:07 pts/0 00:00:00 src/redis-server 127.0.0.1:6379
root 6776 1530 0 14:09 pts/0 00:00:00 grep --color=auto redis
[root@localhost redis-7.2.3]# kill 6747
# 或者
pgrep -f redis-server | xargs kill
# 或者
[root@localhost redis-7.2.3]# redis-cli
127.0.0.1:6379> shutdown
not connected># 启动服务
cd /opt/redis-7.2.3
nohup redis-server redis.conf >./logs/stdout.log 2>&1 &
ss -ntl|grep 6379# 防火墙开放端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --zone=public --list-ports
测试
通过 redis-cli 连接测试
[root@localhost redis-7.2.3]# redis-cli -c -h 192.168.2.131 -a foobared
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.2.131:6379> ping
PONG
192.168.2.131:6379> exit
[root@localhost redis-7.2.3]#
通过 Windows 客户端进行连接测试
至此,单机部署完成。
提示:生产环境,请根据需求进行参数优化配置!
2.2、主从模式
相关文章:主从模式的原理介绍
服务器配置如下:
序号 | 服务器IP | 服务器配置 | 说明 |
---|---|---|---|
1 | 192.168.2.131 | 4C 8G | 源码编译(资源多点吧,要不有点慢)主节点 |
2 | 192.168.2.132 | 1C 1G | 从节点 |
将编译好的 Redis 文件夹压缩,传给从节点
主节点操作
# 停止服务
pgrep -f redis-server | xargs kill
# 压缩文件夹为 tar 包
tar -cf redis-7.2.3.tar redis-7.2.3
# 启动服务
nohup redis-server redis.conf >./logs/stdout.log 2>&1 &
从节点操作
cd /opt
# copy 主节点压缩包
scp 192.168.2.131://opt/redis-7.2.3.tar ./
# 输入主节点服务器密码
# 解压
tar -xf redis-7.2.3.tar
说明:
- 主节点配置与单机部署相同,无需变更
- 从节点配置 redis.conf 在单节点配置基础上增加
# 主节点 IP 端口
replicaof 192.168.2.131 6379
# 主节点密码
masterauth foobared
启动服务
# 安装服务
cd /opt/redis-7.2.3
make install
# 启动服务
nohup redis-server redis.conf >./logs/stdout.log 2>&1 &
# 查看日志
tail -100f logs/stdout.log
# 其中显示
MASTER <-> REPLICA sync: Finished with success# 防火墙开放端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --zone=public --list-ports
验证
通过客户端在 131 主节点进行操作,132 会进行数据同步。包括:新增、更新、删除。
至此,主从模式部署完成。
提示:生产环境,请根据需求进行参数优化配置!
2.3、哨兵模式
服务器配置如下:
序号 | 服务器IP | 服务器配置 | 说明 |
---|---|---|---|
1 | 192.168.2.131 | 4C 8G | 源码编译(资源多点吧,要不有点慢)主节点 + 哨兵 |
2 | 192.168.2.132 | 1C 1G | 从节点+ 哨兵 |
3 | 192.168.2.133 | 1C 1G | 哨兵 |
说明:
- 主从模式下,增加哨兵
- 哨兵模式可通过代码进行验证
将主节点的 tar 包 copy 到 哨兵节点
cd /opt
# copy 主节点压缩包
scp 192.168.2.131://opt/redis-7.2.3.tar ./
# 输入主节点服务器密码
# 解压
tar -xf redis-7.2.3.tar
哨兵配置 /opt/redis-7.2.3/sentinel.conf (3个节点都需要配置)
# protected-mode no # 默认配置,无需更改
# 哨兵监控的主节点 IP 端口 2个哨兵节点同时判断redis节点异常才有效
sentinel monitor mymaster 192.168.2.131 6379 2
# 主节点密码
sentinel auth-pass mymaster foobared
启动服务(3个节点都需要启动哨兵服务)
# 安装服务
cd /opt/redis-7.2.3
make install
# 启动哨兵服务
nohup src/redis-sentinel sentinel.conf >./logs/sentinelStdout.log 2>&1 &
# 通过查看端口监测情况,验证哨兵是否正常启动
ss -ntl|grep 26379# 开放防火墙端口
firewall-cmd --zone=public --add-port=26379/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --zone=public --list-ports
其他命令
# 停止哨兵服务
pgrep -f redis-sentinel | xargs kill
至此,哨兵模式部署完成。
提示:生产环境,请根据需求进行参数优化配置!
2.4、集群模式
相关参考文档:Redis 集群搭建
说明:
- Redis 集群对节点数要求为奇数,因此至少需要三个节点,并且每个节点至少有一个备份节点。结论:Redis 集群至少6个 redis 节点。
- 节点可部署在相同的服务器,但是生产环境不推荐,避免服务器故障引起集群不可用
- 集群模式可通过代码进行验证
服务器配置如下:
序号 | 服务器IP | 服务器配置 | 说明 |
---|---|---|---|
1 | 192.168.2.131 | 4C 8G | 源码编译(所以资源多点),主从关系自动分配,无法提前确认 |
2 | 192.168.2.132 | 1C 1G | 主从关系自动分配,无法提前确认 |
3 | 192.168.2.133 | 1C 1G | 主从关系自动分配,无法提前确认 |
4 | 192.168.2.134 | 1C 1G | 主从关系自动分配,无法提前确认 |
5 | 192.168.2.135 | 1C 1G | 主从关系自动分配,无法提前确认 |
6 | 192.168.2.136 | 1C 1G | 主从关系自动分配,无法提前确认 |
安装依赖
yum -y install ruby
开放相关端口
端口列表参考文档
firewall-cmd --zone=public --add-port=6379/tcp --add-port=16379/tcp --add-port=6380/tcp --add-port=26379/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --zone=public --list-ports
单机部署配置下 redis.conf 增加相关配置(注意:主从模式、哨兵模式产生的数据对集群模式有影响。如果无法确认影响程度,那干脆将虚拟机恢复到干净的快照,再进行相关操作!)
# 开启集群模式
cluster-enabled yes
# 集群配置文件(首次自动生成)
cluster-config-file nodes-6379.conf
生成压缩包,准备发送到其余 5 个节点
# 停止服务
pgrep -f redis-server | xargs kill
# 压缩文件夹为 tar 包
tar -cf redis-7.2.3.tar redis-7.2.3
启动服务(6个节点全部启动)
tar -xf redis-7.2.3.tar
cd redis-7.2.3
make install
nohup redis-server redis.conf >./logs/stdout.log 2>&1 &
创建集群(注意:在任意一台上运行,不要在每台机器上都运行,运行一次即可)
[root@localhost redis-7.2.3]# redis-cli --cluster create 192.168.2.131:6379 192.168.2.132:6379 192.168.2.133:6379 192.168.2.134:6379 192.168.2.135:6379 192.168.2.136:6379 --cluster-replicas 1 -a foobared
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.2.135:6379 to 192.168.2.131:6379
Adding replica 192.168.2.136:6379 to 192.168.2.132:6379
Adding replica 192.168.2.134:6379 to 192.168.2.133:6379
M: 8ad6b5f89470f24c7c747ede0532f3c58665a36f 192.168.2.131:6379slots:[0-5460] (5461 slots) master
M: 068cb1887faef1e992e5fe4f63e04d3022016a73 192.168.2.132:6379slots:[5461-10922] (5462 slots) master
M: 8e55d559efad0bc6c06450c40e81f005ae2521a7 192.168.2.133:6379slots:[10923-16383] (5461 slots) master
S: 58b7d94d41c537252cb5f54918aae55fa09fc876 192.168.2.134:6379replicates 8e55d559efad0bc6c06450c40e81f005ae2521a7
S: c913f4da1d29ce54f6c062384aa8bfc6beaef553 192.168.2.135:6379replicates 8ad6b5f89470f24c7c747ede0532f3c58665a36f
S: 6337b662b08d4bd32388b18ccf687e87f9f09bc6 192.168.2.136:6379replicates 068cb1887faef1e992e5fe4f63e04d3022016a73
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join>>> Performing Cluster Check (using node 192.168.2.131:6379)
M: 8ad6b5f89470f24c7c747ede0532f3c58665a36f 192.168.2.131:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 8e55d559efad0bc6c06450c40e81f005ae2521a7 192.168.2.133:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
M: 068cb1887faef1e992e5fe4f63e04d3022016a73 192.168.2.132:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: 6337b662b08d4bd32388b18ccf687e87f9f09bc6 192.168.2.136:6379slots: (0 slots) slavereplicates 068cb1887faef1e992e5fe4f63e04d3022016a73
S: 58b7d94d41c537252cb5f54918aae55fa09fc876 192.168.2.134:6379slots: (0 slots) slavereplicates 8e55d559efad0bc6c06450c40e81f005ae2521a7
S: c913f4da1d29ce54f6c062384aa8bfc6beaef553 192.168.2.135:6379slots: (0 slots) slavereplicates 8ad6b5f89470f24c7c747ede0532f3c58665a36f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
集群验证
[root@localhost redis-7.2.3]# redis-cli -c -h 192.168.2.131 -a foobared
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.2.131:6379> set name userName
-> Redirected to slot [5798] located at 192.168.2.132:6379
OK
192.168.2.132:6379> get name
"userName"
192.168.2.132:6379> exit
至此,集群模式部署完成。
提示:生产环境,请根据需求进行参数优化配置!
2.5、其他命令
redis-server //启动服务
redis-benchmark //测试性能
redis-check-aof //检查aof持久化文件
redis-sentinel
redis-cli //客户端# 正式关闭redis服务
# 在redis-cli中,无 Authentication 才可以
shutdown# 卸载redis
make uninstall
# 或者
rm -rf /usr/local/bin/redis-*
rm -rf /usr/local/redis
说明:make、 make install、make uninstall 的作用参考文档
2.6、其他操作系统
Ubuntu/Debian 安装部署,可参考官方文档
3、使用
3.1、Java 代码 —— SpringBoot
Java 版本:JDK 17.0.6
SpringBoot 版本: 3.0.2
IDE 版本:IntelliJ IDEA 2023.2.5 (Community Edition)
Postman 版本:November 2023 (v10.20)
其他配置:详情见 Demo 及相关配置图片
配置图片
SpringBoot 新建项目 Demo 下载地址
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><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>3.0.2</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.demo.DemoApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
Spring 相关配置 application.yaml
# 应用服务 WEB 访问端口
server:port: 8080spring:data:redis:password: foobared# # 直连 Redis
# host: 192.168.2.131
# port: 6379# # redis哨兵配置
# sentinel:
# # 主节点名称
# master: mymaster
# nodes:
# - 192.168.2.131:26379
# - 192.168.2.132:26379
# - 192.168.2.133:26379# 集群的部署方式cluster:nodes:- 192.168.2.131:6379- 192.168.2.132:6379- 192.168.2.133:6379- 192.168.2.134:6379- 192.168.2.135:6379- 192.168.2.136:6379# 最大重定向次数(由于集群中数据存储在多个节点,所以在访问数据时需要通过转发进行数据定位)max-redirects: 2# # 其他相关配置
# lettuce:
# pool:
# # 连接池中的最大空闲连接
# max-idle: 10
# # 连接池最大阻塞等待时间(使用负值表示没有限制)
# max-wait: 500
# # 连接池最大连接数(使用负值表示没有限制)
# max-active: 8
# # 连接池中的最小空闲连接
# min-idle: 0
Demo 基础上增加 Redis 相关操作
增加 UserService
package com.example.demo.demos.service;import com.example.demo.demos.web.User;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class UserService {@Resourceprivate RedisTemplate redisTemplate;public User saveUser(User u) {String name = u.getName();redisTemplate.opsForValue().set(name, u.getAge());return findUser(name);}public User findUser(String username) {User user = new User();Integer age = (Integer) redisTemplate.opsForValue().get(username);user.setName(username);user.setAge(age);return user;}}
变更 BasicController
package com.example.demo.demos.web;import com.example.demo.demos.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
public class BasicController {@Resourceprivate UserService userService;// http://127.0.0.1:8080/hello?name=lisi@RequestMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {return "Hello " + name;}// http://127.0.0.1:8080/user?username=lisi@GetMapping("/user")@ResponseBodypublic User user(@RequestParam String username) {return userService.findUser(username);}// http://127.0.0.1:8080/save_user@PostMapping("/save_user")@ResponseBodypublic User saveUser(@RequestBody User u) {return userService.saveUser(u);}}
启动服务,并通过访问接口地址进行相关验证
# 验证接口是否畅通
curl --location 'http://127.0.0.1:8080/hello?name=lisi'
# 添加数据
curl --location 'http://127.0.0.1:8080/save_user' \
--header 'Content-Type: application/json' \
--data '{"name": "lisi","age": 18
}'
# 查询数据
curl --location 'http://127.0.0.1:8080/user?username=lisi'
4、总结
无论哪种 Redis 模式的安装,都不算复杂。阅读相关文档,理解好原理,安装部署都比较简单。
但是实际生产环境,仍存在比较复杂的实际使用场景,以及更加奇怪的问题有待我们去探索!
相关文章:

Redis 安装部署
文章目录 1、前言2、安装部署2.1、单机模式2.1.1、通过 yum 安装(不推荐,版本老旧)2.1.1、通过源码编译安装(推荐) 2.2、主从模式2.3、哨兵模式2.4、集群模式2.5、其他命令2.6、其他操作系统 3、使用3.1、Java 代码 —…...

项目中遇到的半导体公司
作为一个技术人,我并不是亲美,从技术的实事求是角度讲,不得不感叹欧美的半导体技术。他们的datasheet能学到的东西太多太多;我甚至佩服他们缜密的逻辑。从他们的文章中领悟我们技术到底有多low,没办法一个一个了解所有…...

汇编:call与ret/retf指令
一、call指令 1.1 依据位移进行转移:call 标号 1.2 实现段间转移:call far ptr 标号 1.3 转移地址在寄存器中:call 16位寄存器 1.4 转移地址在内存中 1.4.1 call word ptr 内存单元地址 1.4.2 call dword ptr 内存单元地址…...

Fiddler抓包工具之高级工具栏中的重定向AutoResponder的用法
重定向AutoResponder的用法 关于Fiddler的AutoResponder重定向功能,主要是时进行会话的拦截,然后替换原始资源的功能。 它与手动修该reponse是一样的,只是更加方便了,可以创建相应的rules,适合批处理的重定向功能。 …...

如何基于OpenCV和Sklearn库开展数据降维
大家在做数据分析或者机器学习应用过程中,不可避免的需要对数据进行降维操作,好多垂直行业业务中经常出现数据量少但维度巨大的情况。数据降维的目的是为了剔除不相关或冗余特征,使得数据易用,去除无用数据,实现数据可…...

详解SpringAop开发过程中的坑
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

Kubernetes sample-controller 例子介绍
sample-controller sample-controller 是 K8s 官方自定义 CDR 及控制器是实现的例子 通过使用这个自定义 CDR 控制器及阅读它的代码,基本可以了解如何制作一个 CDR 控制器 CDR 运作原理 网上有更好的文章,说明其运作原理: https://www.z…...

【C/C++指针】指针*与引用的区别
指针变量的值是所指对象的地址(准确说是首地址,其类型定义其所指对象的字节长度)引用变量的值是所引用对象本身的值 1 初始化 指针变量 可不初始化 且 可以更换指向对象 int *p;//此时是个野指针,该指针变量的值是任意值&#x…...

【ArcGIS Pro微课1000例】0039:制作全球任意经纬网的两种方式
本文讲解在ArcGIS Pro中制作全球任意经纬网的两种方式。 文章目录 一、生成全球经纬网矢量1. 新建地图加载数据2. 创建经纬网矢量数据二、布局生成经纬网1. 新建布局2. 创建地图框2. 创建经纬网一、生成全球经纬网矢量 以1:100万比例尺地图分幅为例,创建经差6、维差4的经纬网…...

【二叉树】练习题终章
二叉树的销毁 void BTreeDestroy(BTNode* root) {if (root NULL)return;BTreeDestroy(root->left);BTreeDestroy(root->right);free(root); }递归展示图 使用后序销毁,如果用前序销毁的话,就会找不到根对应的子树的地址.下面就不能被销毁了&…...

flutter开发实战-实现获取视频的缩略图封面video_thumbnail
flutter开发实战-实现获取视频的缩略图封面video_thumbnail 在很多时候,我们查看视频的时候,视频没有播放时候,会显示一张封面,可能封面没有配置图片,这时候就需要通过获取视频的缩略图来显示封面了。这里使用了video…...

Prompt Toolkit探索:打造交互式CLI应用
简介:prompt_toolkit 是一个 Python 的库,它提供了一系列功能丰富的用户界面元素,比如自动完成、语法高亮、多行编辑、提示等等,让你可以轻松地构建出功能强大的命令行工具。而且,这个库还被 IPython 和 pgcli 这样的知…...

【已解决】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘
问题描述 AttributeError: module gradio has no attribute outputs 不知道作者用的是哪个gradio版本,最新的版本报错AttributeError: module gradio has no attribute outputs , 换一个老一点的版本会报错AttributeError: module gradio has no attribu…...

WPF Mvvm模式下面如何将事件映射到ViewModel层
前言 平常用惯了Command绑定,都快忘记传统的基于事件编程模式了,但是Commond模式里面有个明显的问题,就是你无法获取到事件源的参数。很多大聪明肯定会说,这还不简单,通过自己写控件,给控件加个自定义属性不就行了,想要啥事件就写啥事件进去,完全自主可控。但是对于写…...

C# WPF上位机开发(计算器界面设计)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 c# wpf最大的优势就是开发业务软件比较快、效率比较高。一般来说,它的界面和逻辑部分可以同时开发。界面的部分用xaml编写即可…...

[c]比较月亮大小
本题的难点就是分情况讨论 #include<stdio.h> int main() {int n;scanf("%d",&n);int arr2[n];int p;for(int m0;m<n-1;m){scanf("%d",&arr2[m]);//输入n个数保存到数组}if(n1)//当输入一个数据时,输入0,可以判断…...

【Java 基础】16 泛型
文章目录 什么是泛型?泛型的声明泛型的使用泛型方法通配符和泛型上下界1)通配符2)泛型上下界 泛型的好处注意事项 泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型,我们可以编写更加 通用、 灵活、 可读性高的…...

Android framework定制1-->用户无操作一段时间,自动播放客户提供的视频,用户操作后退出播放
在PowerManagerService.java中监听用户操作,10秒无操作则打开预置的apk播放视频,直接上代码: --- a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javab/frameworks/base/services/core/java/com/andr…...

Vmware17虚拟机安装windows10系统
不要去什么系统之家之类的下载镜像,会不好安装,镜像被魔改过了,适合真实物理机上的系统在PE里安装系统,建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…...

Golang实践录:读取yaml配置文件
本文对 yaml 文件进行解析。 下载 yaml执行 go get github.com/spf13/viper 安装。 golang 有很多库可以解释 yaml 文件。本文选用 viper 进行解析,执行 go get github.com/spf13/viper 安装。 yaml语法规则 yaml对大小写敏感。yaml的层级关系只能使用空格缩进&a…...

oracle sql相关语法
SQL*PLUS 在SQL*PLUS执行,会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面,鼠标右键,点击执行计划,会出现sql的执行计…...

el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并
el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并,并且不能跨品名合并 如图 用到el-table合并行的方法合并 tableSpanMethod({ row, column, rowIndex, columnIndex }) {if (column.property "materielName") {//合并商品名const _row this…...

微信小程序显示二维码?
wxml <canvas style"width: 100%;height: 100%;margin-left: 20%;" id"Canvase" type"2d"></canvas> js // pages/code/code.js Page({/*** 页面的初始数据*/data: {code: ,},/*** 生命周期函数--监听页面加载*/onLoad(options) {…...

JavaWeb开发全流程笔记
JavaWeb 前端Web开发javaScript1.JS引入2.JS基础语法3.JS函数4.JS对象 BOMDOM文档对象模型JS事件监听VueVue常用指令Vue的生命周期 AjaxAxios 前端工程化环境准备NodeJS安装和Vue-cli安装vue项目Vue组件库Element组件的使用 Vue路由Nginx打包部署 后端Web开发MavenSpringBootHT…...

LLM;超越记忆《第 2 部分 》
一、说明 在这篇博客中,我深入研究了将大型语言模型(LLM)提升到基本记忆之上的数学框架。我们探索了动态上下文学习、连续空间插值及其生成能力,揭示了 LLM 如何理解、适应和创新超越传统机器学习模型。 LLM代表了人工智能的重大飞…...

Python中的加法测试题实现
随机生成5道10以内的加法测试题,用户在10秒内使用键盘输入答案。完成全部5道答题之后,计算机生成答题记录报告,并对答题情况进行分析,显示“答对了”,或“答错了”、并显示正确答案。如果未能按时完成,则显…...

使用gcloud SDK 管理和部署 Cloud run service
查看cloud run 上的service 列表: gcloud run services list > gcloud run services listSERVICE REGION URL LAST DEPLOYED BY LAST DEPL…...

JS逆向-mytoken之code参数
前言 本文是该专栏的第60篇,后面会持续分享python爬虫干货知识,记得关注。 本文以mytoken为例,通过js逆向获取其code参数的生成规律。具体的“逆向”思路逻辑,笔者将会详细介绍每个步骤,并且将在正文结合“完整代码”进行详细说明。 接下来,跟着笔者直接往下看正文详细…...

第九节HarmonyOS 常用基础组件4-Button
一、Button Button组件主要用来响应点击操作,可以包含子组件。 示例代码: Entry Component struct Index {build() {Row() {Column() {Button(确定, { type: ButtonType.Capsule, stateEffect: true }).width(90%).height(40).fontSize(16).fontWeigh…...