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 的抽象,它包括 RedisTemplate
和 StringRedisTemplate
等模板类,简化了 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作为一个当下很火热的非关系型数据库,Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库,需要借助于市面上的开源客户端,如Jedis、Spring Data Redis、Redisson,它们可以作为操作Redis非关系型数据库的桥…...

Mybatis中SQL的执行过程
文章目录 Mybatis 框架SQL执行过程数据库操作映射方式SQL的执行过程- SQL解析- SQL参数映射- SQL预编译- SQL执行- 结果映射- 事务处理- 缓存处理- 日志记录与监控 扩展#与$的区别- $ 符号- # 符号总结示例 Mybatis SQL分类- 动态 SQL- 静态 SQL静态SQL和动态SQL选择${}、#{}与…...

【数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现顺序栈的基本运算。 相关知识 为了完成本关任务,你需要掌握: 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取…...

【论文阅读】PRIS: Practical robust invertible network for image steganography
内容简介 论文标题:PRIS: Practical robust invertible network for image steganography 作者:Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间:2024年4月11日 Engineering Applications of Artificial Intelligence 关键…...
在Linux桌面系统普及化方面的一些建议
在推动Linux桌面系统普及化的过程中,可以考虑以下几个方案和策略: 用户友好性改进: 界面设计:提升用户界面的美观性和易用性,使其更接近或超越主流操作系统的用户体验。软件兼容性:确保常用软件(…...

LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144353087 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 VLMEva…...

数据结构(Queue队列)
前言: 在计算机科学中,数据结构是构建高效算法和程序的基础,而队列(Queue)作为一种经典的线性数据结构,具有重要的地位。与栈(Stack)不同,队列遵循“先进先出”…...
Qt 图形框架下图形拖动后位置跳动问题
在使用Qt 的图形框架QGraphicsScene,QGraphicsView实现图形显示时。遇到一个很棘手的BUG。 使用的图形是自定义的QGraphicsObject的子类。 现象是将图形添加到画布上之后,用鼠标拖动图形,图形能正常改变位置,当再次用鼠标点击图…...

【Linux篇】走进Linux — 开启开源操作系统之旅
文章目录 初识Linux一.Linux的起源与发展二.Linux的特点三.Linux的应用四.Linux的发行版本 Linux环境搭建一.Linux环境的搭建方式二.购买云服务器三.使用XShell远程登陆到Linux 初识Linux 一.Linux的起源与发展 1.初始动机: Linux是一个功能强大的开源操作系统&am…...

如何利用DBeaver配置连接MongoDB和人大金仓数据库
最近根据国产化要求,需要使用国产数据库,但习惯使用DBeaver连接各种成熟的商业或开源数据库。因此,就想着如何继续基于该工具,连接MongoDB和人大金仓数据库,查了半天很多地方说法不统一,所以自己就简单整理…...

Android 车载虚拟化底层技术-Kernel 5.10 -Android12(multi-cards)技术实现
详细代码实现见 Android Display Graphics系列文章-汇总Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 本文主要包括部分: 一、Android12的Kernel 5.10版本 1.1 Kernel 5…...

Qt之点击鼠标右键创建菜单栏使用(六)
Qt开发 系列文章 - menu(六) 目录 前言 一、示例演示 二、菜单栏 1.MenuBar 2.Menu 总结 前言 QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(status…...

开发一套SDK 第一弹
自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…...

sftp+sshpass
实现场景,要求客户端定时将本地的日志文件传输到服务器。 工作环境ubuntu,注意不通操作系统的版本不通,依赖的工具的版本也有所不同 实现目标需要客户端满足安装工具: 1、下载安装sshpass ---安装命令:sudo apt-ge…...

【机器学习与数据挖掘实战】案例01:基于支持向量回归的市财政收入分析
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...

Idea实现定时任务
定时任务 什么是定时任务? 可以自动在项目中根据设定的时长定期执行对应的操作 实现方式 Spring 3.0 版本之后自带定时任务,提供了EnableScheduling注解和Scheduled注解来实现定时任务功能。 使用SpringBoot创建定时任务非常简单,目前主要…...
Linux 安装NFS共享文件夹
程序默认使用2049端口,如果被占用需要修改端口104设置为服务端 122设置为客户端 一、在线安装(服务端和客户端执行) yum install nfs-utils rpcbind -y二、配置启动参数(服务端执行) 104服务器/mnt路径下创建shareda…...
bash 判断内存利用率是否高于60%
在 Bash 脚本中,可以通过 free 命令获取内存利用率,然后结合 awk 和条件判断语句实现监控内存利用率是否高于 60%。以下是一个示例脚本: 1. 示例脚本 #!/bin/bash# 获取总内存和已使用内存 total_mem$(free | awk /Mem:/ {print $2}) used_…...

推送(push)项目到gitlab
文章目录 1、git init1.1、在当前目录中显示隐藏文件:1.2、查看已有的远程仓库1.3、确保你的本地机器已经生成了 SSH 密钥:1.4、将生成的公钥文件(通常位于 ~/.ssh/id_rsa.pub)复制到 GitLab 的 SSH 设置中:1.5、测试 …...

centos9升级OpenSSH
需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2(根据需求进行升级) 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...