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

java操作redis库,开箱即用

application.yml

spring:application:name: demo#Redis相关配置redis:data:# 地址host: localhost# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password:# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 8# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms

依赖

<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-starter-test</artifactId><scope>test</scope></dependency>

序列化配置

package com.example.demo.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;@Configuration
public class RedisConfig {//编写我们自己的配置redisTemplate@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);// JSON序列化配置Jackson2JsonRedisSerializer jsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper=new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jsonRedisSerializer.setObjectMapper(objectMapper);// String的序列化StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();//key和hash的key都采用String的序列化方式template.setKeySerializer(stringRedisSerializer);template.setHashKeySerializer(stringRedisSerializer);//value和hash的value都采用jackson的序列化方式template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);template.afterPropertiesSet();return template;}
}

工具类

package com.example.demo.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;import java.util.*;
import java.util.concurrent.TimeUnit;/*** spring redis 工具类** @author ruoyi**/
@SuppressWarnings(value = { "unchecked", "rawtypes" })
@Component
public class RedisCache
{@Autowiredpublic RedisTemplate redisTemplate;/*** 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值*/public <T> void setCacheObject(final String key, final T value){redisTemplate.opsForValue().set(key, value);}/*** 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值* @param timeout 时间* @param timeUnit 时间颗粒度*/public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit){redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}/*** 设置有效时间** @param key Redis键* @param timeout 超时时间* @return true=设置成功;false=设置失败*/public boolean expire(final String key, final long timeout){return expire(key, timeout, TimeUnit.SECONDS);}/*** 设置有效时间** @param key Redis键* @param timeout 超时时间* @param unit 时间单位* @return true=设置成功;false=设置失败*/public boolean expire(final String key, final long timeout, final TimeUnit unit){return redisTemplate.expire(key, timeout, unit);}/*** 获取有效时间** @param key Redis键* @return 有效时间*/public long getExpire(final String key){return redisTemplate.getExpire(key);}/*** 判断 key是否存在** @param key 键* @return true 存在 false不存在*/public Boolean hasKey(String key){return redisTemplate.hasKey(key);}/*** 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public <T> T getCacheObject(final String key){ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);}/*** 删除单个对象** @param key*/public boolean deleteObject(final String key){return redisTemplate.delete(key);}/*** 删除集合对象** @param collection 多个对象* @return*/public boolean deleteObject(final Collection collection){return redisTemplate.delete(collection) > 0;}/*** 缓存List数据** @param key 缓存的键值* @param dataList 待缓存的List数据* @return 缓存的对象*/public <T> long setCacheList(final String key, final List<T> dataList){Long count = redisTemplate.opsForList().rightPushAll(key, dataList);return count == null ? 0 : count;}/*** 获得缓存的list对象** @param key 缓存的键值* @return 缓存键值对应的数据*/public <T> List<T> getCacheList(final String key){return redisTemplate.opsForList().range(key, 0, -1);}/*** 缓存Set** @param key 缓存键值* @param dataSet 缓存的数据* @return 缓存数据的对象*/public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet){BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);Iterator<T> it = dataSet.iterator();while (it.hasNext()){setOperation.add(it.next());}return setOperation;}/*** 获得缓存的set** @param key* @return*/public <T> Set<T> getCacheSet(final String key){return redisTemplate.opsForSet().members(key);}/*** 缓存Map** @param key* @param dataMap*/public <T> void setCacheMap(final String key, final Map<String, T> dataMap){if (dataMap != null) {redisTemplate.opsForHash().putAll(key, dataMap);}}/*** 获得缓存的Map** @param key* @return*/public <T> Map<String, T> getCacheMap(final String key){return redisTemplate.opsForHash().entries(key);}/*** 往Hash中存入数据** @param key Redis键* @param hKey Hash键* @param value 值*/public <T> void setCacheMapValue(final String key, final String hKey, final T value){redisTemplate.opsForHash().put(key, hKey, value);}/*** 获取Hash中的数据** @param key Redis键* @param hKey Hash键* @return Hash中的对象*/public <T> T getCacheMapValue(final String key, final String hKey){HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();return opsForHash.get(key, hKey);}/*** 获取多个Hash中的数据** @param key Redis键* @param hKeys Hash键集合* @return Hash对象集合*/public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys){return redisTemplate.opsForHash().multiGet(key, hKeys);}/*** 删除Hash中的某条数据** @param key Redis键* @param hKey Hash键* @return 是否成功*/public boolean deleteCacheMapValue(final String key, final String hKey){return redisTemplate.opsForHash().delete(key, hKey) > 0;}/*** 获得缓存的基本对象列表** @param pattern 字符串前缀* @return 对象列表*/public Collection<String> keys(final String pattern){return redisTemplate.keys(pattern);}
}

测试类

RedisCache

package com.example.demo.test;import com.example.demo.utils.RedisCache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;import java.util.*;
import java.util.concurrent.TimeUnit;@SpringBootTest
class RedisCacheTest {@AutowiredRedisCache redisCache;@AutowiredRedisTemplate redisTemplate;private static final String TEST_KEY = "test:list:key";// 1.缓存对象@Testpublic void setObject() {// redisCache.setCacheObject("object","test");// 附带过期时间redisCache.setCacheObject("object", "test", 10, TimeUnit.SECONDS);}// 2.过期时间@Testpublic void setTimeOut() {redisCache.setCacheObject("object", "test");// 更新过期时间redisCache.expire("object", 100, TimeUnit.SECONDS);// 获取过期时间System.out.println(redisCache.getExpire("object"));;}// 3.判断key是否存在@Testpublic void check() {System.out.println(redisCache.hasKey("object"));}// 4.获取对象@Testpublic void getObject() {System.out.println((String) redisCache.getCacheObject("object"));}// 5.删除对象/如果传递集合就是删除多个key@Testpublic void deleteObject() {redisCache.setCacheObject("obj", "1");System.out.println((String) redisCache.getCacheObject("obj"));redisCache.deleteObject("obj");System.out.println((String) redisCache.getCacheObject("obj"));}// 6.获取list对象@Testpublic void getList() {// 1. 准备测试数据List<String> testData = Arrays.asList("item1", "item2", "item3");redisCache.setCacheList(TEST_KEY, testData);// 2. 调用获取方法List<Object> result = redisCache.getCacheList(TEST_KEY);// 3. 验证结果for (Object o : result) {System.out.println(o);}}// 7.获取set对象@Testpublic void getSet() {// 1. 准备测试数据Set<String> set = Set.of("a", "b");redisCache.setCacheSet("TestSet", set);// 2. 调用获取方法Set<Object> cacheSet = redisCache.getCacheSet("TestSet");// 3. 验证结果for (Object o : cacheSet) {System.out.println(o);}}// 8.Map@Testpublic void getMap() {// 1. 准备测试数据Map<String, String> stringStringMap = new HashMap<>();stringStringMap.put("name","zww");stringStringMap.put("age","21");redisCache.setCacheMap("TestMap", stringStringMap);// 2. 调用获取方法Map<String, Object> testMap = redisCache.getCacheMap("TestMap");// 3. 验证结果System.out.println(testMap.get("name"));System.out.println(testMap.get("age"));}// 9.hash数据 对比map多了一个外层key@Testpublic void getHash() {// 1. 准备测试数据redisCache.setCacheMapValue("hashMap","testHashMap","1");redisCache.setCacheMapValue("hashMap","testHashMap2","2");// 2. 调用获取方法System.out.println((String) redisCache.getCacheMapValue("hashMap","testHashMap"));System.out.println((String) redisCache.getCacheMapValue("hashMap","testHashMap2"));}}

RedisTemplate

package com.example.demo.test;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;@SpringBootTest
public class RedisTemplateTest {@AutowiredRedisTemplate redisTemplate;/*** 操作String类型的数据*/@Testvoid contextLoads() {// redisTemplate.opsForValue().set("mannor" ,"rediaz");String mannor = (String) redisTemplate.opsForValue().get("mannor");System.out.println(mannor);redisTemplate.opsForValue().set("k1", "v1", 10L, TimeUnit.SECONDS);Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("mannor1", "mannor");System.out.println(aBoolean);}/*** 操作hash类型的数据*/@Testpublic void hashTest() {HashOperations hashOperations = redisTemplate.opsForHash();// 存hashOperations.put("002", "name", "zhangsan");hashOperations.put("002", "age", "20");hashOperations.put("002", "addr", "beijing");// 取Object age = hashOperations.get("002", "age");
//        System.out.println((String) age);// 获取所有字段Set keys = hashOperations.keys("002");for (Object key : keys) {
//            System.out.println(key);}// 获得hash结构中的所有值List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);}}/*** 操作list类型的数据*/@Testpublic void listTest() {ListOperations listOperations = redisTemplate.opsForList();// 存listOperations.leftPush("list", "00");listOperations.leftPushAll("list", "01", "02", "03");// 取值List list = listOperations.range("list", 0, -1);for (Object val : list) {System.out.println(val);}System.out.println("------------------------------------------------------------");// 获取长度来遍历Long size = listOperations.size("list");for (int i = 0; i < size; i++) {// 出队列String element = (String) listOperations.rightPop("list");System.out.println(element);}}/*** 操作Set类型的数据*/@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();// 存值setOperations.add("myset", "a", "b", "c", "a");// 取值Set<String> myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}// 删除成员setOperations.remove("myset", "a", "b");// 取值myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}}@Testpublic void testZset() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();// 存值zSetOperations.add("myZset", "a", 10.0);zSetOperations.add("myZset", "b", 11.0);zSetOperations.add("myZset", "c", 12.0);zSetOperations.add("myZset", "a", 13.0);// 取值Set<String> myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}// 修改分数zSetOperations.incrementScore("myZset", "b", 20.0);// 取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}// 删除成员zSetOperations.remove("myZset", "a", "b");// 取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}}/*** 通用操作,针对不同的数据类型都可以操作*/@Testpublic void testCommon() {// 获取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}// 判断某个key是否存在Boolean itcast = redisTemplate.hasKey("itcast");System.out.println(itcast);// 删除指定keyredisTemplate.delete("myZset");// 获取指定key对应的value的数据类型DataType dataType = redisTemplate.type("myset");System.out.println(dataType.name());}
}

相关文章:

java操作redis库,开箱即用

application.yml spring:application:name: demo#Redis相关配置redis:data:# 地址host: localhost# 端口&#xff0c;默认为6379port: 6379# 数据库索引database: 0# 密码password:# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最…...

clickhouse中的窗口函数

窗口函数 边界核心参数 窗口边界通过 ROWS、RANGE 或 GROUPS 模式定义,语法为: ROWS BETWEEN AND 基于 ​物理行位置 定义窗口,与排序键的实际值无关,适用于精确控制窗口行数 – 或 RANGE BETWEEN AND 基于 ​排序键的数值范围 定义窗口,适用于时间序列或连续数值的场景(…...

YZ系列工具之YZ02:字典的多功能应用

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…...

金山科技在第91届中国国际医疗器械博览会CMEF 首发新品 展现智慧装备+AI

4月8日—11日&#xff0c;国家会展中心&#xff08;上海&#xff09;&#xff0c;第91届中国国际医疗器械&#xff08;春季&#xff09;博览会&#xff08;以下简称“CMEF 2025”&#xff09;举办。金山科技在盛会上隆重推出年度新品——全高清电子内镜光学放大镜与肛肠测压系统…...

STM32 BOOT设置,bootloader,死锁使用方法

目录 BOOT0 BOOT1的配置含义 bootloader使用方法 芯片死锁解决方法开发调试过程中&#xff0c;由于某种原因导致内部Flash锁死&#xff0c;无法连接SWD以及JTAG调试&#xff0c;无法读到设备&#xff0c;可以通过修改BOOT模式重新刷写代码。修改为BOOT01&#xff0c;BOOT10…...

机器学习:让数据开口说话的科技魔法

在人工智能飞速发展的今天&#xff0c;「机器学习」已成为推动数字化转型的核心引擎。无论是手机的人脸解锁、网购平台的推荐系统&#xff0c;还是自动驾驶汽车的决策能力&#xff0c;背后都离不开机器学习的技术支撑。那么&#xff0c;机器学习究竟是什么&#xff1f;它又有哪…...

PDF解析示例代码学习

以下是结合多种技术实现的PDF解析详细示例&#xff08;Python实现&#xff09;&#xff0c;涵盖文本、表格和扫描件处理场景&#xff1a; 一、环境准备与依赖安装 # 核心依赖库 pip install pdfplumber tabula-py pytesseract opencv-python mysql-connector-python 二、完整…...

【云平台监控】安装应用Ansible服务

安装应用Ansible服务 文章目录 安装应用Ansible服务资源列表基础环境一、安装Ansible1.1、部署Ansible1.2、配置主机清单1.2.1、方法11.2.2、方法2 二、Ansible命令应用基础2.1、ping模块2.2、command模块2.3、user模块2.4、group模块2.5、cron模块2.6、copy模块2.7、file模块2…...

项目执行中的目标管理:从战略到落地的闭环实践

——如何让目标不“跑偏”、团队不“掉队”&#xff1f; 引言&#xff1a;为什么目标管理决定项目成败&#xff1f; 根据PMI研究&#xff0c;47%的项目失败源于目标模糊或频繁变更。在复杂多变的项目环境中&#xff0c;目标管理不仅是制定KPI&#xff0c;更是构建“方向感-执行…...

如何优雅地处理 API 版本控制?

API 会不断发展&#xff0c;而用户的需求也会随之变化。那么&#xff0c;如何确保你的 API 在升级时不会影响现有用户&#xff1f;答案就是&#xff1a;API 版本控制。就像你更新了一个应用程序&#xff0c;引入了新功能&#xff0c;但旧功能仍然保留&#xff0c;让老用户继续愉…...

如何通过Radius认证服务器实现虚拟云桌面安全登录认证:安当ASP身份认证系统解决方案

引言&#xff1a;虚拟化时代的安全挑战 随着云计算和远程办公的普及&#xff0c;虚拟云桌面&#xff08;如VMware Horizon、Citrix&#xff09;已成为企业数字化办公的核心基础设施。然而&#xff0c;传统的用户名密码认证方式暴露了诸多安全隐患&#xff1a;弱密码易被暴力破…...

自然语言处理spaCy

spaCy 是一个流行的开源 自然语言处理&#xff08;NLP&#xff09; 库&#xff0c;专注于 高效、易用和工业化应用。它由 Explosion AI 开发&#xff0c;广泛应用于文本处理、信息提取、机器翻译等领域。 zh_core_web_sm 是 spaCy 提供的一个小型中文预训练语言模型&#xff0…...

大语言模型(LLMs)中的强化学习(Reinforcement Learning, RL)

第一部分&#xff1a;强化学习基础回顾 在深入探讨LLMs中的强化学习之前&#xff0c;我们先快速回顾一下强化学习的核心概念&#xff0c;确保基础扎实。 1. 强化学习是什么&#xff1f; 强化学习是一种机器学习范式&#xff0c;目标是让智能体&#xff08;Agent&#xff09;…...

数字后端实现Innovus DRC Violation之如何利用脚本批量解决G4:M7i DRC Violation

大家在跑完物理验证calibre DRC之后&#xff0c;会发现DRC里面存在一种G4:M7i的DRC违例&#xff0c;这种违例一般都是出现在memory的边界。今天教大家如何利用脚本来批量处理这一类DRC问题的解决。 首先&#xff0c;我们需要把calibre的DRC结果读取到innovus里面来&#xff0c…...

Java版企业电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…...

CTF web入门之文件上传

知识点 产生文件上传漏洞的原因 原因: 对于上传文件的后缀名(扩展名)没有做较为严格的限制 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件) 对于web server对于上传…...

ArmSoM Sige5 CM5:RK3576 上 Ultralytics YOLOv11 边缘计算新标杆

在计算机视觉技术加速落地的今天&#xff0c;ArmSoM 正式宣布其基于 ​​Rockchip RK3576​​ 的旗舰产品 ​​Sige5 开发板​​ 和 ​​CM5 核心板​​ 全面支持 Ultralytics YOLOv11 模型的 RKNN 部署。这一突破标志着边缘计算领域迎来新一代高性能、低功耗的 AI 解决方案&am…...

游戏引擎学习第224天

回顾游戏运行并指出一个明显的图像问题。 回顾一下之前那个算法 我们今天要做一点预加载的处理。上周刚完成了游戏序章部分的所有剪辑内容。在运行这一部分时&#xff0c;如果观察得足够仔细&#xff0c;就会注意到一个问题。虽然因为视频流压缩质量较低&#xff0c;很难清楚…...

PN1-S25系列ProfiNet网关模组产品方案

PN1-S25系列ProfiNet网关模组是一款专为工业通信环境设计的先进设备&#xff0c;旨在实现ProfiNet与Modbus RTU协议之间的无缝转换&#xff0c;从而优化工业自动化系统中的数据传输效率。以下是对该系列ProfiNet网关模组产品的详细介绍&#xff1a; 一、ProfiNet网关模组功能特…...

提示工程指南学习记录(三)

提示词示例 文本概括 Explain the above in one sentence&#xff08;用一句话解释上面的信息&#xff09;&#xff1a; 提示词工程是一种用于自然语言处理的任务&#xff0c;目的是通过给定的文本或语音输入来生成相应的输出。它基于预训练的大型语言模型&#xff0c;例如通…...

04 GE - 钳制属性,等级

1.PostGameplayEffectExecute 1.作用&#xff1a;在这里对生命值进行最后的钳制防止越界。 2.参数中有什么&#xff1a; FGameplayEffectModCallbackData //传进来的值 {EffectSpec; //GESpecTargetASC //目标ASCFGameplayModifierEvaluatedData& EvaluatedData{Magni…...

【机器学习】机器学习笔记

1 机器学习定义 计算机程序从经验E中学习&#xff0c;解决某一任务T&#xff0c;进行某一性能P&#xff0c;通过P测定在T上的表现因经验E而提高。 eg&#xff1a;跳棋程序 E&#xff1a; 程序自身下的上万盘棋局 T&#xff1a; 下跳棋 P&#xff1a; 与新对手下跳棋时赢的概率…...

使用SSE实现实时消息推送并语音播报:从后端到前端的完整指南

前言 在现代Web应用中&#xff0c;实时消息推送已成为提升用户体验的关键功能。无论是即时聊天、通知提醒还是实时数据更新&#xff0c;都需要一种高效的服务器到客户端的通信机制。本文将详细介绍如何使用Server-Sent Events (SSE)技术实现后端向前端的实时消息推送&#xff…...

交通运输部4项网络与数据安全标准发布

近日&#xff0c;交通运输部审查通过并发布《交通运输数据安全风险评估指南》《交通运输行业网络安全实战演练工作规程》《交通运输电子证照数据交换与应用要求》《冷藏集装箱智能终端技术规范》等 4 项交通运输行业标准&#xff08;2025 年第 3 批&#xff09;。 ​其中&#…...

HarmonyOS-ArkUI V2装饰器: @Monitor装饰器:状态变量修改监听

Monitor作用 Monitor的作用就是来监听状态变量的值变化的。被Monitor修饰的函数,会在其对应监听的变量发生值的变化时,回调此函数,从而可以让您知道是什么值发生变化了,变化前是什么值,变化后是什么值。 V1版本的装饰器,有个叫@Watch的装饰器,其实也有监听变化的能力,…...

在Ubuntu系统中运行Windows程序

在Ubuntu系统中运行Windows程序可通过以下方法实现&#xff0c;根据使用场景和需求选择最适合的方案&#xff1a; 一、使用Wine兼容层&#xff08;推荐轻量级场景&#xff09; 原理&#xff1a;通过模拟Windows API环境直接运行.exe文件&#xff0c;无需安装完整系统。 步骤&a…...

七大数据库全面对比:ClickHouse、ES、MySQL等特性、优缺点及使用场景

七大数据库全面对比:ClickHouse、ES、MySQL等特性、优缺点及使用场景 引言 在数字化时代,数据库的选择对于业务的成功至关重要。本文将通过表格形式,对ClickHouse、Elasticsearch(ES)、MySQL、SQL Server、MongoDB、HBase、Cassandra这七大数据库进行特性、优缺点及使用…...

循环神经网络 - 门控循环单元网络之参数学习

GRU&#xff08;门控循环单元&#xff09;的参数学习与其他循环神经网络类似&#xff0c;主要依赖于梯度下降和反向传播通过时间&#xff08;BPTT&#xff09;算法。下面我们通过一个简单例子来说明 GRU 参数是如何在训练过程中“自适应”调整的。 一、GRU参数学习 假设我们的…...

Java并发编程面试题:内存模型(6题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

SpringBoot Starter自定义:创建可复用的自动配置模块

文章目录 引言一、自定义Starter基础知识二、创建自动配置模块2.1 项目结构搭建2.2 配置属性类2.3 服务接口及实现2.4 自动配置类2.5 spring.factories文件2.6 Maven依赖配置 三、创建Starter模块3.1 项目结构3.2 Maven依赖配置 四、使用自定义Starter4.1 添加依赖4.2 配置属性…...

服务器风扇故障导致过热问题的解决方案

# 服务器风扇故障导致过热问题的解决方案 ## 一、故障诊断与确认 ### 1. 确认风扇故障现象 bash # 检查系统日志中的硬件错误 dmesg | grep -i fan journalctl -b | grep -i thermal # 查看传感器数据&#xff08;需要安装lm-sensors&#xff09; sudo sensors-detect sudo …...

[OS] vDSO + vvar(频繁调用的处理) | 存储:寄存器(高效)和栈(空间大)| ELF标准包装规范(加速程序加载)

vDSO vvar 一、社区公告板系统&#xff08;类比 vDSO vvar&#xff09; 想象你住在一个大型社区&#xff0c;管理员&#xff08;内核&#xff09;需要向居民&#xff08;用户程序&#xff09;提供实时信息&#xff08;如天气预报、社区活动时间等&#xff09;。直接让每个居…...

SQL刷题日志(day1)

1、substring_index&#xff08;截取字符串&#xff09; 参数说明&#xff1a; profile&#xff1a;要处理的字符串字段。,&#xff1a;分隔符。-1&#xff1a;表示从字符串的右侧开始截取&#xff0c;第一个出现的分隔符后面的所有内容。 SELECT SUBSTRING_INDEX(profile, ,…...

爬虫:一文掌握 curl-cffi 的详细使用(支持 TLS/JA3 指纹仿真的 cURL 库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、curl-cffi 概述1.1 curl-cffi介绍1.2 主要特性1.3 适用场景1.4 使用 curl-cffi 的注意事项1.5 与 requests 和 pycurl 对比1.6 curl-cffi 的安装二、基本使用2.1 同步请求2.2 异步请求三、高级功能3.1 模拟浏览器指…...

前端开发基础:HTML 与 CSS 入门详解

目录 一、HTML 基础 &#xff08;一&#xff09;HTML 概述 &#xff08;二&#xff09;HTML 标签 标签分类 常用标签详解 &#xff08;三&#xff09;HTML 注释 二、CSS 样式 &#xff08;一&#xff09;CSS 概述 &#xff08;二&#xff09;CSS 引入方式 &#xff0…...

实时语音交互数字人VideoChat,可自定义形象与音色,支持音色克隆,首包延迟低至3s

简介 实时语音交互数字人&#xff0c;支持端到端语音方案&#xff08;GLM-4-Voice - THG&#xff09;和级联方案&#xff08;ASR-LLM-TTS-THG&#xff09;。用户可通过麦克风或文本输入&#xff0c;与数字人进行语音或视频交互。 目前支持的功能 支持自定义形象TTS模块添加音…...

25.OpenCV中的霍夫圆变换

OpenCV中的霍夫圆变换 在图像处理与计算机视觉中&#xff0c;圆形检测是一项常见的任务&#xff0c;应用场景包括车牌识别、瞳孔检测、交通标志识别等。霍夫圆变换&#xff08;Hough Circle Transform&#xff09;是一种高效且鲁棒的算法&#xff0c;通过在参数空间中寻找局部…...

OpenTiny使用指南

最近项目里用到了一个新的组件库——OpenTiny&#xff0c;但是官方文档的使用指南的描述很复杂&#xff0c;花了一些时间尝试才正常使用。下面是一个使用步骤的描述&#xff0c;可放心食用&#xff1a; 一、安装 TinyVue 组件库同时支持 Vue 2.0 和 Vue 3.0 框架&#xff0c;…...

Uniapp: 大纲

目录 一、基础巩固1.1、Uniapp:下拉选择框ba-tree-picker 二、项目配置2.1、Uniapp&#xff1a;修改端口号2.2、Uniapp&#xff1a;本地存储 一、基础巩固 1.1、Uniapp:下拉选择框ba-tree-picker 二、项目配置 2.1、Uniapp&#xff1a;修改端口号 2.2、Uniapp&#xff1a;本…...

A2A协议实现详解及示例

A2A协议概述 A2A (Agent2Agent) 是Google推出的一个开放协议&#xff0c;旨在使AI智能体能够安全地相互通信和协作。该协议打破了孤立智能体系统之间的壁垒&#xff0c;实现了复杂的跨应用自动化。[1] A2A协议的核心目标是让不同的AI代理能够相互通信、安全地交换信息以及在各…...

HTTP协议入门

文章目录 1. 概述2. 请求协议2.1 Get 方式请求协议2.2 POST 方式的请求2.3 获取请求数据 3. 响应协议3.1 响应数据格式3.2 设置响应数据 1. 概述 概念 &#xff1a;Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则…...

远程控制Android手机(web-scrcpy)

最近有web远程查看和控制Android手机的需求&#xff0c;研究了一下scrcpy&#xff0c;发现还是比较容易实现远程控制&#xff0c;所以自己就用flask写了一个web远程控制的scrcpy&#xff0c;算是推荐一下自己的作品&#xff0c;作品地址&#xff1a;https://github.com/baixin1…...

在AWS EC2上部署网站的完整步骤指南

本文详细介绍如何从零开始在AWS EC2实例上部署静态/动态网站&#xff0c;涵盖实例创建、安全组配置、环境搭建及域名绑定等关键步骤。 一、准备工作 AWS账号&#xff1a;访问 AWS官网 注册账号并完成信用卡绑定 本地工具&#xff1a; SSH客户端&#xff08;Mac/Linux自带终端&…...

CentOS下,Xftp中文文件名乱码的处理方式

乱码原因 中文版Windows默认使用GBK编码&#xff0c;现代Linux发行版&#xff08;如CentOS、Ubuntu等&#xff09;默认使用UTF-8编码。Windows下正常的编码&#xff0c;可能在linux下无法识别&#xff0c;例如&#xff1a;Windows的GBK字节0xD6D0被Linux用UTF-8解码时&#xf…...

Linux vagrant 导入ubuntu到virtualbox

前言 vagrant 导入ubuntu虚拟机 前提要求 安装 virtualbox 和vagrant<vagrant-disksize> (Linux 方式 Windows 方式) 创建一键部署ubuntu虚拟机 /opt/vagrant 安装目录/opt/VirtualBox 安装目录/opt/ubuntu22/Vagrantfile &#xff08;可配置网络IP&#xff0c;内存…...

2025高频面试算法总结篇【动态规划】

文章目录 直接刷题链接直达编辑距离最长回文子串完全平方数最长递增子序列正则表达式匹配零钱兑换鸡蛋掉落单词拆分 直接刷题链接直达 动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种通过拆解子问题并利用子问题的最优解来构建整体问题的最优解的方法&#x…...

FPGA_UART

1.UART 概述 &#xff08;通用异步收发传输器&#xff09; 1. 基本定义 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;是一种常见的串行通信协议&#xff0c;用于在设备间通过异步串行通信传输数据。它不依赖独立的时钟信号&#xff0c;而是通过预…...

绿算轻舟系列FPGA加速卡:驱动数字化转型的核心动力

在数字化浪潮席卷全球的今天&#xff0c;算力已成为推动企业创新和行业升级的核心引擎。绿算轻舟系列FPGA加速卡凭借其高性能、低延迟、高能效比的独特优势&#xff0c;正成为各领域智能化转型的“隐形加速器”。它以灵活的硬件架构和强大的并行计算能力&#xff0c;为复杂场景…...

gitee基本使用

git实用手册 git全局设置 git config --global user.name "yourname" git config --global user.email "youremail"推代码时的账号&#xff08;email) 版本回退 git loggit reset –hard <码>git push -f HTTPS步骤(上传) 拉取项目 1、新建一个…...

最短路径介绍

最短路径是图论中的算法&#xff0c;下面将列举几个常见的算法&#xff1a; &#x1f697; 一、单源最短路径&#xff08;一个起点到所有点&#xff09; 1. Dijkstra 算法 适用图&#xff1a;非负权图&#xff08;不能有负权边&#xff09; 思路&#xff1a;贪心 最小堆&am…...