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

redis工具类

前言

Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列、实时分析等场景。为了更高效地操作 Redis,许多开发者会选择使用 Redisson 客户端库。

依赖配置

首先确保您的项目中已经包含了 Redisson 的最新版本(如 3.44.0)以及相关依赖项。对于 Maven 项目,您需要在 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.44.0</version>
</dependency>

对于 Gradle 项目,请在 build.gradle 中添加:

implementation 'org.redisson:redisson:3.44.0'

同时,确保 Spring 上下文已正确配置,以便通过 SpringUtils.getBean(RedissonClient.class) 获取 RedissonClient 实例。


RedisUtils 工具类详解

/*** redis 工具类**/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public class RedisUtils {private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class);/*** 限流** @param key          限流key* @param rateType     限流类型* @param rate         速率* @param rateInterval 速率间隔* @return -1 表示失败*/public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval) {return rateLimiter(key, rateType, rate, rateInterval, 0);}/*** 限流** @param key          限流key* @param rateType     限流类型* @param rate         速率* @param rateInterval 速率间隔* @param timeout      超时时间* @return -1 表示失败*/public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval, int timeout) {RRateLimiter rateLimiter = CLIENT.getRateLimiter(key);rateLimiter.trySetRate(rateType, rate, Duration.ofSeconds(rateInterval), Duration.ofSeconds(timeout));if (rateLimiter.tryAcquire()) {return rateLimiter.availablePermits();} else {return -1L;}}/*** 获取客户端实例*/public static RedissonClient getClient() {return CLIENT;}/*** 发布通道消息** @param channelKey 通道key* @param msg        发送数据* @param consumer   自定义处理*/public static <T> void publish(String channelKey, T msg, Consumer<T> consumer) {RTopic topic = CLIENT.getTopic(channelKey);topic.publish(msg);consumer.accept(msg);}/*** 发布消息到指定的频道** @param channelKey 通道key* @param msg        发送数据*/public static <T> void publish(String channelKey, T msg) {RTopic topic = CLIENT.getTopic(channelKey);topic.publish(msg);}/*** 订阅通道接收消息** @param channelKey 通道key* @param clazz      消息类型* @param consumer   自定义处理*/public static <T> void subscribe(String channelKey, Class<T> clazz, Consumer<T> consumer) {RTopic topic = CLIENT.getTopic(channelKey);topic.addListener(clazz, (channel, msg) -> consumer.accept(msg));}/*** 缓存基本的对象,Integer、String、实体类等** @param key   缓存的键值* @param value 缓存的值*/public static <T> void setCacheObject(final String key, final T value) {setCacheObject(key, value, false);}/*** 缓存基本的对象,保留当前对象 TTL 有效期** @param key       缓存的键值* @param value     缓存的值* @param isSaveTtl 是否保留TTL有效期(例如: set之前ttl剩余90 set之后还是为90)* @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案*/public static <T> void setCacheObject(final String key, final T value, final boolean isSaveTtl) {RBucket<T> bucket = CLIENT.getBucket(key);if (isSaveTtl) {try {bucket.setAndKeepTTL(value);} catch (Exception e) {long timeToLive = bucket.remainTimeToLive();if (timeToLive == -1) {setCacheObject(key, value);} else {setCacheObject(key, value, Duration.ofMillis(timeToLive));}}} else {bucket.set(value);}}/*** 缓存基本的对象,Integer、String、实体类等** @param key      缓存的键值* @param value    缓存的值* @param duration 时间*/public static <T> void setCacheObject(final String key, final T value, final Duration duration) {RBatch batch = CLIENT.createBatch();RBucketAsync<T> bucket = batch.getBucket(key);bucket.setAsync(value);bucket.expireAsync(duration);batch.execute();}/*** 如果不存在则设置 并返回 true 如果存在则返回 false** @param key   缓存的键值* @param value 缓存的值* @return set成功或失败*/public static <T> boolean setObjectIfAbsent(final String key, final T value, final Duration duration) {RBucket<T> bucket = CLIENT.getBucket(key);return bucket.setIfAbsent(value, duration);}/*** 如果存在则设置 并返回 true 如果存在则返回 false** @param key   缓存的键值* @param value 缓存的值* @return set成功或失败*/public static <T> boolean setObjectIfExists(final String key, final T value, final Duration duration) {RBucket<T> bucket = CLIENT.getBucket(key);return bucket.setIfExists(value, duration);}/*** 注册对象监听器* <p>* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置** @param key      缓存的键值* @param listener 监听器配置*/public static <T> void addObjectListener(final String key, final ObjectListener listener) {RBucket<T> result = CLIENT.getBucket(key);result.addListener(listener);}/*** 设置有效时间** @param key     Redis键* @param timeout 超时时间* @return true=设置成功;false=设置失败*/public static boolean expire(final String key, final long timeout) {return expire(key, Duration.ofSeconds(timeout));}/*** 设置有效时间** @param key      Redis键* @param duration 超时时间* @return true=设置成功;false=设置失败*/public static boolean expire(final String key, final Duration duration) {RBucket rBucket = CLIENT.getBucket(key);return rBucket.expire(duration);}/*** 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public static <T> T getCacheObject(final String key) {RBucket<T> rBucket = CLIENT.getBucket(key);return rBucket.get();}/*** 获得key剩余存活时间** @param key 缓存键值* @return 剩余存活时间*/public static <T> long getTimeToLive(final String key) {RBucket<T> rBucket = CLIENT.getBucket(key);return rBucket.remainTimeToLive();}/*** 删除单个对象** @param key 缓存的键值*/public static boolean deleteObject(final String key) {return CLIENT.getBucket(key).delete();}/*** 删除集合对象** @param collection 多个对象*/public static void deleteObject(final Collection collection) {RBatch batch = CLIENT.createBatch();collection.forEach(t -> {batch.getBucket(t.toString()).deleteAsync();});batch.execute();}/*** 检查缓存对象是否存在** @param key 缓存的键值*/public static boolean isExistsObject(final String key) {return CLIENT.getBucket(key).isExists();}/*** 缓存List数据** @param key      缓存的键值* @param dataList 待缓存的List数据* @return 缓存的对象*/public static <T> boolean setCacheList(final String key, final List<T> dataList) {RList<T> rList = CLIENT.getList(key);return rList.addAll(dataList);}/*** 追加缓存List数据** @param key  缓存的键值* @param data 待缓存的数据* @return 缓存的对象*/public static <T> boolean addCacheList(final String key, final T data) {RList<T> rList = CLIENT.getList(key);return rList.add(data);}/*** 注册List监听器* <p>* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置** @param key      缓存的键值* @param listener 监听器配置*/public static <T> void addListListener(final String key, final ObjectListener listener) {RList<T> rList = CLIENT.getList(key);rList.addListener(listener);}/*** 获得缓存的list对象** @param key 缓存的键值* @return 缓存键值对应的数据*/public static <T> List<T> getCacheList(final String key) {RList<T> rList = CLIENT.getList(key);return rList.readAll();}/*** 获得缓存的list对象(范围)** @param key  缓存的键值* @param form 起始下标* @param to   截止下标* @return 缓存键值对应的数据*/public static <T> List<T> getCacheListRange(final String key, int form, int to) {RList<T> rList = CLIENT.getList(key);return rList.range(form, to);}/*** 缓存Set** @param key     缓存键值* @param dataSet 缓存的数据* @return 缓存数据的对象*/public static <T> boolean setCacheSet(final String key, final Set<T> dataSet) {RSet<T> rSet = CLIENT.getSet(key);return rSet.addAll(dataSet);}/*** 追加缓存Set数据** @param key  缓存的键值* @param data 待缓存的数据* @return 缓存的对象*/public static <T> boolean addCacheSet(final String key, final T data) {RSet<T> rSet = CLIENT.getSet(key);return rSet.add(data);}/*** 注册Set监听器* <p>* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置** @param key      缓存的键值* @param listener 监听器配置*/public static <T> void addSetListener(final String key, final ObjectListener listener) {RSet<T> rSet = CLIENT.getSet(key);rSet.addListener(listener);}/*** 获得缓存的set** @param key 缓存的key* @return set对象*/public static <T> Set<T> getCacheSet(final String key) {RSet<T> rSet = CLIENT.getSet(key);return rSet.readAll();}/*** 缓存Map** @param key     缓存的键值* @param dataMap 缓存的数据*/public static <T> void setCacheMap(final String key, final Map<String, T> dataMap) {if (dataMap != null) {RMap<String, T> rMap = CLIENT.getMap(key);rMap.putAll(dataMap);}}/*** 注册Map监听器* <p>* key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置** @param key      缓存的键值* @param listener 监听器配置*/public static <T> void addMapListener(final String key, final ObjectListener listener) {RMap<String, T> rMap = CLIENT.getMap(key);rMap.addListener(listener);}/*** 获得缓存的Map** @param key 缓存的键值* @return map对象*/public static <T> Map<String, T> getCacheMap(final String key) {RMap<String, T> rMap = CLIENT.getMap(key);return rMap.getAll(rMap.keySet());}/*** 获得缓存Map的key列表** @param key 缓存的键值* @return key列表*/public static <T> Set<String> getCacheMapKeySet(final String key) {RMap<String, T> rMap = CLIENT.getMap(key);return rMap.keySet();}/*** 往Hash中存入数据** @param key   Redis键* @param hKey  Hash键* @param value 值*/public static <T> void setCacheMapValue(final String key, final String hKey, final T value) {RMap<String, T> rMap = CLIENT.getMap(key);rMap.put(hKey, value);}/*** 获取Hash中的数据** @param key  Redis键* @param hKey Hash键* @return Hash中的对象*/public static <T> T getCacheMapValue(final String key, final String hKey) {RMap<String, T> rMap = CLIENT.getMap(key);return rMap.get(hKey);}/*** 删除Hash中的数据** @param key  Redis键* @param hKey Hash键* @return Hash中的对象*/public static <T> T delCacheMapValue(final String key, final String hKey) {RMap<String, T> rMap = CLIENT.getMap(key);return rMap.remove(hKey);}/*** 删除Hash中的数据** @param key   Redis键* @param hKeys Hash键*/public static <T> void delMultiCacheMapValue(final String key, final Set<String> hKeys) {RBatch batch = CLIENT.createBatch();RMapAsync<String, T> rMap = batch.getMap(key);for (String hKey : hKeys) {rMap.removeAsync(hKey);}batch.execute();}/*** 获取多个Hash中的数据** @param key   Redis键* @param hKeys Hash键集合* @return Hash对象集合*/public static <K, V> Map<K, V> getMultiCacheMapValue(final String key, final Set<K> hKeys) {RMap<K, V> rMap = CLIENT.getMap(key);return rMap.getAll(hKeys);}/*** 设置原子值** @param key   Redis键* @param value 值*/public static void setAtomicValue(String key, long value) {RAtomicLong atomic = CLIENT.getAtomicLong(key);atomic.set(value);}/*** 获取原子值** @param key Redis键* @return 当前值*/public static long getAtomicValue(String key) {RAtomicLong atomic = CLIENT.getAtomicLong(key);return atomic.get();}/*** 递增原子值** @param key Redis键* @return 当前值*/public static long incrAtomicValue(String key) {RAtomicLong atomic = CLIENT.getAtomicLong(key);return atomic.incrementAndGet();}/*** 递减原子值** @param key Redis键* @return 当前值*/public static long decrAtomicValue(String key) {RAtomicLong atomic = CLIENT.getAtomicLong(key);return atomic.decrementAndGet();}/*** 获得缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id)* <P>* limit-设置扫描的限制数量(默认为0,查询全部)* pattern-设置键的匹配模式(默认为null)* chunkSize-设置每次扫描的块大小(默认为0,本方法设置为1000)* type-设置键的类型(默认为null,查询全部类型)* </P>* @see KeysScanOptions* @param pattern 字符串前缀* @return 对象列表*/public static Collection<String> keys(final String pattern) {return  keys(KeysScanOptions.defaults().pattern(pattern).chunkSize(1000));}/*** 通过扫描参数获取缓存的基本对象列表* @param keysScanOptions 扫描参数* <P>* limit-设置扫描的限制数量(默认为0,查询全部)* pattern-设置键的匹配模式(默认为null)* chunkSize-设置每次扫描的块大小(默认为0)* type-设置键的类型(默认为null,查询全部类型)* </P>* @see KeysScanOptions*/public static Collection<String> keys(final KeysScanOptions keysScanOptions) {Stream<String> keysStream = CLIENT.getKeys().getKeysStream(keysScanOptions);return keysStream.collect(Collectors.toList());}/*** 删除缓存的基本对象列表(全局匹配忽略租户 自行拼接租户id)** @param pattern 字符串前缀*/public static void deleteKeys(final String pattern) {CLIENT.getKeys().deleteByPattern(pattern);}/*** 检查redis中是否存在key** @param key 键*/public static Boolean hasKey(String key) {RKeys rKeys = CLIENT.getKeys();return rKeys.countExists(key) > 0;}
}

RedisUtils 类是一个封装了 Redis 常用操作的工具类,提供了限流、发布/订阅、缓存管理等多种功能。

1. 限流机制(Rate Limiting)

方法签名:
public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval)
public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval, int timeout)
参数说明:
  • key: 限流规则的唯一标识。
  • rateType: 限流类型(例如 RATE 表示固定速率,BURST 表示突发流量)。
  • rate: 单位时间内允许的最大请求数量。
  • rateInterval: 速率间隔时间(秒)。
  • timeout: 超时时间(秒),默认为0表示无超时。
示例代码:
long result = RedisUtils.rateLimiter("api:rateLimit", RateType.RATE, 10, 60);
if (result == -1) {System.out.println("请求过于频繁,请稍后再试");
} else {System.out.println("请求成功");
}

此功能常用于限制 API 请求频率,防止服务器过载。

2. 发布/订阅消息

方法签名:
public static <T> void publish(String channelKey, T msg)
public static <T> void publish(String channelKey, T msg, Consumer<T> consumer)
public static <T> void subscribe(String channelKey, Class<T> clazz, Consumer<T> consumer)
参数说明:
  • channelKey: 频道名称。
  • msg: 发送的消息内容。
  • consumer: 自定义处理逻辑。
示例代码:
// 订阅消息
RedisUtils.subscribe("newsChannel", String.class, message -> {System.out.println("Received message: " + message);
});// 发布消息
RedisUtils.publish("newsChannel", "Breaking News!");

此功能可用于构建基于事件驱动的应用架构,如通知系统或即时通讯应用。

3. 缓存管理

提供了多种缓存对象的方法,支持设置有效期、检查缓存存在性、删除缓存等。

方法签名:
public static <T> void setCacheObject(final String key, final T value)
public static <T> T getCacheObject(final String key)
public static boolean deleteObject(final String key)
示例代码:
// 设置缓存
RedisUtils.setCacheObject("user:1001:name", "Alice");// 获取缓存
String userName = RedisUtils.getCacheObject("user:1001:name");// 删除缓存
RedisUtils.deleteObject("user:1001:name");

这些方法非常适合于实现数据缓存,减少数据库查询压力。

4. 数据类型操作

针对不同的 Redis 数据类型(如列表、集合、映射),提供了相应的操作方法。

方法签名:
public static <T> boolean setCacheList(final String key, final List<T> dataList)
public static <T> Set<T> getCacheSet(final String key)
public static <T> void setCacheMap(final String key, final Map<String, T> dataMap)
示例代码:
// 设置列表缓存
RedisUtils.setCacheList("user:1001:tags", Arrays.asList("developer", "blogger"));// 获取集合缓存
Set<String> tags = RedisUtils.getCacheSet("user:1001:tags");// 设置映射缓存
Map<String, String> profile = new HashMap<>();
profile.put("name", "Alice");
profile.put("age", "30");
RedisUtils.setCacheMap("user:1001:profile", profile);

这些方法使得对复杂数据结构的操作变得简单而直观。


如何在项目中使用 RedisUtils

确保上述依赖和配置完成后,可以直接在代码中调用 RedisUtils 类中的静态方法来执行 Redis 操作。例如,在服务层或控制器中调用 setCacheObject 方法来缓存用户信息。

示例:
@RestController
public class UserController {@GetMapping("/cacheUser")public String cacheUser() {User user = new User();user.setId(1001);user.setName("Alice");// 使用 RedisUtils 缓存用户信息RedisUtils.setCacheObject("user:" + user.getId(), user);return "User cached successfully";}
}

注意事项

  1. 慎用通配符删除:误操作可能导致数据丢失。
  2. 测试环境验证:在生产环境执行删除操作前,务必在测试环境中验证。
  3. 监控与备份:定期备份数据,使用监控工具(如 RedisInsight)跟踪键的变化。

相关文章:

redis工具类

前言 Redis 是一个高性能的键值存储系统&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。为了更高效地操作 Redis&#xff0c;许多开发者会选择使用 Redisson 客户端库。 依赖配置 首先确保您的项目中已经包含了 Redisson 的最新版本&#xff08;如 3.44.0&#xff…...

【Python办公】Excel通用匹配工具(双表互匹)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...

安徽省青少年信息学奥林匹克竞赛初中组第1题LuoguP762

先放题目: 【题目背景】.你 .可 .以 .选 .择 .跳 .过 .背 .景 .部 .分。初春的一天&#xff0c;正是乍暖还寒时候&#xff0c;狂风乍起。小可可裹紧了单薄的外衣&#xff0c;往小雪家中赶去。“今天真不是个出门的时候啊&#xff01;”小可可感叹道。“但是我还有东西要买………...

AVL树的平衡算法的简化问题

AVL树是一种紧凑的二叉查找树。它的每个结点&#xff0c;都有左右子树高度相等&#xff0c;或者只相差1这样的特性。文章https://blog.csdn.net/aaasssdddd96/article/details/106291144给出了一个例子。 为了便于讨论&#xff0c;这里对AVL树的结点平衡情况定义2个名称&#…...

NFS实验配置笔记

NFS NFS服务 nfs&#xff0c;最早是Sun这家公司所发展出来的&#xff0c;它最大的功能就是可以透过网络&#xff0c;让不同的机器&#xff0c;不同的操作系统&#xff0c;进行实现文档的共享。所以你可以简单的将他看做是文件服务器。 实验准备 ①先准备一个服务器端的操作…...

C盘清理技巧分享:释放空间,提升电脑性能

目录 1. 引言 2. C盘空间不足的影响 3. C盘清理的必要性 4. C盘清理的具体技巧 4.1 删除临时文件 4.2 清理系统还原点 4.3 卸载不必要的程序 4.4 清理下载文件夹 4.5 移动大文件到其他盘 4.6 清理系统缓存 4.7 使用磁盘清理工具 4.8 清理Windows更新文件 4.9 禁用…...

【云馨AI-大模型】RAGFlow功能预览:Dify接入外部知识库RAGFlow指南

介绍 Dify介绍 开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力&#xff0c;轻松构建和运营生成式 AI 原生应用。比 LangChain 更易用。官网&#xff1a;https://dify.ai/zh RAGFlow介绍 RAGFlow 是一款基于深度文档理解构建的…...

大模型学习笔记------Llama 3模型架构之旋转编码(RoPE)

大模型学习笔记------Llama 3模型架构之旋转编码&#xff08;RoPE&#xff09; 1、位置编码简介1.1 绝对位置编码1.2 相对位置编码 2、旋转编码&#xff08;RoPE&#xff09;2.1 基本概念---旋转矩阵2.2 RoPE计算原理2.2.1 绝对位置编码2.2.2 相对位置编码 3、旋转编码&#xf…...

Anthropic 的模型

Anthropic 的模型&#xff08;特别是 Claude 系列&#xff09;之所以在性能和推理能力上表现强劲&#xff0c;可以从技术设计、研究理念、训练方法以及应用优化等多个方面进行详细分析。以下是基于当前信息&#xff08;截至 2025 年 3 月 13 日&#xff09;和行业趋势的深入剖析…...

初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo

最近&#xff0c;我开始接触大模型开发&#xff0c;并尝试使用 LangChain 和 DeepSeek 构建了一个简单的 Demo。通过这个 Demo&#xff0c;我不仅加深了对大模型的理解&#xff0c;还体验到了 LangChain 和 DeepSeek 的强大功能。下面&#xff0c;我将分享我的开发过程以及一些…...

FPGA初级项目10——基于SPI的DAC芯片进行数模转换

FPGA初级项目10——基于SPI的DAC芯片进行数模转换 DAC芯片介绍 DAC 芯片&#xff08;数字模拟转换器&#xff09;是一种将数字信号转换为连续模拟信号&#xff08;如电压或电流&#xff09;的集成电路&#xff0c;广泛应用于电子系统中&#xff0c;连接数字世界与模拟世界。 …...

【论文解读】Contrastive Learning for Compact Single Image Dehazing(AECR-Net)

文章目录 问题创新网络主要贡献Autoencoder-like Dehazing NetworkAdaptive Mixup for Feature PreservingDynamic Feature Enhancement1. 可变形卷积的使用2. 扩展感受野3. 减少网格伪影4. 融合空间结构信息 Contrastive Regularization1. 核心思想2. 正样本对和负样本对的构建…...

unity基础——线段与拖尾

1、LineRenderer&#xff08;线段渲染器&#xff09; 为空物体加上组件添加材质 选择默认线段的材质 Default—Line Color&#xff1a;可以修改颜色Corner Vertices&#xff1a;角顶点 圆滑度 End Cap Vertices&#xff1a;边缘顶点 线段编辑 1、可以移动线段点的位置&#xf…...

【服务器知识】Nginx路由匹配规则说明

Nginx路由匹配规则说明 **一、Nginx路由匹配核心机制****二、匹配规则语法详解**1. **精确匹配 ()**2. **前缀匹配 (^~ 或 /)**3. **正则匹配 (~ 或 ~*)**4. **通配符匹配 (*)** **三、路由匹配优先级顺序****四、高级路由技巧**1. **条件判断 (if语句)**2. **路径重写 (rewrit…...

Python----数据可视化(Pyecharts三:绘图二:涟漪散点图,K线图,漏斗图,雷达图,词云图,地图,柱状图折线图组合,时间线轮廓图)

1、涟漪特效散点图 from pyecharts.globals import SymbolType from pyecharts.charts import EffectScatter from pyecharts.faker import Faker from pyecharts import options as opts from pyecharts.globals import ThemeType # 绘制图表 es (EffectScatter(init_optsop…...

机器学习中的梯度下降是什么意思?

梯度下降&#xff08;Gradient Descent&#xff09;是机器学习中一种常用的优化算法&#xff0c;用于最小化损失函数&#xff08;Loss Function&#xff09;。通过迭代调整模型参数&#xff0c;梯度下降帮助模型逐步逼近最优解&#xff0c;从而提升模型的性能。 1.核心思想 梯…...

C语言中的字符串与数组的关系

在C语言中,字符串和数组之间有着紧密的关系。理解它们的区别和联系对于编写高效且可靠的代码至关重要。在本篇博文中,我们将详细分析字符串和数组在C语言中的概念、它们的关系以及如何在编程中应用它们。 一、字符串与数组的基础知识 1.1 数组概念 在C语言中,数组是一组相…...

Ubuntu 18,04 LTS 通过APT安装mips64el的交叉编译器。

安装 g-5v的版本&#xff1a; sudo apt update sudo apt install g-5-mips64el-linux-gnuabi64 How to Install g-5-mips64el-linux-gnuabi64 in Ubuntu 18.04 安装 gcc/g-7v的版本&#xff1a; sudo apt-get install gcc-mips64el-linux-gnu* g-mips64el-linux-gnu* -y 安装…...

MySQL 衍生表(Derived Tables)

在SQL的查询语句select …. from …中&#xff0c;跟在from子句后面的通常是一张拥有定义的实体表&#xff0c;而有的时候我们会用子查询来扮演实体表的角色&#xff0c;这个在from子句中的子查询会返回一个结果集&#xff0c;这个结果集可以像普通的实体表一样查询、连接&…...

C++ vector 核心知识:常用操作与示例详解

在C编程中&#xff0c;vector 是标准模板库&#xff08;STL&#xff09;中最常用的容器之一。它以其动态数组的特性、高效的尾部操作和便捷的随机访问能力&#xff0c;成为处理动态数据的首选工具。无论是初学者还是经验丰富的开发者&#xff0c;掌握 vector 的使用方法和性能优…...

不同开发语言对字符串的操作

一、字符串的访问 Objective-C: 使用 characterAtIndex: 方法访问字符。 NSString *str "Hello, World!"; unichar character [str characterAtIndex:0]; // 访问第一个字符 H NSLog("%C", character); // 输出: H NSString 内部存储的是 UTF-16 编…...

Qt从入门到入土(十) -数据库操作--SQLITE

认识 数据库是用于存储、管理和检索数据的系统化集合。它是一种按照特定结构组织数据的存储方式&#xff0c;通过软件&#xff08;数据库管理系统&#xff0c;DBMS&#xff09;来实现数据的高效存储、查询、更新和管理。通过文件存储数据适用于少量的数据&#xff0c;而当拥有…...

硬件驱动——51单片机:独立按键、中断、定时器/计数器

目录 一、独立按键 1.原理 2.封装函数 3.按键控制点灯 数码管 二、中断 1.原理 2.步骤 3.中断寄存器IE 4.控制寄存器TCON 5.打开外部中断0和1 三、定时器/计数器 1.原理 2.控制寄存器TCON 3.工作模式寄存器TMOD 4.按键控制频率的动态闪烁 一、独立按键 1…...

pgsql创建新用户并赋只读权限

在 PostgreSQL 中&#xff0c;为新用户赋予只读权限的步骤如下&#xff1a; —### 1. 创建新用户首先&#xff0c;创建一个新用户&#xff08;角色&#xff09;&#xff0c;并设置密码&#xff1a;sqlCREATE ROLE 用户名 WITH LOGIN PASSWORD 密码;例如&#xff1a;sqlCREATE R…...

【量化策略】动量突破策略

【量化策略】动量突破策略 &#x1f680;量化软件开通 &#x1f680;量化实战教程 技术背景与应用场景 动量突破策略是一种基于市场趋势的量化交易策略&#xff0c;它通过识别和利用资产价格的持续上升或下降趋势来获取利润。这种策略特别适用于那些价格波动较大、趋势明显…...

QT编程之QGIS

一、QGIS介绍 Quantum GIS&#xff08;QGIS&#xff09;是开源地理信息系统桌面软件&#xff0c;使用GNU&#xff08;General Public License&#xff09;授权&#xff0c; 属于 Open Source eospatial Foundation&#xff08; OSGeo &#xff09;的官方计划。在 GNU 授权下&am…...

LangChain-chatchat 0.3.x入门级教程

前言 一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。该项目支持市面上主流的开源 LLM、 Embedding 模型与向量数据库&#xff0c;可实现全部使用开源模型离线私有部署。…...

Vi/Vim命令详解:高效文本编辑的利器

Vi/Vim命令详解&#xff1a;高效文本编辑的利器 Vi和Vim是Unix/Linux系统中极为流行的文本编辑器&#xff0c;它们以其强大的功能和高效的操作方式赢得了广大用户的喜爱。无论是对于程序员、系统管理员还是普通用户&#xff0c;掌握Vi/Vim的基本命令和高级技巧都是非常有必要的…...

【前端三剑客】万字总结JavaScript

一、初识JavaScript 1.1 JavaScript 的作用 表单动态校验&#xff08;密码强度检测&#xff09; &#xff08; JS 产生最初的目的 &#xff09;网页特效服务端开发(Node.js)桌面程序(Electron)App(Cordova)控制硬件-物联网(Ruff)游戏开发(cocos2d-js) 1.2 HTML/CSS/JS 的关系…...

MySQL | MySQL表的增删改查(CRUD)

目录 前言&#xff1a;什么是 CRUD ?一、Creat 新增1.1 语法1.2 示例1.2.1 单行数据全列插入1.2.2 单行数据指定列插入1.2.3 多行数据指定列插入 二、Retrieve 检索2.1 语法2.2 示例2.2.1 全列查询2.2.2 指定列查询2.2.3 查询字段为表达式2.2.4 结果去重查询2.2.5 where条件查…...

【愚公系列】《高效使用DeepSeek》003-DeepSeek文档处理和其他顶级 AI模型的区别

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

OSC32IN与OSC32OUT对于无源晶振而言有区别吗?

OSC32IN与OSC32OUT对于无源晶振而言有区别吗&#xff1f; 答&#xff1a;没有区别。对晶振本身而言&#xff0c;两个频率管脚反接也是一样的。 如下图所示&#xff1a; 使用示波器连接晶振的两个引脚&#xff0c;并观察波形可以帮助确定输入和输出端口。 当晶振工作正常时&…...

究竟什么是虚拟同步机???虚拟同步机巨简单理解

1同步发电机 1.1同步发电机工作原理 同步发电机定子铁芯的内圆均匀分布着定子槽,槽内按一定规律嵌放着对称的三相绕组U1-U2、V1-V2、W1-W2,如图1所示。 图1 同步发电机的结构原理图 工作原理: 转子铁芯上装有制成一定形状的成对磁极,磁极上绕有励磁绕组。励磁绕组上通直流…...

ZVA-Z90,罗德与施瓦茨毫米波变换器

罗德与施瓦茨 ZVA-Z90毫米波变换器​ 商品品牌&#xff1a;R&S/罗德与施瓦茨 商品型号&#xff1a;ZVA-Z90 商品名称&#xff1a;毫米波变换器 产品简介: ZVA-Z 毫米波变换器 简介 R&SZVA-Zxx 毫米波变换器支持在 V、E、W、F、D、G、J 以及 Y 频段内的毫米波测量…...

TCP/IP 协议精讲-精华总结版本

序言 本文旨在介绍一下TCP/IP涉及得所有基础知识&#xff0c;为大家从宏观上俯瞰TCP/IP提供一个基石&#xff0c;文档属于《TCP/IP图解&#xff08;第五版&#xff09;》的精简版本。 专业术语 缩写 全称 WAN Wide area network广域网 LAN Local area network局域网 TC…...

电脑内存不足怎么办?

常规解决方法盘点 关闭后台程序&#xff1a;按下【Ctrl Shift Esc】组合键打开任务管理器&#xff0c;在 “进程” 选项卡里&#xff0c;把当前不用的程序统统 “结束任务” &#xff0c;像那些自动更新的软件、常驻后台的播放器&#xff0c;关了能释放不少内存。比如音乐软…...

PTP协议赋能高精度时间同步网络

什么是PTP&#xff1f; PTP&#xff08;精确时间协议&#xff0c;Precision Time Protocol&#xff09; 是一种基于IEEE 1588标准的网络时间同步协议&#xff0c;旨在为分布式系统中的设备提供亚微秒级&#xff08;甚至纳秒级&#xff09;的高精度时钟同步。其核心目标是通过消…...

【redis】string应用场景:缓存功能和计数功能

文章目录 缓存功能实现思路存在的问题伪代码实现 记数功能实现思路统计伪代码实现 缓存功能 实现思路 整体的思路&#xff1a; 应用服务器访问数据的时候&#xff0c;先查询 Redis 如果 Redis 上数据存在了&#xff0c;就直接从 Redis 读取数据交给应用服务器&#xff0c;不继…...

oracle中OS BLOCK的含义

在Oracle数据库中&#xff0c;OS BLOCK&#xff08;操作系统数据块&#xff09;是指操作系统层面上的数据块&#xff0c;它与Oracle数据库内部的逻辑存储单元BLOCK&#xff08;数据块&#xff09;有所区别但密切相关。以下是对OS BLOCK的详细解释&#xff1a; 定义与概念 OS BL…...

SSM企业台账管理平台

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 SS…...

Linux下使用pigz工具结合tar实现并行压缩提升压缩和解压速度

说明 tar命令是在 Unix 和类 Unix 系统中用于归档和压缩文件的常用工具。 基本语法 tar [选项] [归档文件名] [文件或目录列表]常用选项 创建归档文件: -c:创建一个新的归档文件。例如,tar -cvf myarchive.tar file1.txt file2.txt会创建一个名为myarchive.tar的归档文件…...

低代码与AI测试自动化:双剑合璧的未来

在数字化转型浪潮下&#xff0c;企业软件开发和测试的效率需求空前提高。低代码&#xff08;Low-Code&#xff09;平台因其直观的可视化编程方式、大幅降低开发门槛的特点&#xff0c;成为企业敏捷开发的首选。而AI测试自动化的兴起&#xff0c;则彻底改变了传统软件测试模式&a…...

JavaScript基础篇:三、 变量与数据类型

一、变量的概念与声明 在 JavaScript 中,变量是用于存储数据的容器。通过声明变量,可以为程序中的数据分配内存空间,以便后续的访问和操作。变量的声明使用`var`、`let`或`const`关键字。 (一)var关键字 `var`是 JavaScript 中传统的变量声明方式,具有函数级作用域。这…...

【2025最新版】如何将fnm与node.js安装在D盘?【保姆级安装及人性话理解教程】

目录 背景&#xff1a; 1.安装fnm 1.1下载fnm 1.2解压目录 1.3配置fnm的环境变量 1.4验证fnm是否安装成功 fnm大捷~ 2.相关配置为下载node.js做准备 2.1查看是否有环境配置文件 2.2获取环境配置文件 2.3新建文件 2.4写入配置 2.5重启powershell 2.5.1可能出现的错…...

【免费】2008-2020年各省城镇登记失业率数据

2008-2020年各省城镇登记失业率数据 1、时间&#xff1a;2008-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、城镇登记失业率 4、范围&#xff1a;31省 5、指标说明&#xff1a;城镇登记失业率是指在一定时期内&…...

C++:类和对象(从底层编译开始)详解[前篇]

目录 一.inline内联的详细介绍 &#xff08;1&#xff09;为什么在调用内联函数时不需要建立栈帧&#xff1a; &#xff08;2&#xff09;为什么inline声明和定义分离到两个文件会产生链接错误&#xff0c;链接是什么&#xff0c;为什么没有函数地址&#xff1a; 二.类&…...

Deny by project hooks setting ‘default‘: size of the file

问题描述 gitcode.com提交代码时候发现出现文件大于默认10MB后不能上传 错误显示内容如下: Total 43 (delta 1), reused 0 (delta 0), pack-reused 0 remote: Start Git Hooks Checking [FAILED] remote: Error: Deny by p…...

【Flutter】数据库实体类构造函数加密注意事项

源代码&#xff1a; AccountEntity( {required String account, required String password,}) : account encrypter.encrypt(account,iv: iv).base64, password encrypter.encrypt(password,iv: iv).base64,; 解密代码&#xff1a; static final encrypter Encrypter(AES…...

如何在PHP中实现数据加密与解密:保护敏感信息

如何在PHP中实现数据加密与解密&#xff1a;保护敏感信息 在现代Web开发中&#xff0c;数据安全是一个至关重要的议题。无论是用户的个人信息、支付数据&#xff0c;还是其他敏感信息&#xff0c;都需要在存储和传输过程中进行加密&#xff0c;以防止数据泄露和恶意攻击。PHP作…...

【Pyqt5】水平布局与垂直布局及其交叉展示及实战音乐播放器UI

感受一下Pyqt5的水平布局与垂直布局及其交叉展示 需求&#xff1a; 4个按钮水平排放4个按钮垂直排放水平排放与垂直排放并用实战&#xff1a;音乐播放器UI 水平排放 import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayoutclass MyWindo…...