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

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服务器配置说明
1192.168.2.1314C 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服务器配置说明
1192.168.2.1314C 8G源码编译(资源多点吧,要不有点慢)主节点
2192.168.2.1321C 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服务器配置说明
1192.168.2.1314C 8G源码编译(资源多点吧,要不有点慢)主节点 + 哨兵
2192.168.2.1321C 1G从节点+ 哨兵
3192.168.2.1331C 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服务器配置说明
1192.168.2.1314C 8G源码编译(所以资源多点),主从关系自动分配,无法提前确认
2192.168.2.1321C 1G主从关系自动分配,无法提前确认
3192.168.2.1331C 1G主从关系自动分配,无法提前确认
4192.168.2.1341C 1G主从关系自动分配,无法提前确认
5192.168.2.1351C 1G主从关系自动分配,无法提前确认
6192.168.2.1361C 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 安装&#xff08;不推荐&#xff0c;版本老旧&#xff09;2.1.1、通过源码编译安装&#xff08;推荐&#xff09; 2.2、主从模式2.3、哨兵模式2.4、集群模式2.5、其他命令2.6、其他操作系统 3、使用3.1、Java 代码 —…...

项目中遇到的半导体公司

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

汇编:call与ret/retf指令

一、call指令 ​​​​​​​ 1.1 依据位移进行转移&#xff1a;call 标号 1.2 实现段间转移&#xff1a;call far ptr 标号 1.3 转移地址在寄存器中&#xff1a;call 16位寄存器 1.4 转移地址在内存中 1.4.1 call word ptr 内存单元地址 1.4.2 call dword ptr 内存单元地址…...

Fiddler抓包工具之高级工具栏中的重定向AutoResponder的用法

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

如何基于OpenCV和Sklearn库开展数据降维

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

详解SpringAop开发过程中的坑

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…...

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

Kubernetes sample-controller 例子介绍

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

【C/C++指针】指针*与引用的区别

指针变量的值是所指对象的地址&#xff08;准确说是首地址&#xff0c;其类型定义其所指对象的字节长度&#xff09;引用变量的值是所引用对象本身的值 1 初始化 指针变量 可不初始化 且 可以更换指向对象 int *p;//此时是个野指针&#xff0c;该指针变量的值是任意值&#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); }递归展示图 使用后序销毁&#xff0c;如果用前序销毁的话&#xff0c;就会找不到根对应的子树的地址.下面就不能被销毁了&…...

flutter开发实战-实现获取视频的缩略图封面video_thumbnail

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

Prompt Toolkit探索:打造交互式CLI应用

简介&#xff1a;prompt_toolkit 是一个 Python 的库&#xff0c;它提供了一系列功能丰富的用户界面元素&#xff0c;比如自动完成、语法高亮、多行编辑、提示等等&#xff0c;让你可以轻松地构建出功能强大的命令行工具。而且&#xff0c;这个库还被 IPython 和 pgcli 这样的知…...

【已解决】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘

问题描述 AttributeError: module gradio has no attribute outputs 不知道作者用的是哪个gradio版本&#xff0c;最新的版本报错AttributeError: module gradio has no attribute outputs &#xff0c; 换一个老一点的版本会报错AttributeError: module gradio has no attribu…...

WPF Mvvm模式下面如何将事件映射到ViewModel层

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

C# WPF上位机开发(计算器界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf最大的优势就是开发业务软件比较快、效率比较高。一般来说&#xff0c;它的界面和逻辑部分可以同时开发。界面的部分用xaml编写即可&#xf…...

[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)//当输入一个数据时&#xff0c;输入0&#xff0c;可以判断…...

【Java 基础】16 泛型

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

Android framework定制1-->用户无操作一段时间,自动播放客户提供的视频,用户操作后退出播放

在PowerManagerService.java中监听用户操作&#xff0c;10秒无操作则打开预置的apk播放视频&#xff0c;直接上代码&#xff1a; --- a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javab/frameworks/base/services/core/java/com/andr…...

Vmware17虚拟机安装windows10系统

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

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...