【Redis实战篇】基于Redis的功能实现附近商铺查询(Geo),用户签到与统计(Bitmap),网站UV统计(HyperLogLog)

文章目录

    • 附近商铺
      • GEOSEARCH 实现
        • 语法
          • 参数解释
      • GEORADIUS 实现
      • 基本语法
      • 参数详解
        • 必选参数
        • 可选参数
        • 参数详解
          • 必选参数
      • 代码实现
    • 用户签到
      • Bitmap
      • Redis 中 Bitmap 基本操作
        • 1. 设置位值
        • 2. 获取位值
        • 3. 统计位值为 1 的数量
        • 4. 位图运算
      • Spring Data Redis 中操作 Bitmap
        • 1. 操作示例
        • (1) 设置某一位的值
        • (2) 获取某一位的值
        • (3) 统计位图中值为1的位数
        • (4) 位运算(AND/OR/XOR/NOT)
      • 实现签到
      • 实现签到统计
        • 另一种实现方法
    • UV统计
      • 基本定义
      • HyperLoglog
      • 应用场景
      • 基本原理
      • Redis 中 HyperLogLog 命令
        • 1. `PFADD`
        • 2. `PFCOUNT`
        • 3. `PFMERGE`
      • Spring Data Redis 操作 HyperLogLog
        • add
        • size
        • union
      • HyperLogLog的优势
        • 内存占用极少
        • 计算速度快
        • 近似精度可控

附近商铺

GEOSEARCH 实现

GEOSEARCH 是 Redis 6.2 及以上版本引入的一个命令,用于在有序集合(ZSet)中根据地理位置信息进行搜索。它可以基于给定的经纬度坐标和半径范围,查找符合条件的元素,同时还能按距离排序并返回距离信息。

语法
GEOSEARCH key 
[FROMLONLAT longitude latitude | FROMMEMBER member] 
[BYRADIUS radius m|km|ft|mi | BYBOX width height m|km|ft|mi] 
[ASC|DESC] 
[COUNT count [ANY]] 
[WITHDIST] 
[WITHCOORD] 
[WITHHASH]
参数解释
  • key:包含地理位置信息的有序集合的键名。

  • FROMLONLAT longitude latitude:指定搜索的中心点经纬度。

  • FROMMEMBER member:指定搜索的中心点为有序集合中的某个成员。

  • BYRADIUS radius m|km|ft|mi:以中心点为圆心,指定半径范围进行搜索,单位可以是米(m)、千米(km)、英尺(ft)或英里(mi)。

  • BYBOX width height m|km|ft|mi:以中心点为中心,指定矩形区域进行搜索。

  • ASC|DESC:指定结果按距离升序或降序排列。

  • COUNT count [ANY]:限制返回结果的数量,ANY 表示在找到 count 个结果后立即返回,不继续遍历。

  • WITHDIST:返回结果中包含元素与中心点的距离。

  • WITHCOORD:返回结果中包含元素的经纬度坐标。

  • WITHHASH:返回结果中包含元素的 Geohash 值。

GEORADIUS 实现

GEORADIUS 是 Redis 中用于基于地理位置信息进行范围查询的命令,它可以找出以给定经纬度为圆心、指定半径范围内的所有地理位置元素。下面详细分析其参数。

基本语法

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count] [STORE key] [STOREDIST key]

参数详解

必选参数
  1. key
    • 描述:存储地理位置信息的有序集合的键名。在 Redis 里,地理位置信息是以有序集合(ZSet)的形式存储的,每个元素代表一个地理位置,其成员是地理位置的名称,分数是对应的 Geohash 值。
    • 示例:shops:geo 表示存储店铺地理位置信息的有序集合。
  2. longitudelatitude
    • 描述:查询的中心点的经纬度。经度范围是 -180 到 180,纬度范围是 -85.05112878 到 85.05112878。
    • 示例:116.40439.915 表示北京的大致经纬度。
  3. radius
    • 描述:查询的半径大小。
    • 示例:2 表示半径为 2 个单位。
  4. m|km|ft|mi
    • 描述:半径的单位,可选项有米(m)、千米(km)、英尺(ft)、英里(mi)。
    • 示例:km 表示半径单位为千米。
可选参数
  1. WITHCOORD
    • 描述:返回结果中包含元素的经纬度信息。
    • 示例:GEORADIUS shops:geo 116.404 39.915 2 km WITHCOORD,返回结果会包含每个店铺的经纬度。
  2. WITHDIST
    • 描述:返回结果中包含元素与中心点的距离,距离单位和查询半径的单位一致。
    • 示例:GEORADIUS shops:geo 116.404 39.915 2 km WITHDIST,返回结果会包含每个店铺与中心点的距离。
  3. WITHHASH
    • 描述:返回结果中包含元素的 Geohash 值。Geohash 是一种将经纬度编码为字符串的方法。
    • 示例:GEORADIUS shops:geo 116.404 39.915 2 km WITHHASH,返回结果会包含每个店铺的 Geohash 值。
  4. ASC|DESC
    • 描述:指定返回结果按距离升序(ASC)或降序(DESC)排列。
    • 示例:GEORADIUS shops:geo 116.404 39.915 2 km WITHDIST ASC,返回结果按距离中心点由近到远排列。
  5. COUNT count
    • 描述:限制返回结果的数量,count 是一个正整数。
    • 示例:GEORADIUS shops:geo 116.404 39.915 2 km WITHDIST ASC COUNT 5,只返回距离最近的 5 个店铺。
  6. STORE key
    • 描述:将查询结果的元素名称存储到指定的有序集合中,存储的分数是元素与中心点的距离。原查询结果不会返回,而是返回存储的元素数量。
    • 示例:GEORADIUS shops:geo 116.404 39.915 2 km STORE nearby_shops,将符合条件的店铺名称存储到 nearby_shops 有序集合中。
  7. STOREDIST key
    • 描述:将查询结果的元素名称和距离存储到指定的有序集合中,存储的分数是元素与中心点的距离。原查询结果不会返回,而是返回存储的元素数量。
    • 示例:GEORADIUS shops:geo 116.404 39.915 2 km STOREDIST nearby_shops_with_dist,将符合条件的店铺名称和距离存储到 nearby_shops_with_dist 有序集合中。

在 Spring Data Redis 里,GEORADIUS 命令通过 stringRedisTemplate.opsForGeo().radius() 方法实现,下面详细分析相关参数。

radius() 方法重载形式
主要有两种重载形式:

GeoResults<RedisGeoCommands.GeoLocation<String>> radius(String key, Circle within);
GeoResults<RedisGeoCommands.GeoLocation<String>> radius(String key, Circle within, RedisGeoCommands.GeoRadiusCommandArgs args);
参数详解
必选参数

key
含义:存储地理位置信息的有序集合的键名,对应 Redis GEORADIUS 命令中的 key。
示例
String key = “shops:geo”;
Circle within
含义:定义查询范围,包含中心点和半径。Circle 由 PointDistance 组成,Point 表示中心点经纬度,Distance 表示半径及单位。对应 Redis GEORADIUS 命令中的 longitude、latitude、radius 和 m|km|ft|mi。

代码实现

@Override
public Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {// 1.判断是否需要根据坐标查询if (x == null || y == null) {// 不需要坐标查询,按数据库查询// 根据类型分页查询Page<Shop> page = query().eq("type_id", typeId).page(new Page<>(current, SystemConstants.DEFAULT_PAGE_SIZE));// 返回数据return Result.ok(page.getRecords());}// 2.计算分页参数int begin = (current - 1) * SystemConstants.MAX_PAGE_SIZE;int end = begin + SystemConstants.MAX_PAGE_SIZE;// 3.查询redis、按照距离排序、分页。结果:shopId、distanceString key = SHOP_GEO_KEY + typeId;// GEOSEARCH key BYLONLAT x y BYRADIUS 10 WITHDISTANCE// 构建GEO查询参数RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().sortAscending().limit(end);// 查询店铺信息GeoResults<RedisGeoCommands.GeoLocation<String>> results = stringRedisTemplate.opsForGeo().radius(key, new Circle(new Point(x, y), new Distance(5000)), args);// 结果为空返回空集合if (results == null) {return Result.ok(Collections.emptyList());}// 解析出distance,跳过begin以前Map<Long,Distance> distanceMap = results.getContent().stream().skip(begin).collect(Collectors.toMap(result ->Long.valueOf(result.getContent().getName()),GeoResult::getDistance,(existing, replacement) -> existing,LinkedHashMap::new));if (distanceMap.size() == 0) {return Result.ok(Collections.emptyList());}// 解析出id// keySet<Long> ids = distanceMap.keySet();String idsStr = StrUtil.join(",", ids);// 根据id查询店铺// sql: select * from tb_shop where id in (?, ?, ?) order by field(id, ?, ?, ?)List<Shop> shops = query().in("id", ids).last("ORDER BY FIELD(id," + idsStr + ")").list();// 遍历店铺,设置距离for (Shop shop : shops) {shop.setDistance(distanceMap.get(shop.getId()).getValue());}return Result.ok(shops);
}

用户签到

Bitmap

Bitmap 即位图,在 Redis 里是一种特殊的数据类型,它借助字符串类型来实现位操作,本质上是二进制数组。每个位只能存储 0 或 1,非常适合处理大量的布尔值,如用户签到、在线状态等场景。下面介绍 Redis 中 Bitmap 的基本用法,同时给出 Spring Data Redis 里操作 Bitmap 的示例。

Redis 中 Bitmap 基本操作

1. 设置位值

使用 SETBIT 命令可以设置指定偏移量上的位值。

SETBIT key offset value
  • key:位图的键名。
  • offset:位的偏移量,从 0 开始。
  • value:位的值,只能是 0 或 1。

示例

SETBIT user:sign:1 0 1

上述命令将 user:sign:1 这个位图在偏移量 0 处的值设置为 1。

2. 获取位值

使用 GETBIT 命令可以获取指定偏移量上的位值。

GETBIT key offset
  • key:位图的键名。
  • offset:位的偏移量,从 0 开始。

示例

GETBIT user:sign:1 0

该命令会返回 user:sign:1 位图在偏移量 0 处的值。

3. 统计位值为 1 的数量

使用 BITCOUNT 命令可以统计位图中值为 1 的位的数量。

BITCOUNT key [start end]
  • key:位图的键名。
  • startend(可选):指定字节范围,用于统计该范围内值为 1 的位的数量。

示例

BITCOUNT user:sign:1

此命令会统计 user:sign:1 位图中值为 1 的位的总数。

4. 位图运算

使用 BITOP 命令可以对多个位图进行逻辑运算,支持 ANDORXORNOT 操作。

BITOP operation destkey key [key ...]
  • operation:逻辑运算类型,如 ANDORXORNOT
  • destkey:存储运算结果的位图键名。
  • key [key ...]:参与运算的位图键名。

示例

BITOP AND result:and user:sign:1 user:sign:2

该命令对 user:sign:1user:sign:2 两个位图进行逻辑与运算,并将结果存储在 result:and 位图中。

Spring Data Redis 中操作 Bitmap

1. 操作示例
(1) 设置某一位的值
@Autowired
private RedisTemplate<String, Object> redisTemplate;// 设置指定偏移量(offset)的位为 1 或 0
public void setBit(String key, long offset, boolean value) {redisTemplate.opsForValue().setBit(key, offset, value);
}// 示例:用户ID=1001在2023-10-01签到(标记为1)
setBit("sign:2023-10:1001", 0, true); // 第0位表示某一天
(2) 获取某一位的值
public Boolean getBit(String key, long offset) {return redisTemplate.opsForValue().getBit(key, offset);
}// 示例:检查用户ID=1001在2023-10-01是否签到
Boolean isSigned = getBit("sign:2023-10:1001", 0);
(3) 统计位图中值为1的位数
public Long bitCount(String key) {return redisTemplate.execute((RedisCallback<Long>) conn -> conn.bitCount(key.getBytes()));
}// 示例:统计用户ID=1001在2023-10月的签到总天数
Long signCount = bitCount("sign:2023-10:1001");
(4) 位运算(AND/OR/XOR/NOT)
public void bitOp(RedisStringCommands.BitOperation op, String destKey, String... srcKeys) {redisTemplate.execute((RedisCallback<Long>) conn -> conn.bitOp(op, destKey.getBytes(), Arrays.stream(srcKeys).map(k -> k.getBytes()).toArray(byte[][]::new)));
}// 示例:计算两个用户签到记录的交集(AND)
bitOp(RedisStringCommands.BitOperation.AND, "sign:result", "sign:user1", "sign:user2");

通过以上操作,你可以在 Redis 和 Spring Data Redis 中使用 Bitmap 处理布尔值相关的业务场景。

实现签到

@Override
public Result sign() {// 获取当前登录用户Long userId = UserHolder.getUser().getId();// 当前日期LocalDateTime now = LocalDateTime.now();// keyString key = USER_SIGN_KEY + userId + ":" + now.getYear() + ":" + now.getMonth();// 获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();// 签到,写入redisstringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);return Result.ok();
}

实现签到统计

@Override
public Result signCount() {// 获取当前登录用户Long userId = UserHolder.getUser().getId();// 当前日期LocalDateTime now = LocalDateTime.now();// keyString key = USER_SIGN_KEY + userId + ":" + now.getYear() + ":" + now.getMonth();// 获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();// 签到,写入redis// BITFIELD key u4 0List<Long> result = stringRedisTemplate.opsForValue().bitField(key,BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if (result == null || result.isEmpty()){return Result.ok(0);}Long num = result.get(0);if (num == null || num == 0) {return Result.ok(0);}int count = 0;while(num!=0){if((num&1)==1){count++;}num>>=1;}return Result.ok(count);
}
另一种实现方法
@Override
public Result signCount() {// 获取当前登录用户Long userId = UserHolder.getUser().getId();// 当前日期LocalDateTime now = LocalDateTime.now();// keyString key = USER_SIGN_KEY + userId + ":" + now.getYear() + ":" + now.getMonth();// 获取今天是本月的第几天int dayOfMonth = now.getDayOfMonth();// 签到,写入redis// BITFIELD key u4 0Long cnt = stringRedisTemplate.execute((RedisCallback<Long>) conn -> conn.bitCount(key.getBytes()));return cnt;
}

UV统计

UV 是 Unique Visitor 的缩写,即独立访客,UV 统计是互联网领域中用于衡量网站、应用程序或特定页面访问量的重要指标,用于统计在一定时间内访问某个站点或应用的不同用户数量。下面从多个方面详细介绍 UV 统计的相关概念。

基本定义

独立访客指的是在特定时间段内,访问某一网站或应用的不同自然人。同一用户在该时间段内多次访问,仅计算为一个独立访客。比如,在一天内,用户 A 访问了某网站 5 次,用户 B 访问了 3 次,此时该网站当天的 UV 为 2。

HyperLoglog

在 Spring Data Redis 中使用 HyperLogLog (HLL) 进行 UV 统计,可以通过以下步骤实现。HyperLogLog 提供了一种高效且内存友好的方式来处理大规模独立访客统计,尽管存在约 0.81% 的误差,但适用于大多数场景。

HyperLogLog 是一种概率型数据结构,由 Philippe Flajolet 及其同事在 2007 年提出,2011 年被集成到 Redis 中。它主要用于在牺牲一定精度的前提下,以极小的空间复杂度来统计海量数据的基数(集合中不同元素的个数)。下面从多个方面详细介绍 HyperLogLog。

应用场景

在互联网场景中,很多时候需要统计独立访客数(UV)、独立 IP 数、搜索关键词数量等,这些数据量可能非常庞大。若使用传统数据结构(如 Set)来统计,随着数据量增长,内存占用会急剧上升。而 HyperLogLog 能在保证一定精度的情况下,用极少的内存完成基数统计。

基本原理

HyperLogLog 基于伯努利试验和概率统计原理。简单来说,它把元素通过哈希函数映射为二进制串,记录每个二进制串中从第一个位开始连续 0 的最大个数。根据这些最大 0 个数的统计信息,运用概率公式估算出集合的基数。

Redis 中 HyperLogLog 命令

1. PFADD

用于向 HyperLogLog 中添加元素。

PFADD key element [element ...]
  • key:HyperLogLog 的键名。
  • element [element ...]:要添加的元素。

示例

PFADD myhyperloglog user1 user2 user3
2. PFCOUNT

用于获取 HyperLogLog 中元素的基数估计值。

PFCOUNT key [key ...]
  • key [key ...]:要统计的 HyperLogLog 键名,可以指定多个键,此时会返回这些键对应 HyperLogLog 合并后的基数估计值。

示例

PFCOUNT myhyperloglog
3. PFMERGE

用于将多个 HyperLogLog 合并为一个。

PFMERGE destkey sourcekey [sourcekey ...]
  • destkey:合并后的 HyperLogLog 键名。
  • sourcekey [sourcekey ...]:要合并的 HyperLogLog 键名。

示例

PFMERGE mergedhyperloglog myhyperloglog1 myhyperloglog2

Spring Data Redis 操作 HyperLogLog

add
/*** 向 HyperLogLog 中添加元素* @param key HyperLogLog 键名* @param elements 要添加的元素*/
public void addElements(String key, String... elements) {stringRedisTemplate.opsForHyperLogLog().add(key, elements);
}
size
/*** 获取 HyperLogLog 中元素的基数估计值* @param keys 要统计的 HyperLogLog 键名* @return 基数估计值*/
public Long getCount(String... keys) {return stringRedisTemplate.opsForHyperLogLog().size(keys);
}
union
/*** 合并多个 HyperLogLog* @param destKey 合并后的 HyperLogLog 键名* @param sourceKeys 要合并的 HyperLogLog 键名*/
public void mergeHyperLogLogs(String destKey, String... sourceKeys) {stringRedisTemplate.opsForHyperLogLog().union(destKey, sourceKeys);
}

测试结果显示997593条数据,HyperLoglog统计存在误差,但是可以极大减少储存空间的消耗同时增加查询的性能。

HyperLogLog的优势

内存占用极少
  • 固定内存开销:无论要统计的数据量有多大,HyperLogLog 在 Redis 中最多只需要 12KB 的内存空间。相比传统的数据结构,如 SetList,随着数据量的增加,它们的内存占用会线性增长。而 HyperLogLog 能够以恒定的内存来处理海量数据,例如统计每天访问网站的独立用户数,即使访问量达到百万甚至千万级别,内存占用也不会大幅上升。
  • 空间效率高:在需要统计大量基数的场景下,使用 HyperLogLog 能显著减少内存使用。例如,统计一个大型电商平台的日活用户数,若使用 Set 存储每个用户的唯一标识,当用户量达到亿级时,内存占用会非常巨大;而使用 HyperLogLog 仅需 12KB,大大节省了内存资源。
计算速度快
  • 操作复杂度低:HyperLogLog 的插入和查询操作的时间复杂度都是 O(1)。插入元素时,只需对元素进行哈希计算并更新相应的统计信息;查询基数时,直接根据统计信息进行估算,无需遍历整个数据集。这使得在处理大量数据时,操作速度极快,能满足高并发场景下的实时统计需求。
  • 高效处理大数据:在高并发的互联网应用中,需要实时统计大量的独立元素,如实时统计在线用户数、实时计算搜索关键词的数量等。HyperLogLog 能够快速完成插入和查询操作,不会成为系统的性能瓶颈。
近似精度可控
  • 合理的误差范围:HyperLogLog 虽然是概率型数据结构,返回的是基数的近似值,但误差是可控的。在 Redis 中,HyperLogLog 的标准误差约为 0.81%,在大多数实际应用场景下,这个误差是可以接受的。例如,在统计网站的 UV 时,少量的误差不会影响对网站流量整体趋势的判断。
  • 满足业务需求:对于一些对精度要求不是特别高的场景,如宏观的流量统计、大致的用户行为分析等,HyperLogLog 能在保证一定精度的前提下,提供高效的基数统计方案,满足业务对数据快速获取和分析的需求。

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

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

相关文章

【C++高阶一】二叉搜索树

【C高阶一】二叉搜索树剖析 1.什么是二叉搜索树2.二叉搜索树非递归实现2.1插入2.2删除2.2.1删除分析一2.2.2删除分析二 2.3查找 3.二叉搜索树递归实现3.1插入3.2删除3.3查找 4.完整代码 1.什么是二叉搜索树 任何一个节点&#xff0c;他的左子树的所有节点都比他小&#xff0c;右…

前端面试热门知识点总结

URL从输入到页面展示的过程 版本1 1.用户在浏览器的地址栏输入访问的URL地址。浏览器会先根据这个URL查看浏览器缓存-系统缓存-路由器缓存&#xff0c;若缓存中有&#xff0c;直接跳到第6步操作&#xff0c;若没有&#xff0c;则按照下面的步骤进行操作。 2.浏览器根据输入的UR…

Swagger | 解决Springboot2.x/3.x不兼容和依赖报错等问题

目录 不兼容报错提醒 1. 修改Spring Boot版本 2. 修改application.yml配置文件 3. 使用其他替代方案 依赖兼容 配置 Yaml 文件 依赖报错提醒 解决方法 1. 选择一个库 2. 移除springfox依赖 3. 添加springdoc依赖 4. 配置springdoc 5. 清理项目 6. 启动项目 示例代…

C++默认构造函数、普通构造函数、拷贝构造、移动构造、委托构造及析构函数深度解析

目录 一、默认构造函数&#xff08;Default Constructor&#xff09;二、普通构造函数&#xff08;General Constructor&#xff09;三、拷贝构造函数&#xff08;Copy Constructor&#xff09;四、移动构造函数&#xff08;Move Constructor&#xff0c;C11&#xff09;五、委…

JVM 深度解析

一、JVM 概述 1.1 什么是 JVM&#xff1f; JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;是 Java 程序运行的核心引擎。它像一个“翻译官”&#xff0c;将 Java 字节码转换为机器能理解的指令&#xff0c;并管理程序运行时的内存、线程等资源。 …

OpenCV CUDA 模块图像过滤-----创建一个计算图像导数的滤波器函数createDerivFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模块中的一个工厂函数&#xff0c;用于创建一个计算图像导数的滤波器。这个滤波器可以用来计算图像…

Spring Boot 接口开发实战指南

Spring Boot 接口开发实战指南 一、基础接口开发步骤 1.1 添加必要依赖 <!-- pom.xml --> <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></depen…

题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形

题目 3325: 蓝桥杯2025年第十六届省赛真题-2025 图形 时间限制: 2s 内存限制: 192MB 提交: 494 解决: 206 题目描述 小蓝要画一个 2025 图形。图形的形状为一个 h w 的矩形&#xff0c;其中 h 表示图形的高&#xff0c;w 表示图形的宽。当 h 5,w 10 时&#xff0c;图形如下所…

UML 时序图 使用案例

UML 时序图 UML 时序图 (Sequence Diagram)时序图的主要元素消息类型详解时序图示例时序图绘制步骤时序图的应用场景 UML 时序图 (Sequence Diagram) 时序图是UML(统一建模语言)中用于展示对象之间交互行为的动态视图&#xff0c;它特别强调消息的时间顺序。 时序图的主要元素…

PPT连同备注页(演讲者模式)一块转为PDF

首先&#xff0c;进入创建PDF/XPS&#xff1a; 然后进入选项&#xff1a; 发布选项-发布内容里选备注页&#xff1a; 导出的原始结果是这样的&#xff1a; 这个时候裁剪一下&#xff0c;范围为所有页面&#xff1a; 最终结果&#xff1a; 如果导出不选“备注页”而是只勾选“包…

AI时代新词-多模态(Multimodal)

一、什么是多模态&#xff08;Multimodal&#xff09;&#xff1f; 多模态&#xff08;Multimodal&#xff09;是指在人工智能中&#xff0c;融合多种不同类型的信息&#xff08;如文本、图像、语音、视频等&#xff09;进行处理和分析的技术。与传统的单一模态&#xff08;例…

【图像大模型】Stable Diffusion XL:下一代文本到图像生成模型的技术突破与实践指南

Stable Diffusion XL&#xff1a;下一代文本到图像生成模型的技术突破与实践指南 一、架构设计与技术演进1.1 核心架构革新1.2 关键技术突破1.2.1 双文本编码器融合1.2.2 动态扩散调度 二、系统架构解析2.1 完整生成流程2.2 性能指标对比 三、实战部署指南3.1 环境配置3.2 基础…

图像分割技术的实现与比较分析

引言 图像分割是计算机视觉领域中的一项基础技术&#xff0c;其目标是将数字图像划分为多个图像子区域&#xff08;像素的集合&#xff09;&#xff0c;以简化图像表示&#xff0c;便于后续分析和理解。在医学影像、遥感图像分析、自动驾驶、工业检测等众多领域&#xff0c;图…

摩尔线程S4000国产信创计算卡性能实战——Pytorch转译,多卡P2P通信与MUSA编程

简介 MTT S4000 是基于摩尔线程曲院 GPU 架构打造的全功能元计算卡&#xff0c;为千亿规模大语言模型的训练、微调和推理进行了定制优化&#xff0c;结合先进的图形渲染能力、视频编解码能力和超高清 8K HDR 显示能力&#xff0c;助力人工智能、图形渲染、多媒体、科学计算与物…

「从0到1」构建工业物联网监控系统:ARM+Quarkus+Prometheus技术栈全记录

在工业4.0浪潮中&#xff0c;边缘计算正成为智能制造的核心基础设施。ARM架构边缘计算机凭借其低功耗、高能效比和模块化设计优势&#xff0c;正在重塑工业物联网&#xff08;IIoT&#xff09;的监控体系。当Java的跨平台能力与Prometheus的实时监控体系相结合&#xff0c;为工…

【HW系列】—web常规漏洞(文件上传漏洞)

文章目录 一、简介二、危害三、文件检测方式分类四、判断文件检测方式五、文件上传绕过技术六、漏洞防御措施 一、简介 文件上传漏洞是指Web应用程序在处理用户上传文件时&#xff0c;未对文件类型、内容、路径等进行严格校验和限制&#xff0c;导致攻击者可上传恶意文件&…

如何设计ES的冷热数据分离架构?Elasticsearch 集群如何实现高可用?如何避免脑裂问题?如果出现脑裂如何恢复?

以下为Elasticsearch架构设计与高可用方案详细说明&#xff1a; 冷热架构 一、冷热数据分离架构设计&#xff08;文字描述模拟架构图&#xff09; [Hot Layer] │ ├─ SSD节点组&#xff08;3节点&#xff09; │ ├─ 角色&#xff1a;ingest/data/hot │ ├─ 存…

Trivy 镜像漏洞扫描:从零入门到实战指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——手把手带你掌握容器安全核心工具 一、安装配置&#xff1a;三步完成 Trivy 部署 Trivy 是由 Aqua Security 开发的开源容器安全工具&#xff0c;支持…

SQL基础概念以及SQL的执行方式

1. SQL入门 1.1. SQL语言功能 可以把 SQL 语言按照功能划分成以下的 4 个部分&#xff1a; DDL&#xff0c;英文叫做 Data Definition Language&#xff0c;也就是数据定义语言&#xff0c;它用来定义我们的数据库对象&#xff0c;包括数据库、数据表和列。通过使用 DDL&…

Rust 1.0 发布十周年,梦想再度扬帆起航!

目录 引言&#xff1a;发布十周年&#xff0c;锋芒露今朝 一、Rust的诞生&#xff1a;源于安全的初心 二、Rust 1.0&#xff1a;十年耕耘&#xff0c;硕果累累 三、核心利器&#xff1a;安全、并发与性能的十年锤炼 四、生态与应用&#xff1a;十年拓展&#xff0c;遍地开…