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

Redis客户端(Jedis、RedisTemplate、Redisson)

1. 简介

        Redis作为一个当下很火热的非关系型数据库,Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库,需要借助于市面上的开源客户端,如Jedis、Spring Data Redis、Redisson,它们可以作为操作Redis非关系型数据库的桥梁。

2. 实例

2.1 Jedis

Jedis 是一个用 Java 编写的 Redis 客户端库,它提供了丰富的 API 来访问 Redis 支持的所有数据结构。Jedis 是同步的和阻塞的,这意味着在执行操作时,当前线程会被阻塞直到操作完成。

2.1.1 添加依赖

在Spring中集成Jedis。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>

2.1.2 添加配置

application.yml:

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

生成bean:

package com.xiaokai.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;/*** Author:yang* Date:2024-12-09 13:42*/
@Component
public class JedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Beanpublic Jedis jedisClient() {Jedis jedis = new Jedis(new HostAndPort(host, port));return jedis;}
}

2.1.3 测试

package com.xiaokai;import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
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;
import redis.clients.jedis.Jedis;/*** Author:yang* Date:2024-12-09 10:58*/
@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate Jedis jedisClient;@Testpublic void testJedis() {String s = jedisClient.set("jedis", "jedis");log.info("设置成功:{}", s);String value = jedisClient.get("jedis");log.info("获取成功:{}", value);}
}# 设置成功:OK
# 获取成功:jedis

可以看到Redis中已经存下了当前key-value

127.0.0.1:6379> get jedis
"jedis"

2.1.4 Jedis API

2.1.4.1 连接与断开连接
  • Jedis jedis = new Jedis("localhost", 6379);:创建一个新的 Jedis 实例连接到本地的 Redis 服务器。

  • jedis.connect();:建立连接(现在这个步骤通常是自动的,不建议手动调用)。

  • jedis.disconnect();:断开连接。

2.1.4.2 键操作
  • jedis.exists(String key);:检查给定的键是否存在。

  • jedis.del(String key);:删除给定的键。

  • jedis.keys(String pattern);:返回匹配给定模式的所有键。

  • jedis.ttl(String key);:返回给定键的剩余生存时间(以秒为单位)。

2.1.4.3 字符串(String)操作
  • jedis.set(String key, String value);:设置键的值。

  • jedis.get(String key);:获取与给定键相关联的值。

  • jedis.append(String key, String value);:将值追加到键的当前值。

  • jedis.incr(String key);:将键的值增加 1。

  • jedis.decr(String key);:将键的值减少 1。

2.1.4.4 列表(List)操作
  • jedis.lpush(String key, String... values);:将一个或多个值插入到列表的头部。

  • jedis.rpush(String key, String... values);:将一个或多个值插入到列表的尾部。

  • jedis.lpop(String key);:移除并返回列表的第一个元素。

  • jedis.rpop(String key);:移除并返回列表的最后一个元素。

  • jedis.lrange(String key, long start, long end);:返回列表中指定范围内的元素。

2.1.4.5 集合(Set)操作
  • jedis.sadd(String key, String... members);:向集合添加一个或多个成员。

  • jedis.smembers(String key);:返回集合中的所有成员。

  • jedis.srem(String key, String... members);:移除集合中的一个或多个成员。

  • jedis.sismember(String key, String member);:检查成员是否是集合的成员。

2.1.4.6 有序集合(Sorted Set)操作
  • jedis.zadd(String key, double score, String member);:向有序集合添加一个成员。

  • jedis.zrange(String key, long start, long end);:返回有序集合中指定范围内的成员。

  • jedis.zrem(String key, String... members);:移除有序集合中的一个或多个成员。

  • jedis.zscore(String key, String member);:返回成员的分数。

2.1.4.7 哈希(Hash)操作
  • jedis.hset(String key, String field, String value);:将哈希表的字段设置为值。

  • jedis.hget(String key, String field);:获取哈希表中字段的值。

  • jedis.hgetAll(String key);:获取哈希表中所有的字段和值。

  • jedis.hdel(String key, String... fields);:删除哈希表中的一个或多个字段。

2.1.4.8 发布/订阅(Pub/Sub)操作
  • jedis.publish(String channel, String message);:发布消息到频道。

  • JedisPubSub jedisPubSub = new JedisPubSub() {...};:创建一个新的 JedisPubSub 实例来订阅频道。

2.1.4.9 事务
  • jedis.multi();:开始一个事务。

  • jedis.exec();:执行事务。

2.1.4.10 脚本
  • jedis.eval(String script, int keyCount, String... params);:执行 Lua 脚本。

2.2 Spring Data Redis

Spring Data Redis 是 Spring 提供的一套操作 Redis 的抽象,它包括 RedisTemplateStringRedisTemplate 等模板类,简化了 Redis 的操作。Spring Data Redis 默认使用 Lettuce 作为客户端,但也支持 Jedis。

2.2.1 添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2.2 添加配置

application.yml:

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

序列化配置:

import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.DefaultBaseTypeLimitingValidator;
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 使用StringRedisSerializer来序列化keyStringRedisSerializer stringRedisSerializer = new StringRedisSerializer();template.setKeySerializer(stringRedisSerializer);template.setHashKeySerializer(stringRedisSerializer);// 使用Jackson2JsonRedisSerializer来序列化valueJackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 配置ObjectMapper以处理多态objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(),ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.PROPERTY);objectMapper.setDefaultTyping(new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL,new DefaultBaseTypeLimitingValidator(Object.class)).init(null,Jackson2JsonRedisSerializer.Typing.NON_FINAL,null).inclusion(JsonTypeInfo.As.PROPERTY));jsonRedisSerializer.setObjectMapper(objectMapper);template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);template.afterPropertiesSet();return template;}
}

注:如果不设置序列化器,默认使用jdk序列化,存储的key为\xac\xed\x00\x05t\x00\x04test

2.2.3 测试

@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedis() {try{redisTemplate.opsForValue().set("test", "test");log.info("设置成功");}catch (Exception e){log.error("设置失败", e);}String test = (String) redisTemplate.opsForValue().get("test");log.info("获取成功:{}", test);String bless = (String) redisTemplate.opsForValue().get("Bless");log.info("获取成功:{}", bless);}@Testpublic void testRedisList() {redisTemplate.opsForList().leftPush("list", "1");redisTemplate.opsForList().leftPush("list", "2");redisTemplate.opsForList().leftPush("list", "3");String list = (String) redisTemplate.opsForList().rightPop("list");log.info("获取成功:{}", list);}@Testpublic void testRedisMap() {redisTemplate.opsForHash().put("user", "key1", "value1");}
}

注:RedisTemplate可以直接使用,不需要去生成一个专有bean。

2.2.4 相关API

2.2.4.1 设置和获取键值
  • set(key, value):设置键值。

  • opsForValue().set(key, value):设置字符串(简单值)。

  • opsForValue().get(key):获取字符串值。

  • opsForValue().getAndSet(key, value):将旧的值替换为新的值,并返回旧的值。

2.2.4.2 过期时间操作
  • expire(key, timeout, unit):设置键的过期时间。

  • getExpire(key):返回键的剩余过期时间。

  • getExpire(key, unit):返回剩余过期时间并且指定时间单位。

2.2.4.3 键的操作
  • hasKey(key):判断键是否存在。

  • delete(key):删除单个键。

  • delete(Collection<K> keys):批量删除键。

  • keys(pattern):查找匹配的键值,返回一个 Set 集合类型。

2.2.4.4 列表操作
  • opsForList().leftPush(key, value):在列表左侧插入值。

  • opsForList().rightPush(key, value):在列表右侧插入值。

  • opsForList().multiGet(keys):批量获取列表中的值。

2.2.4.5集合操作
  • opsForSet().add(key, value):向集合中添加元素。

  • opsForSet().members(key):获取集合中的所有成员。

2.2.4.6 有序集合操作
  • opsForZSet().add(key, value, score):向有序集合中添加元素。

  • opsForZSet().range(key, start, end):获取有序集合中指定范围的元素。

2.2.4.7 哈希操作
  • opsForHash().put(key, hashKey, hashValue):向哈希中添加键值对。

  • opsForHash().entries(key):获取哈希中的所有键值对。

2.2.4.8 地理空间操作
  • opsForGeo().add(key, geoLocation):向地理空间添加位置。

  • opsForGeo().radius(key, circle):根据半径查询地理空间中的位置。

2.2.4.9 事务操作
  • execute(SessionCallback action):执行 Redis 事务。

2.2.4.10 流操作
  • opsForStream().add(record):向 Redis 流中添加记录。

  • opsForStream().read(recordClass, StreamOffset):从 Redis 流中读取记录。

2.3 Redisson

Redisson 是一个基于 Java 的 Redis 客户端库,它提供了多种分布式数据结构和服务,如分布式锁、原子变量、集合等。Redisson 支持多种 Redis 模式,包括单机、主从、集群和哨兵模式。

2.3.1 添加依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.6</version>
</dependency>

2.3.2 添加配置

application.yml(使用配置文件)

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

2.3.3 测试

@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate RedissonClient redissonClient;@Testpublic void testRedissonClient() {RBucket<String> bucket = redissonClient.getBucket("test");bucket.set("test");log.info("设置成功");String test = bucket.get();log.info("获取成功:{}", test);RBucket<Object> bless = redissonClient.getBucket("Bless");bless.set("Bless");String value = (String) bless.get();log.info("获取成功:{}", value);}}

注:

  • 配置文件不需要额外的bean可以直接使用。

  • 编程式使用:

单机模式

Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("password").setDatabase(0);
RedissonClient redisson = Redisson.create(config);

集群模式

Config config = new Config();
ClusterServersConfig clusterConfig = config.useClusterServers().addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001").addNodeAddress("redis://127.0.0.1:7002");
clusterConfig.setPassword("password");
RedissonClient redisson = Redisson.create(config);

2.3.4 相关API

2.3.4.1 连接与断开连接
// 创建 Redisson 客户端实例,默认连接到本地的 Redis 服务器
RedissonClient redisson = Redisson.create();// 断开连接
redisson.shutdown();
2.3.4.2 键操作
// 检查给定的键是否存在
boolean exists = redisson.getKeys().exists("key");// 删除给定的键
redisson.getKeys().delete("key");// 返回匹配给定模式的所有键
Set<String> keys = redisson.getKeys().getKeysByPattern("pattern");// 返回给定键的剩余生存时间(以秒为单位)
long ttl = redisson.getKeys().getTTL("key");
2.3.4.3 字符串(String)操作
// 设置键的值
RBucket<String> bucket = redisson.getBucket("key");
bucket.set("value");// 获取与给定键相关联的值
String value = bucket.get();// 将值追加到键的当前值
long length = bucket.append("value");// 将键的值增加 1
RAtomicLong atomicLong = redisson.getAtomicLong("key");
atomicLong.increment();// 将键的值减少 1
atomicLong.decrement();
2.3.4.4 列表(List)操作
// 将一个或多个值插入到列表的头部
RList<String> list = redisson.getList("list");
list.leftPush("value");// 将一个或多个值插入到列表的尾部
list.rightPush("value");// 移除并返回列表的第一个元素
String element = list.leftPop();// 移除并返回列表的最后一个元素
element = list.rightPop();// 返回列表中指定范围内的元素
List<String> range = list.range(0, -1);
2.3.4.5 集合(Set)操作
// 向集合添加一个或多个成员
RSet<String> set = redisson.getSet("set");
set.add("value");// 返回集合中的所有成员
Set<String> members = set.readAll();// 移除集合中的一个或多个成员
set.remove("value");// 检查成员是否是集合的成员
boolean isMember = set.contains("value");
2.3.4.6 有序集合(Sorted Set)操作
// 向有序集合添加一个成员
RScoredSortedSet<String> sortedSet = redisson.getScoredSortedSet("sortedSet");
sortedSet.add(10.0, "value");// 返回有序集合中指定范围内的成员
List<String> range = sortedSet.getValues(0, -1);// 移除有序集合中的一个或多个成员
sortedSet.remove("value");// 返回成员的分数
Double score = sortedSet.getScore("value");
2.3.4.7 哈希(Hash)操作
// 将哈希表的字段设置为值
RMap<String, String> map = redisson.getMap("map");
map.fastPut("field", "value");// 获取哈希表中字段的值
String value = map.get("field");// 获取哈希表中所有的字段和值
Map<String, String> entries = map.readAllMap();// 删除哈希表中的一个或多个字段
map.fastRemove("field");
2.3.4.8 发布/订阅(Pub/Sub)操作
// 发布消息到频道
RTopic<String> topic = redisson.getTopic("channel");
topic.publish("message");// 创建一个新的订阅实例来订阅频道
topic.addListener(String.class, (channel, message) -> {System.out.println("Received message: " + message);
});
2.3.4.9 事务
// 开始一个事务
TransactionResult result = redisson.multi();// 执行事务中的所有命令
result.exec();
2.3.4.10 脚本
// 执行 Lua 脚本
RScript script = redisson.getScript();
RObject eval = script.eval(RScript.Mode.READ_ONLY, "return redis.call('get', KEYS[1])", RScript.ReturnType.VALUE, "myKey");

相关文章:

Redis客户端(Jedis、RedisTemplate、Redisson)

1. 简介 Redis作为一个当下很火热的非关系型数据库&#xff0c;Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库&#xff0c;需要借助于市面上的开源客户端&#xff0c;如Jedis、Spring Data Redis、Redisson&#xff0c;它们可以作为操作Redis非关系型数据库的桥…...

虚幻引擎内各个组件的关系

1. GameMode: 关系: GameMode 是游戏规则的制定者和管理者,GameState 则是游戏状态的记录者和同步者。GameMode 通常负责创建和初始化 GameState。 交互: GameMode 可以直接访问和修改 GameState 的属性,例如更新游戏分数、切换游戏阶段等。GameState 的变化会通过 GameMode …...

Python Flask Web框架快速入门

Flask 入门Demo Flask 开发环境搭建&#xff0c;执行如下指令&#xff1a; pip install flask# 第一节: Flask 快速入门from flask import Flask app Flask(__name__)app.route(/flask) def hello_flask():return Hello Flaskapp.run()核心代码剖析&#xff1a; 从flask包导…...

【java学习笔记】Set接口实现类-LinkedHashSet

一、LinkedHashSet的全面说明 &#xff08;就是把数组不同位置的链表当成一个节点然后相连&#xff09;...

阿里云ACP云计算模拟试题(附答案解析)

1、将基础设施作为服务的云计算服务类型是_____服务。 A.laas B.Paas C.SaaS D.Daas 答案&#xff1a;A 解析&#xff1a;基础设施即服务有时缩写为 IaaS&#xff0c;包含云 IT 的基本构建块&#xff0c;通常提供对联网功能、计算机&#xff08;虚拟或专用硬件&#x…...

java 缓存篇2

缓存的部署方式 单机主从哨兵集群 特性主从&#xff08;Master-Slave&#xff09;哨兵&#xff08;Sentinel&#xff09;集群&#xff08;Cluster&#xff09;数据分片不支持不支持支持&#xff0c;基于 slot 进行水平分片高可用性部分支持&#xff08;手动故障转移&#xff…...

12.11-12.12总结(约瑟夫问题 机器翻译 滑动窗口)

12.11 刷题 《算法竞赛》这本书看了很多了&#xff0c;但是题目没咋做&#xff0c;所以今天来刷一下题 P1996约瑟夫问题 还依稀记得大一的时候被约瑟夫支配的恐惧&#xff08;哭&#xff09;&#xff0c;但是现在做就感觉很简单&#xff08;虽然也敲了一会&#xff0c;今早感…...

Elasticsearch+Kibana+IK分词器+拼音分词器安装

目录 ES报错 Kibanaik分词器拼音分词器 安装都比较简单&#xff0c;可以参考这几篇博客 ES 如何在 Linux&#xff0c;MacOS 及 Windows 上进行安装 Elasticsearch 报错 ES启动报错error downloading geoip database [GeoLite2-ASN.mmdb] Kibana KIBANA的安装教程&#xff…...

2020 年“泰迪杯”数据分析职业技能大赛A 题教育平台的线上课程智能推荐策略

2020 年“泰迪杯”数据分析职业技能大赛A 题教育平台的线上课程智能推荐策略 完整代码请私聊 博主 一、 背景 近年来&#xff0c;随着互联网与通信技术的高速发展&#xff0c;学习资源的建设与共享呈现出新的发展趋势&#xff0c;各种网课、慕课、直播课等层出不穷&#xff0c…...

运维面试题

1 deployment和statefulset区别 Kubernetes (k8s) 中的 Deployment 和 StatefulSet 是两种不同类型的控制器&#xff0c;用于管理应用的生命周期&#xff0c;但它们适用于不同的应用场景。以下是它们在存储、调度顺序和网络分配方面的区别&#xff1a; 存储 Deployment: 适用…...

计算机网络之网络层超详细讲解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之网络层超详细讲解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; …...

Windows桌面系统管理2:VMware Workstation使用和管理

Windows桌面系统管理0:总目录-CSDN博客 Windows桌面系统管理1:计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2:VMware Workstation使用和管理 Windows桌面系统管理3:Windows 10操作系统部署与使用-CSDN博客 Windows桌面系统管理4:Windows 10操作系统运维管理-…...

深入理解 CSS 文本换行: overflow-wrap 和 word-break

前言 正常情况下&#xff0c;在固定宽度的盒子中的中文会自动换行。但是&#xff0c;当遇到非常长的英文单词或者很长的 URL 时&#xff0c;文本可能就不会自动换行&#xff0c;而会溢出所在容器。幸运的是&#xff0c;CSS 为我们提供了一些和文本换行相关的属性&#xff1b;今…...

【Linux】Ubuntu:安装系统后配置

hostname&#xff1a;更改主机名 打开终端。 使用hostnamectl命令更改主机名。 sudo hostnamectl set-hostname 新的主机名你可以使用hostnamectl 命令来验证更改是否成功&#xff1a; hostnamectlChrome&#xff1a;更换默认浏览器 以下是从 Ubuntu 中移除预装的 Snap 版 Fi…...

我们来学mysql -- MSI安装(安装篇)

主题 书接上文&#xff0c;在《探讨win安装方式》中官方推荐MSI要是把大厂的标准奉为圭臬&#xff0c;说啥认啥&#xff0c;他一翻脸&#xff0c;小丑不就是咱了再说了&#xff0c;都干到家门口了8.4版本官方文档&#xff0c;还不给他梭罗下 MSI 点击**.msi弹出MySQL Install…...

MySQL其一,概念学习,可视化软件安装以及增删改查语句

目录 MySQL 1、数据库的概念 2、数据库分类 3、MySQL的安装 4、安装过程中的问题 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、编写SQL语句 6、DDL语句 7、DML 新增数据&#xff1a; 删除数据&#xff1a; 修改数据&#xff1a; MySQL SQL其实是一门…...

SpringCloud 题库

这篇文章是关于 SpringCloud 面试题的汇总&#xff0c;包括微服务的概念、SpringCloud 的组成及相关技术&#xff0c;如服务注册与发现、负载均衡、容错等&#xff0c;还涉及 Nacos 配置中心、服务注册表结构等原理&#xff0c;以及微服务架构中的日志采集、服务网关、相关概念…...

【ETCD】[源码阅读]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法

在分布式系统中&#xff0c;etcd 的一致性与高效性得益于其强大的 Raft 协议模块。而 processInternalRaftRequestOnce 是 etcd 服务器处理内部 Raft 请求的核心方法之一。本文将从源码角度解析这个方法的逻辑流程&#xff0c;帮助读者更好地理解 etcd 的内部实现。 方法源码 …...

数据分析与机器学习全解析

一、数据分析基础要点 &#xff08;一&#xff09;数据收集 确定数据源&#xff1a;明确是内部数据库、外部公开数据、传感器采集还是用户调研等来源&#xff0c;不同来源数据质量与获取难度各异。例如内部销售数据可直接获取&#xff0c;而市场调研数据需设计问卷并投入人力收…...

Qt 一个简单的QChart 绘图

Qt 一个简单的QChart 绘图 先上程序运行结果图&#xff1a; “sample9_1QChart.h” 文件代码如下&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample9_1QChart.h"#include <QtCharts> //必须这么设置 QT_CHARTS_USE_NAME…...

力扣——322. 零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...

Qt之网络监测

在Qt中&#xff0c;网络监测通常涉及到检测网络连接状态、网络延迟、带宽使用情况等。Qt提供了一些类和模块来帮助开发者实现这些功能。以下是一些常用的方法和类&#xff1a; 1. 检测网络连接状态 QtNetwork模块中的QNetworkConfigurationManager类可以用来检测设备的网络连…...

抓包软件fiddler和wireshark使用手册

fiddler官方文档 Fiddler 抓包教程1 Fiddler 抓包教程2 wireshark抓包学习 2添加链接描述 ip 过滤 ip.src_host ip.dst_host ip.addr mac 过滤 eth.src eth.dst eth.addr 端口过滤 tcp.port tcp.srcport tcp.dstport 协议类型过滤 arp dhcp 规则组合 and or...

【从零开始入门unity游戏开发之——C#篇03】变量和常量

文章目录 一、变量1、什么是变量&#xff1f;2、申明变量的固定写法3、变量的类型值和引用类型的区别无符号和有符号位——表示变量所占用的内存空间的大小范围——表示变量的取值范围取值范围和存储单位的关系为什么byte的范围是 0 到 255&#xff1f;为什么 sbyte 的范围是 -…...

SpringBoot 手动实现动态切换数据源 DynamicSource (上)

大家好&#xff0c;我是此林。 在实际开发中&#xff0c;经常可能遇到在一个SpringBoot Web应用中需要访问多个数据源的情况。 下面来介绍一下多数据源的使用场景、底层原理和手动实现。 一、 多数据源经典使用场景 场景一&#xff1a;业务复杂&#xff0c;数据量过大 1. 业务…...

ERROR Error: command failed: yarnError: command failed: yarn

1、异常信息 2、解决 解决方法一&#xff1a; WinR进入命令行&#xff0c;重新安装npm(如果报镜像源问题建议镜像源也重新配置) 输入命令&#xff0c;重新安装npm/yarn #npm npm install#npm 配置镜像源 npm config set registry https://registry.npmmirror.com#npm 查看镜…...

【java】finalize方法

目录 1. 说明2. 调用过程3. 注意事项 1. 说明 1.finalize方法是Java中Object类的一个方法。2.finalize方法用于在对象被垃圾回收之前执行一些清理工作。3.当JVM&#xff08;Java虚拟机&#xff09;确定一个对象不再被引用、即将被回收时&#xff0c;会调用该对象的finalize方法…...

C++ 内存管理和模板与STL

此篇目是之后各种C库的基础 目录 内存管理 内存分布 内存管理方式 new和delete operator new 与 operator delete函数 实现原理 定位new表达式(placement-new) 模板基础 泛型编程 模板 函数模板 类模板 STL 组成部分 内存管理 内存分布 int globalVar 1; //全局变量 静…...

同一个局域网下的两台电脑实现定时或者实时拷贝数据

【亲测能用】 需求&#xff1a;从数据库服务器上将数据库备份文件*.bak&#xff0c;每天定时拷贝到局域网下另一台电脑上&#xff0c;实现异机备份。 本文中192.168.1.110是本机&#xff0c;192.168.1.130是异机&#xff08;备份机&#xff09;。需求是每天定时从192.168.1.1…...

Python毕业设计选题:基于django+vue的汽车租赁管理网站

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 用户管理 汽车品牌管理 汽车信息管理 汽车租赁管理 汽车商品信息管理 汽车租赁 购物…...

scrapy对接rabbitmq的时候使用post请求

之前做分布式爬虫的时候,都是从push url来拿到爬虫消费的链接,这里提出一个问题,假如这个请求是post请求的呢,我观察了scrapy-redis的源码,其中spider.py的代码是这样写的 1.scrapy-redis源码分析 def make_request_from_data(self, data):"""Returns a Reques…...

Netty 性能优化与调试指南

Netty 是一款高性能的网络通信框架&#xff0c;其高性能得益于良好的设计和优化。但是在实际使用中&#xff0c;如果配置或实现不当&#xff0c;可能会导致性能下降或调试困难。本文将从性能优化和调试两方面入手&#xff0c;详细讲解如何在使用 Netty 时提高应用性能和诊断问题…...

网络安全产品之认识WEB应用防火墙

随着B/S架构的广泛应用&#xff0c;Web应用的功能越来越丰富&#xff0c;蕴含着越来越有价值的信息&#xff0c;应用程序漏洞被恶意利用的可能性越来越大&#xff0c;因此成为了黑客主要的攻击目标。传统防火墙无法解析HTTP应用层的细节&#xff0c;对规则的过滤过于死板&#…...

R学习——因子

目录 1 定义因子&#xff08;factor函数&#xff09; 2因子的作用 一个数据集中的 只需要考虑可以用哪个数据来进行分类就可以了&#xff0c;可以用来分类就可以作为因子。 Cy1这个因子对应的水平level是4 6 8&#xff1a; 1 定义因子&#xff08;factor函数&#xff09; 要…...

2024 亚马逊云科技re:Invent:Werner Vogels架构哲学,大道至简 六大经验助力架构优化

在2024亚马逊云科技re:Invent全球大会第四天的主题演讲中&#xff0c;亚马逊副总裁兼CTO Dr.Werner Vogels分享了 The Way of Simplexity&#xff0c;繁简之道&#xff0c;浓缩了Werner在亚马逊20年构建架构的经验。 Werner表示&#xff0c;复杂性总是会“悄无声息”地渗透进来…...

【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)

117. 软件构建&#xff08;拓扑排序&#xff09; 继续边看解析边做题&#xff0c;思考时的问题做个如下的总结&#xff1a; 1. 存边用什么数据结构&#xff1f; 在题目中&#xff0c;我们需要存储节点之间的依赖关系&#xff08;边信息&#xff09;。选择适合的数据结构非常重…...

单目深度估计模型 lite-mono 测试

lite-mono 使用工业数据集kitti 进行训练&#xff0c;目的使用单目摄像头实现物体深度预测&#xff0c;关于kitti数据集的介绍和下载参考 &#xff08;二&#xff09;一文带你了解KITTI数据集-CSDN博客文章浏览阅读2.7w次&#xff0c;点赞64次&#xff0c;收藏294次。文章介绍…...

JAVA基础学习笔记_网络编程

文章目录 网络编程网络编程三要素IPIPv4细节InetAddress 端口号协议 UDPUDP协议(发数据)UDP协议(接受数据)UDP聊天室单播,组播,广播 TCP中文乱码问题代码细节,三次握手和四次挥手 网络编程 计算机之间通过网络进行数据传输 软件结构 C/S,Client/Server,客户端服务器,精美但麻…...

说下JVM中一次完整的GC流程?

大家好&#xff0c;我是锋哥。今天分享关于【说下JVM中一次完整的GC流程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说下JVM中一次完整的GC流程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中&#xff0c;垃圾回收&#xff08;GC&am…...

鸿蒙NEXT开发案例:保质期计算

【引言】 保质期计算应用是一个基于鸿蒙NEXT框架开发的数字和文本统计组件。用户可以输入商品的生产日期和保质期天数&#xff0c;应用会自动计算并展示相关信息&#xff0c;包括保质状态、剩余天数、生产日期和到期日期。 【环境准备】 • 操作系统&#xff1a;Windows 10 …...

LLM并发加速部署方案(llama.cpp、vllm、lightLLM、fastLLM)

大模型并发加速部署 解析当前应用较广的几种并发加速部署方案&#xff01; llama.cpp、vllm、lightllm、fastllm四种框架的对比&#xff1a; llama.cpp&#xff1a;基于C&#xff0c;①请求槽&#xff0c;②动态批处理&#xff0c;③CPU/GPU混合推理vllm&#xff1a;基于Pyth…...

用最小的代价解决mybatis-plus关于批量保存的性能问题

1.问题说明 问题背景说明&#xff0c;在使用达梦数据库时&#xff0c;mybatis-plus的serviceImpl.saveBatch()方法或者updateBatchById()方法的时候&#xff0c;随着数据量、属性字段的增加&#xff0c;效率越发明显的慢。 serviceImpl.saveBatch(); serviceImpl.updateBatch…...

蓝桥杯历届真题 --#递推 翻硬币(C++)

文章目录 思路完整代码结语 原题链接 思路 通过观察测试用例&#xff0c;我们猜测&#xff0c;从左到右依次对比每一个位置上的状态&#xff0c;如果不一样我们就翻一次&#xff0c;最终得到的答案即为正解。 完整代码 //这里是引入了一些常用的头文件,和一些常规操作 //第一…...

BurpSuite-8(FakeIP与爬虫审计)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;IP伪造和爬虫审计_哔哩哔哩_bilibili 一、FakeIP 1.配置环境 BurpSuite是java环境下编写的&#xff0c;而今天的插件是python编写的&#xff0c…...

JAVA8、Steam、list运用合集

Steam运用 Java Stream API为开发人员提供了一种函数式和声明式的方式来表达复杂的数据转换和操作,使代码更加简洁和富有表现力。 1、使用原始流以获得更好的性能【示例:求和】 使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流…...

深入详解人工智能机器学习:强化学习

目录 强化学习概述 强化学习的基本概念 定义 关键组件 强化学习过程 常用算法 应用示例 示例代码 代码解释 应用场景 强化学习核心概念和底层原理 核心概念 底层原理 总结 强化学习概述 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习中的…...

docker的简单使用

文章目录 docker简介docker架构镜像和容器镜像有关的常用命令容器相关常用命令 docker简介 Docker是一个开源的应用容器引擎&#xff0c;基于Go语言并遵从Apache2.0协议开源。 Docker可以让开方子打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到…...

启动的docker容器里默认运行dockerd

问题 已在Dockerfile里yum install docker 但docker run 启动容器后, docker ps等命令无法执行 ps -aux 没有dockerd 进程 临时解决 另开一个终端 docker exec -it 容器名 bash 手动启 dockerd 默认启动 分析 现在启动容器的默认命令是 /sbin/init sbin/init 是根文件系统…...

Python爬虫技术的最新发展

在互联网的海洋中&#xff0c;数据就像是一颗颗珍珠&#xff0c;而爬虫技术就是我们手中的潜水艇。2024年&#xff0c;爬虫技术有了哪些新花样&#xff1f;让我们一起潜入这个话题&#xff0c;看看最新的发展和趋势。 1. 异步爬虫&#xff1a;速度与激情 随着现代Web应用的复…...

什么是厄尔米特(Hermitian)矩阵?

厄米矩阵&#xff08;Hermitian Matrix&#xff09;定义 在数学和物理中&#xff0c;厄米矩阵是满足以下条件的复方阵&#xff1a; A A † \mathbf{A}\mathbf{A}^\dagger AA† 其中&#xff0c; A † \mathbf{A}^\dagger A†表示矩阵 A \mathbf{A} A的共轭转置&#xff0c;即…...