StringRedisTemplate使用

文章目录

      • 一,StringRedisTemplate介绍
      • 二,StringRedisTemplate使用
        • 1.字符串(String):
        • 2.哈希(Hash):
        • 3.列表(List):
        • 4.集合(Set):
        • 5.有序集合(Sorted Set):

一,StringRedisTemplate介绍

StringRedisTemplate` 是 Spring Framework 提供的一个用于操作 Redis 数据库中 String 类型数据的模板类。它是基于 RedisTemplate 实现的,专门用于处理 Redis 中的 String 类型数据,提供了一系列简化操作的方法。

在 Spring Data Redis 中,StringRedisTemplate 主要用于将 Redis 的 String 类型数据与 Spring 应用程序进行集成,使开发者可以方便地进行读取、写入和删除操作,而无需关心底层 Redis 的连接和数据序列化等细节。

以下是 StringRedisTemplate 的主要特点和用法:

  1. 简化的操作方法StringRedisTemplate 封装了一系列简化的操作方法,如设置、获取、删除 String 类型数据等,开发者可以直接调用这些方法来进行操作,而无需关心 Redis 的底层实现。
  2. 与 Spring 集成StringRedisTemplate 是基于 Spring 框架提供的 RedisTemplate 实现的,因此可以与 Spring 应用程序无缝集成,通过依赖注入的方式进行使用。
  3. 支持事务StringRedisTemplate 支持在事务中进行操作,可以保证多个操作的原子性,确保数据的一致性。
  4. 支持序列化StringRedisTemplate 支持将 Java 对象序列化成 Redis 数据格式,以及将 Redis 数据反序列化成 Java 对象,方便开发者进行数据存取操作。
  5. 提供回调接口StringRedisTemplate 还提供了一些回调接口,如 RedisCallback 和 SessionCallback,开发者可以通过这些接口来执行自定义的 Redis 操作,更灵活地控制 Redis 的使用。

总的来说,StringRedisTemplate 是一个功能强大且易于使用的工具类,可以帮助开发者快速地将 Redis 整合到 Spring 应用程序中,实现对 String 类型数据的管理和操作。

二,StringRedisTemplate使用

​ StringRedisTemplate是Spring提供的用于操作Redis的模板类之一,它简化了与Redis交互的操作。Redis是一种键值存储的数据库,支持多种数据类型的存储,其中包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等。

下面我将详细解释StringRedisTemplate如何对这五种数据类型进行存储、删除和使用:

1.字符串(String):

优势:Redis 中最基本的数据类型,支持的操作简单高效,可以存储任何类型的数据,包括文本、数字等。

缺点:不支持复杂的数据结构,不适合存储结构化数据,当需要存储多个字段或者需要复杂的查询时,使用字符串可能不够方便。

常用时机:存储简单的键值对、缓存数据、计数器等。

// 通过redis操作模板获取操作类型对象
// 这段注释描述了使用StringRedisTemplate的opsForValue()方法获取操作类型对象的过程
ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();// 将指定的键值对存储到Redis中
// 参数说明:
// - key: 要存储的键
// - value: 要存储的值
opsForValue.set("user:login:"+mobile, code);// 将指定的键值对存储到Redis中,并设置存活时间
// 参数说明:
// - key: 要存储的键
// - value: 要存储的值
// - timeout: 存活时间
// - unit: 存活时间的单位
opsForValue.set("user:login:"+mobile, code, 60, TimeUnit.SECONDS);// 获取指定键对应的值
// 参数说明:
// - key: 要获取值的键
String retrievedValue = opsForValue.get("user:login:"+mobile);// 设置指定键的值,并返回旧值
// 参数说明:
// - key: 要设置值的键
// - value: 要设置的新值
String oldValue = opsForValue.getAndSet("user:login:"+mobile, newValue);// 批量设置多个键值对
// 参数说明:
// - map: 要设置的键值对集合
Map<String, String> keyValueMap = new HashMap<>();
keyValueMap.put("key1", "value1");
keyValueMap.put("key2", "value2");
opsForValue.multiSet(keyValueMap);// 批量获取多个键对应的值
// 参数说明:
// - keys: 要获取值的键集合
List<String> values = opsForValue.multiGet(Arrays.asList("key1", "key2"));// 将指定键的值按给定的增量递增
// 参数说明:
// - key: 要递增的键
// - delta: 增量值
opsForValue.increment("counter", 1);// 将指定键的值按给定的增量递减
// 参数说明:
// - key: 要递减的键
// - delta: 减量值
opsForValue.decrement("counter", 1);// 将指定值追加到键对应的字符串值的末尾
// 参数说明:
// - key: 要追加值的键
// - value: 要追加的值
opsForValue.append("key", "value");// 获取指定键对应的字符串值的长度
// 参数说明:
// - key: 要获取长度的键
Long length = opsForValue.size("key");// 如果键不存在,则设置指定键的值
// 参数说明:
// - key: 要设置值的键
// - value: 要设置的新值
// 返回值:如果设置成功返回true,否则返回false
boolean setIfAbsentResult = opsForValue.setIfAbsent("key", "value");// 如果键存在,则设置指定键的值
// 参数说明:
// - key: 要设置值的键
// - value: 要设置的新值
// 返回值:如果设置成功返回true,否则返回false
boolean setIfPresentResult = opsForValue.setIfPresent("key", "value");// 获取底层的操作接口,可以通过它执行更多高级操作
// 返回值:底层的操作接口
Object nativeOperations = opsForValue.getOperations();// 删除指定键对应的值
// 参数说明:
// - key: 要删除值的键
// 返回值:如果删除成功返回true,否则返回false
boolean deleteResult = stringRedisTemplate.delete("user:login:"+mobile);
2.哈希(Hash):

优势:适合存储对象属性,可以将相关字段存储在同一键下,方便管理和查询,减少键的数量,节省内存。

缺点:不支持像关系型数据库那样的复杂查询操作,对于嵌套结构不够友好。

常用时机:存储对象属性、存储用户信息、存储商品信息等。

// 通过redis操作模板获取操作类型对象
// 这段注释描述了使用StringRedisTemplate的opsForHash()方法获取操作类型对象的过程
HashOperations<String, String, String> opsForHash = stringRedisTemplate.opsForHash();// 添加一个键值对到哈希表中
// 参数说明:
// - key: 哈希表的键
// - hashKey: 哈希表中的键
// - value: 哈希表中的值
// 返回值:如果哈希表中不存在给定的键,添加成功并返回true;如果哈希表中已经存在给定的键,更新值并返回false
Boolean putResult = opsForHash.put("hash:key", "hashField", "hashValue");// 批量添加多个键值对到哈希表中
// 参数说明:
// - key: 哈希表的键
// - m: 要添加的多个键值对
// 返回值:返回成功添加的键值对数量
Long putAllResult = opsForHash.putAll("hash:key", Map.of("field1", "value1", "field2", "value2"));// 获取存储在哈希表中指定字段的值
// 参数说明:
// - key: 哈希表的键
// - hashKey: 哈希表中的键
// 返回值:返回哈希表中指定字段的值
String getResult = opsForHash.get("hash:key", "hashField");// 删除哈希表中的一个或多个字段
// 参数说明:
// - key: 哈希表的键
// - hashKeys: 要删除的字段
// 返回值:返回成功删除的字段数量
Long deleteResult = opsForHash.delete("hash:key", "hashField1", "hashField2");// 判断哈希表中是否存在指定字段
// 参数说明:
// - key: 哈希表的键
// - hashKey: 要检查的字段
// 返回值:如果哈希表中存在给定的字段,返回true;如果哈希表中不存在给定的字段或key不存在,返回false
Boolean hasKeyResult = opsForHash.hasKey("hash:key", "hashField");// 获取哈希表中所有的字段-值对
// 参数说明:
// - key: 哈希表的键
// 返回值:返回哈希表中所有的字段-值对
Map<String, String> entriesResult = opsForHash.entries("hash:key");// 获取哈希表中所有的字段
// 参数说明:
// - key: 哈希表的键
// 返回值:返回哈希表中所有的字段
Set<String> keysResult = opsForHash.keys("hash:key");// 获取哈希表中所有的值
// 参数说明:
// - key: 哈希表的键
// 返回值:返回哈希表中所有的值
List<String> valuesResult = opsForHash.values("hash:key");// 获取哈希表中字段的数量
// 参数说明:
// - key: 哈希表的键
// 返回值:返回哈希表中字段的数量
Long sizeResult = opsForHash.size("hash:key");//将指定位置的元素替换为新值
//其中"myList"是待操作的列表键
//index是要替换的位置
//value是新的值
opsForList.set("myList", index, value); 
3.列表(List):

优势:支持按照索引进行操作,可以实现队列、栈等数据结构,同时支持插入、删除等操作。

缺点:在数据量较大时,对索引进行插入和删除操作可能会影响性能。

常用时机:消息队列、实时排行榜、最新动态等

// 通过redis操作模板获取操作类型对象
// 这段注释描述了使用StringRedisTemplate的opsForList()方法获取操作类型对象的过程
ListOperations<String, String> opsForList = stringRedisTemplate.opsForList();// 将一个或多个值插入到列表头部
// 参数说明:
// - key: 要操作的列表键
// - values: 要插入的值
// 返回值:返回列表的长度
Long leftPushResult = opsForList.leftPush("list:key", "value1", "value2", "value3");// 将一个或多个值插入到列表尾部
// 参数说明:
// - key: 要操作的列表键
// - values: 要插入的值
// 返回值:返回列表的长度
Long rightPushResult = opsForList.rightPush("list:key", "value1", "value2", "value3");// 获取列表指定范围内的元素
// 参数说明:
// - key: 要操作的列表键
// - start: 起始位置(0表示第一个元素)
// - end: 结束位置(-1表示最后一个元素)
// 返回值:返回指定范围内的元素列表
List<String> rangeResult = opsForList.range("list:key", 0, -1);// 移除列表中与给定值相等的元素
// 参数说明:
// - key: 要操作的列表键
// - count: 移除元素的个数(正数表示从左到右移除,负数表示从右到左移除,0表示移除所有与值相等的元素)
// - value: 要移除的值
// 返回值:返回被移除元素的个数
Long removeResult = opsForList.remove("list:key", 0, "value");// 获取列表中指定位置的元素
// 参数说明:
// - key: 要操作的列表键
// - index: 要获取元素的索引位置(0表示第一个元素,-1表示最后一个元素)
// 返回值:返回指定位置的元素
String indexResult = opsForList.index("list:key", 0);// 获取列表的长度
// 参数说明:
// - key: 要操作的列表键
// 返回值:返回列表的长度
Long sizeResult = opsForList.size("list:key");// 从列表的左侧弹出一个元素
// 参数说明:
// - key: 要操作的列表键
// 返回值:返回被弹出的元素
String leftPopResult = opsForList.leftPop("list:key");// 从列表的右侧弹出一个元素
// 参数说明:
// - key: 要操作的列表键
// 返回值:返回被弹出的元素
String rightPopResult = opsForList.rightPop("list:key");// 从一个列表的右侧弹出一个元素,并将它推到另一个列表的左侧
// 参数说明:
// - sourceKey: 要弹出元素的列表键
// - destinationKey: 要推入元素的列表键
// 返回值:返回被弹出的元素
String rightPopAndLeftPushResult = opsForList.rightPopAndLeftPush("source:key", "destination:key");// 裁剪列表,保留指定范围内的元素
// 参数说明:
// - key: 要操作的列表键
// - start: 起始位置(0表示第一个元素)
// - end: 结束位置(-1表示最后一个元素)
// 返回值:无
opsForList.trim("list:key", 0, 9);
4.集合(Set):

优势:元素不重复,支持集合间的交集、并集、差集等操作,对于需要存储唯一值的场景很有用。

缺点:不支持按索引访问元素,无法按顺序获取元素。

常用时机:标签系统、好友关系、共同喜好等。

// 通过redis操作模板获取操作类型对象
// 这段注释描述了使用StringRedisTemplate的opsForSet()方法获取操作类型对象的过程
SetOperations<String, String> opsForSet = stringRedisTemplate.opsForSet();// 向集合添加一个或多个成员
// 参数说明:
// - key: 要操作的集合键
// - values: 要添加的成员
// 返回值:返回成功添加的成员数量
Long addResult = opsForSet.add("set:key", "member1", "member2", "member3");// 获取集合的成员数
// 参数说明:
// - key: 要操作的集合键
// 返回值:返回集合的成员数
Long sizeResult = opsForSet.size("set:key");// 判断集合中是否包含指定成员
// 参数说明:
// - key: 要操作的集合键
// - value: 要检查的成员
// 返回值:如果成员存在于集合中,返回true;否则返回false
Boolean isMemberResult = opsForSet.isMember("set:key", "member");// 获取集合中的所有成员
// 参数说明:
// - key: 要操作的集合键
// 返回值:返回集合中的所有成员
Set<String> membersResult = opsForSet.members("set:key");// 从集合中随机弹出一个成员
// 参数说明:
// - key: 要操作的集合键
// 返回值:返回被弹出的成员
String popResult = opsForSet.pop("set:key");// 将指定成员从一个集合移动到另一个集合
// 参数说明:
// - key: 源集合键
// - value: 要移动的成员
// - destKey: 目标集合键
// 返回值:如果成员成功移动,返回true;如果成员不存在于源集合,返回false
Boolean moveResult = opsForSet.move("source:set:key", "member", "destination:set:key");// 从集合中移除一个或多个成员
// 参数说明:
// - key: 要操作的集合键
// - values: 要移除的成员
// 返回值:返回成功移除的成员数量
Long removeResult = opsForSet.remove("set:key", "member1", "member2");// 获取两个集合的交集
// 参数说明:
// - key: 要操作的集合键
// - otherKeys: 其他集合的键
// 返回值:返回交集的成员集合
Set<String> intersectResult = opsForSet.intersect("set:key", "other:set:key");// 获取两个集合的并集
// 参数说明:
// - key: 要操作的集合键
// - otherKeys: 其他集合的键
// 返回值:返回并集的成员集合
Set<String> unionResult = opsForSet.union("set:key", "other:set:key");// 获取两个集合的差集
// 参数说明:
// - key: 要操作的集合键
// - otherKeys: 其他集合的键
// 返回值:返回差集的成员集合
Set<String> differenceResult = opsForSet.difference("set:key", "other:set:key");
5.有序集合(Sorted Set):
  • 优势:在集合的基础上增加了元素的排序功能,支持按分数范围获取值,适合实现排行榜等功能。

  • 缺点:相比普通集合,有额外的内存消耗。

  • 常用时机:排行榜、范围查询、带权重的任务队列等。

    // 通过redis操作模板获取操作类型对象
    // 这段注释描述了使用StringRedisTemplate的opsForZSet()方法获取操作类型对象的过程
    ZSetOperations<String, String> opsForZSet = stringRedisTemplate.opsForZSet();// 向有序集合添加一个或多个成员,或者更新已存在成员的分数
    // 参数说明:
    // - key: 要操作的有序集合键
    // - values: 要添加或更新的成员及其分数
    // 返回值:返回成功添加或更新的成员数量
    Long addResult = opsForZSet.add("zset:key", "member1", 1.0);
    Map<String, Double> memberScores = new HashMap<>();
    memberScores.put("member2", 2.0);
    memberScores.put("member3", 3.0);
    Long multiAddResult = opsForZSet.add("zset:key", memberScores);// 增加指定成员的分数
    // 参数说明:
    // - key: 要操作的有序集合键
    // - member: 要增加分数的成员
    // - delta: 分数增量
    // 返回值:返回成员新的分数值
    Double incrementScoreResult = opsForZSet.incrementScore("zset:key", "member", 2.5);// 获取有序集合的成员数
    // 参数说明:
    // - key: 要操作的有序集合键
    // 返回值:返回有序集合的成员数
    Long sizeResult = opsForZSet.size("zset:key");// 获取有序集合中指定成员的分数
    // 参数说明:
    // - key: 要操作的有序集合键
    // - member: 要获取分数的成员
    // 返回值:返回成员的分数
    Double scoreResult = opsForZSet.score("zset:key", "member");// 获取有序集合中指定范围内的成员及其分数,按分数从低到高排序
    // 参数说明:
    // - key: 要操作的有序集合键
    // - start: 起始位置(0表示第一个成员)
    // - end: 结束位置(-1表示最后一个成员)
    // 返回值:返回指定范围内的成员及其分数的集合
    Set<TypedTuple<String>> rangeWithScoresResult = opsForZSet.rangeWithScores("zset:key", 0, -1);// 获取有序集合中指定范围内的成员及其分数,按分数从高到低排序
    // 参数说明:
    // - key: 要操作的有序集合键
    // - start: 起始位置(0表示第一个成员)
    // - end: 结束位置(-1表示最后一个成员)
    // 返回值:返回指定范围内的成员及其分数的集合
    Set<TypedTuple<String>> reverseRangeWithScoresResult = opsForZSet.reverseRangeWithScores("zset:key", 0, -1);// 获取有序集合中指定范围内的成员数量,分数介于min和max之间(包含min和max)
    // 参数说明:
    // - key: 要操作的有序集合键
    // - min: 最小分数
    // - max: 最大分数
    // 返回值:返回指定范围内的成员数量
    Long countResult = opsForZSet.count("zset:key", min, max);// 从有序集合中移除指定范围内的成员,分数介于min和max之间(包含min和max)
    // 参数说明:
    // - key: 要操作的有序集合键
    // - min: 最小分数
    // - max: 最大分数
    // 返回值:返回成功移除的成员数量
    Long removeRangeByScoreResult = opsForZSet.removeRangeByScore("zset:key", min, max);// 根据排名范围移除有序集合中的成员(排名从0开始)
    // 参数说明:
    // - key: 要操作的有序集合键
    // - start: 起始排名
    // - end: 结束排名
    // 返回值:返回成功移除的成员数量
    Long removeRangeResult = opsForZSet.removeRange("zset:key", start, end);
    

总的来说,通过StringRedisTemplate的不同方法获取对应数据类型的操作实例,然后通过这些操作实例进行数据的存储、删除和使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

省级生活垃圾无害化处理率面板数据(2004-2022年)

01、数据简介 生活垃圾无害化处理率是指经过处理的生活垃圾中&#xff0c;达到无害化标准的垃圾所占的比例。这一指标是衡量城市垃圾处理水平的重要标准&#xff0c;反映了城市对垃圾进行有效管理和处理的能力。 生活垃圾无害化处理的主要方式包括生活垃圾焚烧、生活垃圾卫生…

金三银四面试题(二十八):观察者模式知多少?

什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09; 是一种设计模式&#xff0c;它定义了一种一对多的关系&#xff0c;让多个观察者对象能够同时监听一个主题对象。当主题对象的状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够作出…

Sass:强大而灵活的CSS预处理器详解

Sass&#xff1a;强大而灵活的CSS预处理器详解 在前端开发的世界里&#xff0c;CSS&#xff08;层叠样式表&#xff09;作为样式描述语言&#xff0c;为我们提供了丰富的样式定义和布局方式。然而&#xff0c;随着项目规模的不断扩大和复杂度的提升&#xff0c;原生CSS的编写和…

C++:完美转发(二)(std::forward)

一、RVO优化和std::move、std::forward 以下是一个综合性的例子&#xff1a; #include <iostream> #include <memory> #include <ostream> using namespace std;// 1. 针对右值引用实施std::move&#xff0c;针对万能引用实施std::forward class Data {};c…

react之Reducer和Context的联合使用

第三章 - 状态管理 使用 Reducer 和 Context 拓展你的应用 Reducer 可以整合组件的状态更新逻辑。Context 可以将信息深入传递给其他组件。你可以组合使用它们来共同管理一个复杂页面的状态。 结合使用 reducer 和 context 在 reducer 介绍 的例子里面&#xff0c;状态被 r…

如何修复Windows中的“无Internet,安全”错误?这里有详细步骤

序言 在Windows计算机上连接到互联网非常容易,但是,当你尝试连接到网络时,Windows有时可能会显示消息“无Internet,安全”。此消息的确切含义是什么?如何修复?以下是你需要了解的所有信息。 为什么Windows显示“无Internet,安全”消息 “无Internet,安全”消息是一个…

简约在线生成短网址系统源码 短链防红域名系统 带后台

简约在线生成短网址系统源码 短链防红域名系统 带后台 安装教程&#xff1a;访问 http://你的域名/install 进行安装 源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/

图像分割各种算子算法-可直接使用(Canny、Roberts、Sobel)

Canny算子&#xff1a; import numpy as np import cv2 as cv from matplotlib import pyplot as pltimg cv.imread("../test_1_1.png") edges cv.Canny(img, 100, 200)plt.subplot(121),plt.imshow(img,cmap gray) plt.title(Original Image), plt.xticks([]), …

MySQL数据库之UNION 和JOIN连接的区别?

UNION和JOIN连接是用于合并表中数据的两种不同方法。 1、JOIN连接&#xff1a; 用于在查询中将两个或多个表中的行基于它们之间的关联条件进行匹配。JOIN操作允许您将来自不同表的相关数据组合到一起&#xff0c;以便一次性检索所有相关信息。JOIN操作通常涉及使用ON子句指定…

电文加密(C语言)

一、题目说明&#xff1b; 即第1个字母变成第26个字母&#xff0c;第i个字母变成第(26 - i 1)个字母&#xff0c;非字母字符不变。 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h&g…

C语言深入理解指针(4)--指针笔试题解析

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 C语言深入理解指针(4) 收录于专栏【C语言学习】 本专栏旨在分享学习C语言学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. size…

【机器学习300问】79、Mini-Batch梯度下降法的原理是什么?

Mini-Batch梯度下降法是一种将训练数据集分成小批次进行学习的优化方法&#xff0c;通过这种方式&#xff0c;可以有效地解决内存限制问题并加速学习过程。 一、为什么要使用Mini-Batch&#xff1f; 在机器学习尤其是深度学习中&#xff0c;我们常常面临海量数据处理的问题。如…

吴恩达 深度学习 神经网络 softmax adam 交叉验证

神经网络中的层&#xff1a;输入层&#xff08;layer 0&#xff09;、隐藏层、卷积层&#xff08;看情况用这个&#xff09;、输出层。&#xff08;参考文章&#xff09; 激活函数&#xff1a; 隐藏层一般用relu函数&#xff1b; 输出层根据需要&#xff0c;二分类用sigmoid&…

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

matlab使用教程(70)—修改坐标区属性

1.控制坐标轴长度比率和数据单位长度 您可以控制 x 轴、y 轴和 z 轴的相对长度&#xff08;图框纵横比&#xff09;&#xff0c;也可以控制一个数据单位沿每个轴的相对长度&#xff08;数据纵横比&#xff09;。 1.1图框纵横比 图框纵横比是 x 轴、y 轴和 z 轴的相对长度。默认…

【二叉树算法题记录】404. 左叶子之和

题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 题目分析 其实这题无论是迭代法还是递归法&#xff0c;最重要的是要明确判断左叶子的条件&#xff1a;当前节点有左孩子&#xff0c;且这个左孩子没有它的左孩子和右孩子。 迭代法 感觉只要二叉树相关…

MySQL查询篇-连接查询

文章目录 inner joinleft join 和right join inner join 内连接是inner join &#xff0c;只返回两个表匹配的数据行。 select a.*,b.* from a inner join b on a.id b.aid; --等价于 select a.*,b.* from a join b on a.id b.aid;left join 和right join 左外连接和右外…

docker部署微服务项目

要部署微服务项目&#xff0c;可以使用Docker来完成。Docker是一种容器化技术&#xff0c;可以将各个微服务打包成独立的容器&#xff0c;并且在同一个Host上运行。 下面是步骤&#xff1a; 安装Docker。根据你的操作系统选择相应的Docker版本&#xff0c;并按照官方文档进行安…

排序算法 下

1.快速排序 快速排序是Hoare在1962年提出的一种二叉树结构的交换排序的方法&#xff0c;采用了递归的思想 思想&#xff1a;任取待排序的元素序列中的某元素作为基准值&#xff0c;按照原来的顺序将序列分为两个子序列&#xff0c; 左子序列中的所有元素均小于基准直&#x…

Python-VBA函数之旅-sum函数

目录 一、sum函数的常见应用场景 二、sum函数使用注意事项 三、如何用好sum函数&#xff1f; 1、sum函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、sum函数的常…