阿里云Tair Redis分布式锁与消息队列深度实践:从原理到企业级落地

简介: 本文系统性地剖析了阿里云Tair(兼容Redis)在分布式锁与消息队列两大核心场景中的实现原理与最佳实践。分布式锁部分,从原生Redis的SETNX+Lua方案出发,深入分析其主备切换导致锁丢失、续租复杂等痛点,进而引出TairString模块中CAS与CAD原生命令如何以原子操作替代Lua脚本,以及半同步复制如何从底层规避锁丢失风险。消息队列部分,横向对比了Pub/Sub的即发即失、List的简易队列、Stream的持久化消费者组三种方案,并结合Tair持久内存型在实时持久化与低成本堆积方面的增强。全文穿插Java代码示例、性能对比表格与踩坑指南,帮助读者在秒杀扣库存、异步任务、延迟订单等场

引言:当分布式系统遇上Tair Redis

在微服务与云原生架构大行其道的今天,分布式锁与消息队列已成为系统设计中最基础也最关键的两个基础设施。分布式锁解决的是多节点对共享资源的互斥访问问题——比如秒杀场景中防止库存超卖、分布式任务调度中避免重复执行;消息队列解决的则是系统间异步通信与流量削峰问题——比如订单创建后异步发送通知、日志采集与处理。而Redis凭借其高性能的内存读写与丰富的数据结构,天然成为这两类场景的首选载体。

阿里云云数据库Tair(兼容Redis)在完全兼容开源Redis协议的基础上,通过一系列自研增强特性,为分布式锁和消息队列带来了全新的实现范式。TairString中的CAS与CAD命令将原本需要Lua脚本才能完成的原子操作简化为原生命令;Tair对Redis Stream的完整支持则为可靠消息队列提供了持久化与消费者组的工业级能力。本文将从原理到代码,从踩坑到调优,系统性地拆解阿里云Tair在分布式锁与消息队列两大场景中的落地实践。

需要先登录阿里云控制台,点击:阿里云控制台

第一部分:分布式锁——从原理到Tair增强实现

1.1 分布式锁的本质与核心特性

分布式锁的本质是在分布式环境中提供一个全局可见的互斥机制。当多个服务实例需要同时访问某个共享资源——如库存、订单号、配置文件——时,分布式锁确保在同一时刻只有一个客户端能够获得操作权限。一个合格的分布式锁必须满足三个核心特性:

  • 互斥性:在任意时刻,只有一个客户端持有锁。
  • 无死锁:锁必须基于租约机制,当持有锁的客户端异常崩溃时锁能够自动释放,不会造成资源永久锁定。
  • 一致性:当Redis发生主备切换时,锁的状态必须保持一致,不能因为故障转移而导致锁丢失或重复。

这三个特性看似简单,但在生产环境中实现起来却充满陷阱。

1.2 原生Redis分布式锁的实现与痛点

加锁:SETNX + 过期时间

在原生Redis中,加锁操作通过SET命令同时设置NX和EX/PX选项来实现原子性写入:

SET lock_key unique_value NX EX 30

其中lock_key是锁的唯一标识,unique_value是每个客户端生成的随机字符串(用于锁归属验证),EX 30表示锁的自动过期时间为30秒。NX选项保证只有当key不存在时才会设置成功,从而实现互斥。

解锁:Lua脚本保证原子性

解锁操作不能简单地使用DEL命令,否则会面临误删他人锁的风险。问题场景如下:客户端A获取锁后因程序慢等原因导致锁超时自动释放,随后客户端B获得该锁,此时A恢复并执行DEL命令,就会将B持有的锁释放掉。因此客户端需要先使用GET命令确认锁是不是自己设置的,然后再使用DEL解锁。在Redis中通常需要用Lua脚本来实现自锁自解:

if redis.call(\"get\", KEYS[1]) == ARGV[1] then
    return redis.call(\"del\", KEYS[1])
else
    return 0
end

续租:Lua脚本的额外负担

当客户端发现在锁的租期内无法完成操作时,就需要延长锁的持有时间进行续租。同解锁一样,客户端应该只能续租自己持有的锁:

if redis.call(\"get\", KEYS[1]) == ARGV[1] then
    return redis.call(\"expire\", KEYS[1], ARGV[2])
else
    return 0
end

原生方案的三大痛点

基于Lua脚本的实现虽然解决了原子性问题,但带来了新的挑战。第一是性能开销:每次解锁和续租都需要执行Lua脚本,脚本解析和执行有额外开销。第二是主备切换下的锁丢失风险:在Redis主从架构中,如果客户端在Master上获取锁后Master还未将数据同步到Slave就发生故障,新选举的Master可能没有这把锁的记录,导致多个客户端同时获得锁。第三是RedLock的复杂度:为了提升一致性,原生Redis作者提出了复杂的RedLock算法,需要操作多个独立的Master节点,实现复杂且性能较低。

1.3 Tair如何用原生命令重塑分布式锁

Tair(企业版)通过TairString数据类型提供了两个增强命令——CAS和CAD,将原本需要Lua脚本才能完成的原子操作简化为原生命令。

CAD命令:原子性的解锁

CAD(Compare And Delete)命令的语法非常简洁:

CAD key value

它的执行逻辑是两步合一的原子操作:先比较指定key的当前value是否与传入的value参数相等,如果相等则删除该key(即释放锁),操作成功;如果不相等则不进行任何操作。整个过程在Tair服务端是一个原子操作,无需在客户端编写Lua脚本。

代码对比最能体现这种简化:

// 原生Redis——需要Lua脚本
String luaScript = \"if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end\";
jedis.eval(luaScript, 1, lockKey, lockValue);
// Tair——一行原生命令
jedis.sendCommand(\"CAD\", lockKey, lockValue);

CAS命令:原子性的续租

CAS(Compare And Set)命令同样将\"比较并设置\"合并为一个原子操作,用于锁的续租场景。当客户端需要延长锁的持有时间时,只需执行:

CAS key old_value new_value EX seconds

Tair会原子性地检查key的当前值是否等于old_value,如果相等则更新为新值并设置新的过期时间。

半同步复制:从底层规避锁丢失

在标准Redis主从架构中,数据复制是异步的。Tair(企业版)支持配置半同步复制,确保数据成功写入主节点并同步到至少一个备节点后,才向客户端返回成功。这一机制从根本上解决了主备切换导致的锁丢失问题,无需引入复杂的RedLock算法。

在云Redis版中还可以使用WAIT命令提高一致性:

SET resource_1 random_value NX EX 5 WAIT 1 5000

以上代码中,客户端在加锁后会等待数据成功同步到replica才继续进行其它操作,最大等待时间为5000毫秒。

1.4 Tair分布式锁的完整Java实现

以下是一个基于Tair的完整分布式锁工具类:

import redis.clients.jedis.Jedis;
import java.util.UUID;
public class TairDistributedLock {
    private Jedis jedis;
    private String lockKey;
    private String lockValue;
    private int expireSeconds;
    public TairDistributedLock(Jedis jedis, String lockKey, int expireSeconds) {
        this.jedis = jedis;
        this.lockKey = lockKey;
        this.lockValue = UUID.randomUUID().toString();
        this.expireSeconds = expireSeconds;
    }
    // 加锁——使用标准SET命令
    public boolean tryLock() {
        String result = jedis.set(lockKey, lockValue, \"NX\", \"EX\", expireSeconds);
        return \"OK\".equals(result);
    }
    // 解锁——使用Tair CAD原生命令
    public boolean unlock() {
        Object result = jedis.sendCommand(\"CAD\", lockKey, lockValue);
        return result != null && (Long) result == 1;
    }
    // 续租——使用Tair CAS原生命令
    public boolean renew(int additionalSeconds) {
        int newExpire = expireSeconds + additionalSeconds;
        Object result = jedis.sendCommand(\"CAS\", lockKey, lockValue, lockValue, \"EX\", String.valueOf(newExpire));
        if (result != null && \"OK\".equals(result.toString())) {
            expireSeconds = newExpire;
            return true;
        }
        return false;
    }
}

1.5 Tair与原生Redis分布式锁的对比总结

操作 原生Redis Tair(企业版)
加锁 SET key random NX EX seconds SET key random NX EX seconds(相同)
解锁 Lua脚本:get校验 + del CAD key random(原生命令)
续租 Lua脚本:get校验 + expire CAS key old new EX seconds(原生命令)
一致性保障 异步复制,有锁丢失风险 半同步复制,规避锁丢失
性能 Lua脚本解析有额外开销 原生命令,吞吐量可达2-3倍

第二部分:消息队列——从Pub/Sub到Stream的演进

2.1 Redis消息队列的三代演进

Redis的消息队列功能经历了从List到Pub/Sub再到Stream的三代演进。每一代方案都有其适用的场景和固有的局限。

2.2 方案一:Pub/Sub——轻量级的发布订阅

Tair(兼容Redis)提供了与Redis相同的消息发布与订阅功能。一个客户端发布消息,其他多个客户端订阅消息。

Pub/Sub的核心特点是\"非持久\"——消息发布者只负责发送消息,而不管消息是否有接收方,也不会保存之前发送的消息,即发布的消息\"即发即失\"。消息订阅者也只能得到订阅之后的消息,频道中此前的消息将无从获得。

此外,消息发布者无需独占与服务器端的连接,可以在发布消息的同时使用同一个客户端连接进行其他操作。但消息订阅者需要独占与服务器端的连接,以阻塞的方式等待频道中的消息,因此订阅者需要使用单独的服务器连接或单独的线程。

Pub/Sub的Java实现示例:

// 消息发布者
public class KVStorePubClient {
    private Jedis jedis;
    public KVStorePubClient(String host, int port, String password) {
        jedis = new Jedis(host, port);
        jedis.auth(password);
    }
    public void pub(String channel, String message) {
        jedis.publish(channel, message);
    }
}
// 消息订阅者(需在独立线程中运行)
public class KVStoreSubClient extends Thread {
    private Jedis jedis;
    private String channel;
    private JedisPubSub listener;
    // ... 初始化代码省略
    public void run() {
        jedis.subscribe(listener, channel); // 阻塞等待消息
    }
}

Pub/Sub的主要局限:消息无法持久化,订阅者离线期间的消息将全部丢失;不支持消费者组,所有订阅者都会收到全量消息。

2.3 方案二:List——简易的消息队列

基于LPUSH和BRPOP可以实现一个简易版的消息队列。生产者使用LPUSH将消息推入队列头部,消费者使用BRPOP从队列尾部阻塞弹出消息。

// 生产者
jedis.lpush(\"task_queue\", message);
// 消费者(阻塞式)
List<String> result = jedis.brpop(0, \"task_queue\");

但这种方案有两个明显缺点:不支持多个消费者公平消费——消费者拉取消息后消息就从List中删除了,无法实现多个消费者并行处理;缺乏ACK机制,消费者宕机后消息将永久丢失。

2.4 方案三:Stream——专为消息队列而生的数据结构

Redis 5.0中发布的Stream类型专门用来实现可靠的消息队列。它提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并能记住每一个客户端的访问位置。Stream借鉴了Kafka的消费组模型概念和设计。

Stream的核心操作

首先使用XADD添加流元素,即创建Stream:

XADD orders * user_id 1001 amount 299.00

然后通过XGROUP创建消费者组:

XGROUP CREATE orders order_group $ MKSTREAM

消费者使用XREADGROUP指令进行消费:

XREADGROUP GROUP order_group consumer1 COUNT 10 STREAMS orders >

客户端消费完毕后使用XACK命令确认消息已消费成功:

XACK orders order_group 1526569495631-0

Stream的Java实现示例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.StreamEntry;
import redis.clients.jedis.StreamEntryID;
import java.util.*;
public class TairStreamQueue {
    private Jedis jedis;
    private String streamKey = \"task_stream\";
    private String groupName = \"task_group\";
    public TairStreamQueue(Jedis jedis) {
        this.jedis = jedis;
        // 创建消费者组(如果不存在)
        try {
            jedis.xgroupCreate(streamKey, groupName, new StreamEntryID(), true);
        } catch (Exception e) {
            // 消费者组已存在
        }
    }
    // 生产消息
    public StreamEntryID produce(Map<String, String> message) {
        return jedis.xadd(streamKey, StreamEntryID.NEW_ENTRY, message, 0, false);
    }
    // 消费消息(阻塞式)
    public List<Map<String, String>> consume(String consumerName, int count, int blockMs) {
        Map<String, StreamEntryID> streams = new HashMap<>();
        streams.put(streamKey, StreamEntryID.UNRECEIVED_ENTRY);
        List<Map.Entry<String, List<StreamEntry>>> result = jedis.xreadGroup(
            groupName, consumerName, count, blockMs, false, streams
        );
        if (result == null || result.isEmpty()) return Collections.emptyList();
        List<Map<String, String>> messages = new ArrayList<>();
        for (Map.Entry<String, List<StreamEntry>> entry : result) {
            for (StreamEntry se : entry.getValue()) {
                messages.add(se.getFields());
                // 消费确认
                jedis.xack(streamKey, groupName, se.getID());
            }
        }
        return messages;
    }
}

消费者组的核心价值

消费者组是Stream最强大的特性。同一消费者组内的多个消费者可以分担消息处理压力——每条消息只会被组内的一个消费者消费,实现了负载均衡。不同消费者组之间相互独立,各自维护自己的消费进度,互不影响。同时,XACK机制确保了消息的可靠消费——只有消费者明确确认后消息才会从Pending队列中移除,消费者宕机后消息可以重新分配给其他消费者。

2.5 Tair持久内存型对Stream的增强

Tair持久内存版在以下方面对Redis Stream进行了改进:

  • 更大空间、更低成本:引入Intel傲腾持久内存,使得相同容量下成本更低,能够堆积更多的消息。
  • 数据的实时持久化:利用AEP断电数据不丢失的特性,结合Redis的写时复制技术实现了数据的实时持久化。即使在Redis宕机的情况下消息也不会丢失。

这一增强使Tair在消息堆积能力和可靠性方面超越了开源Redis,更适合作为轻量级消息中间件的替代方案。

2.6 三种消息队列方案的选型对比

特性 Pub/Sub List Stream
消息持久化 不支持 不支持 支持
消费者组 不支持(广播模式) 不支持 支持
ACK机制 不支持 不支持 支持
消息回溯 不支持 不支持 支持
阻塞消费 支持 支持 支持
适用场景 实时通知、广播 简单任务队列 可靠消息队列

第三部分:延时队列——基于Sorted Set的扩展方案

延时队列是一种特殊的消息队列,它允许将消息在一定的延迟时间后再进行消费。延时队列的主要特点是可以延迟消息的处理时间,以满足定时任务或者定时事件的需求。

3.1 基于Sorted Set的实现原理

在Tair/Redis中,延时队列通常基于Sorted Set实现。将任务ID作为member,将任务需要执行的时间戳作为score存入Sorted Set。一个独立的调度线程周期性轮询,取出score小于当前时间的任务进行消费。

3.2 延时队列的Java实现

import redis.clients.jedis.Jedis;
import java.util.Set;
public class TairDelayQueue {
    private Jedis jedis;
    private String delayKey = \"delay_queue\";
    public TairDelayQueue(Jedis jedis) {
        this.jedis = jedis;
    }
    // 添加延时任务——delaySeconds为延迟秒数
    public void addTask(String taskId, int delaySeconds) {
        long executeTime = System.currentTimeMillis() + delaySeconds * 1000L;
        jedis.zadd(delayKey, executeTime, taskId);
    }
    // 轮询获取到期任务
    public Set<String> pollReadyTasks(int limit) {
        long now = System.currentTimeMillis();
        // 获取score小于当前时间的任务
        Set<String> tasks = jedis.zrangeByScore(delayKey, 0, now, 0, limit);
        if (tasks != null && !tasks.isEmpty()) {
            // 移除已取出的任务(防止重复消费)
            for (String task : tasks) {
                jedis.zrem(delayKey, task);
            }
        }
        return tasks;
    }
}

3.3 延时队列的注意事项

基于Sorted Set的延时队列实现简单,但有几个关键问题需要注意:轮询间隔的精度与性能之间的权衡——间隔越小精度越高但Redis压力越大;任务执行失败时需要重新入队机制;大规模任务堆积时Sorted Set的性能表现。对于需要更高精度和可靠性的场景,可以考虑结合RocketMQ等专业消息中间件的延时消息功能。

第四部分:实战场景与最佳实践

4.1 场景一:秒杀系统的库存扣减

秒杀场景具有瞬时高并发、资源竞争激烈和数据一致性要求高三大特征。使用Tair分布式锁可以精确控制库存扣减的并发安全。加锁时设置合理的过期时间(通常比业务预期执行时间稍长),解锁时必须使用CAD命令确保只释放自己持有的锁。配合半同步复制,可以有效避免因主备切换导致的超卖风险。

4.2 场景二:异步任务处理

对于不需要实时响应的后台任务——如发送邮件、生成报表、数据同步——可以使用Tair Stream作为轻量级消息队列。生产者将任务写入Stream,多个消费者组成消费者组并行处理。利用XACK机制确保任务不丢失,消费者宕机后任务可重新分配给其他消费者。

4.3 场景三:订单超时自动取消

电商系统中订单创建后30分钟未支付需要自动取消。可以使用Tair延时队列实现:订单创建时将订单ID以\"当前时间+30分钟\"为score写入Sorted Set,调度线程轮询到期订单执行取消操作。

4.4 场景四:IM消息多端同步

Tair在IM场景中可以实现消息的多端同步。系统在服务端采用可靠队列机制暂存离线消息,并在用户重新上线后主动触发离线消息的自动拉取流程,确保每条消息最终都能被准确消费。Tair丰富的数据结构和高可靠的持久化机制为此提供了坚实基础。

4.5 最佳实践与踩坑指南

  • 锁的过期时间设置:应略大于业务逻辑的最大执行时间。过短会导致锁提前释放引发并发问题,过长会导致锁长时间占用影响性能。
  • 锁的value必须唯一:每个客户端必须使用唯一标识(如UUID)作为锁的value,否则无法安全释放锁。
  • Stream的消费确认:务必在业务处理成功后调用XACK,避免消息丢失或重复消费。
  • 消费者组数量控制:不建议在单一进程内创建大量消费者。
  • 内存与持久化平衡:缓存场景建议关闭AOF以降低开销;消息队列场景建议开启持久化保证可靠性。
  • 监控与告警:关注Tair实例的CPU利用率、内存使用率、慢查询等指标,及时发现问题。

总结

阿里云Tair在完全兼容开源Redis协议的基础上,通过TairString的CAS/CAD原生命令和半同步复制机制,将分布式锁的实现从复杂的Lua脚本+RedLock方案简化为原子命令+底层一致性保障,显著降低了实现复杂度并提升了性能。在消息队列方面,Tair对Stream的完整支持以及持久内存型在实时持久化和成本方面的增强,使其成为轻量级消息中间件的有力竞争者。

在实际选型中,如果业务对数据一致性有极高要求(如金融、交易场景),建议优先考虑Tair;如果业务场景允许极低概率的锁丢失或主要用于提升效率,原生Redis配合Redisson等客户端库也足够应对大多数场景。对于消息队列,简单的实时通知场景可选用Pub/Sub,需要可靠消费和负载均衡的场景则应选用Stream。

希望本文能帮助读者深入理解Tair在分布式锁与消息队列两大场景中的实现原理与最佳实践,在实际项目中做出合理的技术选型。

常见问题解答

问1:Tair的CAS和CAD命令与原生Redis的Lua脚本方案相比,性能提升有多少?

答:Tair内存型采用多线程处理能力,在锁操作吞吐量上可达原生Redis的2-3倍。原生命令省去了Lua脚本的解析和执行开销,在高并发锁操作场景下优势尤为明显。

问2:使用Tair分布式锁时,如何避免锁被误删?

答:加锁时为每个客户端设置唯一的随机值(如UUID),解锁时使用CAD命令原子性地比较并删除——只有value匹配时才会执行删除。如果使用原生Redis,则必须通过Lua脚本实现\"先GET校验再DEL\"的原子操作。

问3:Tair Stream与Kafka有什么区别?什么时候应该用Tair Stream?

答:Tair Stream是轻量级的消息队列方案,适合对吞吐量要求不是极致高、但希望降低运维复杂度的场景。Kafka则适合海量数据流处理、需要长期持久化的场景。Tair Stream的优势在于与Redis生态无缝集成,无需额外部署消息中间件。

问4:Tair的Pub/Sub和Stream都能做消息队列,该如何选择?

答:Pub/Sub是\"即发即失\"的广播模式,消息无法持久化,订阅者离线期间的消息会全部丢失。Stream支持消息持久化、消费者组和ACK机制。实时通知、不需要可靠投递的场景用Pub/Sub;需要可靠消费、负载均衡的场景用Stream。

问5:Tair持久内存型相比标准内存型在消息队列场景有什么优势?

答:持久内存型利用AEP的断电数据不丢失特性实现了数据的实时持久化,即使在宕机情况下消息也不会丢失。同时相同容量下成本更低,能够堆积更多的消息。特别适合需要消息持久化和大量消息堆积的队列场景。

问6:Tair支持Redisson客户端吗?

答:支持。Tair兼容Redis协议,Redisson的各项分布式功能(如分布式锁、看门狗机制等)可以在Tair上稳定运行。建议在生产环境前进行充分测试。

相关文章
|
1月前
|
人工智能 IDE 开发工具
2026年阿里云Qoder CN编程智能体全解:核心配置、接入流程与定价体系说明
2026年阿里云Qoder CN作为本土化专业AI编程智能体,完成产品体系全面升级,整合多端编程工具、智能代码理解、跨文件工程重构、私域知识库适配等核心能力,是面向个人开发者、研发团队、企业技术部门打造的全栈式智能编程平台。区别于通用对话大模型,Qoder CN深度适配国内开发习惯、代码规范与工程场景,依托百炼大模型生态,兼容多款主流国产大模型,搭配分层清晰的订阅定价与轻量化接入流程,可覆盖零基础代码学习、日常工程开发、大型项目迭代、企业规范化研发等全维度场景,成为当前本土化AI编程工具的核心代表。
562 4
|
1月前
|
弹性计算 人工智能 运维
阿里云云监控对接使用完全指南:从入门到智能化运维
本文提供了一份完整的阿里云云监控(CloudMonitor 2.0)对接使用指南。作为融合了日志服务SLS、云监控CMS和应用实时监控服务ARMS的一站式可观测平台,云监控2.0提供了从基础设施到业务层的全栈监控能力。文章详细介绍了工作空间的创建与管理、接入中心的多源数据接入流程、告警规则与通知策略的配置方法、OpenAPI与SDK的调用示例、自定义监控数据上报方案,以及基于CLI和AI Agent Skill的智能化运维实践。同时涵盖了Prometheus集成、日志探索、仪表盘可视化等高级功能。通过本文,读者可以系统掌握云监控的对接使用技巧,构建高效、智能的可观测运维体系。
|
1月前
|
Java API 语音技术
阿里云智能语音交互完全对接指南:从开通服务到生产级集成
本文系统介绍阿里云智能语音交互(ISI)的完整对接流程。首先阐述产品核心能力与适用场景,明确语音识别(ASR)与语音合成(TTS)两大技术方向。然后详细讲解服务开通、项目创建、AccessToken获取等前置准备工作。接着深入剖析一句话识别、实时语音识别、录音文件识别、语音合成等核心API的调用方式,提供Java、Python、Curl等多语言代码示例。重点解析WebSocket协议的交互流程与VAD模式、Manual模式的区别。最后总结最佳实践,包括Token安全管理、音频格式规范、网络优化、成本控制等,并梳理常见错误码及排查方法。全文旨在帮助开发者快速、规范地将阿里云智能语音能力集成到各类
|
1月前
|
网络协议 应用服务中间件 网络安全
阿里云SSL证书自动续签与部署完全指南:从托管服务到开源工具全方案解析
本文系统性地剖析了阿里云SSL证书自动续签与部署的完整技术方案。随着SSL证书有效期普遍缩短至一年甚至三个月,手动管理证书已成为运维痛点。文章首先介绍阿里云数字证书管理服务V2.0的托管服务——通过购买证书时开启托管、配置域名免验证授权、创建云产品部署任务,即可实现证书全生命周期自动化。随后深入讲解acme.sh这一开源ACME客户端的安装、阿里云DNS API配置、证书签发与自动续期Cron任务设置,并提供Nginx配置示例。进一步探讨基于阿里云OpenAPI的自定义脚本方案,展示Python SDK调用示例。还介绍了函数计算、Certimate等高级自动化工具。最后详细讨论ECS可信实例一
|
1月前
|
存储 人工智能 Java
阿里云百炼大模型服务平台对接使用完全指南
本文提供了一份完整的阿里云百炼大模型服务平台对接使用指南。百炼是阿里云面向企业与开发者的一站式AI服务底座,整合通义千问全系列及DeepSeek、Kimi等第三方优质模型。文章从账号注册实名认证、开通百炼服务、创建与管理API Key等前置步骤讲起,详细介绍了通过API调用、Token Plan团队版订阅、Coding Plan三种方式接入模型的完整流程,并给出了Python与HTTP两种调用方式的代码示例。在应用构建层面,深入解析了智能体(Agent)、工作流(Workflow)、高代码应用三种开发模式,以及知识库(RAG)的创建、文档导入与检索增强生成实践。同时涵盖了MCP协议工具接入、模
|
1月前
|
存储 监控 对象存储
基于 YOLO11 的学生课堂行为检测:从数据集管理到云上训练实践
本文介绍基于YOLO11的学生课堂行为检测全流程实践,涵盖8类行为的数据集构建、Label Studio标注规范、云上(OSS)版本化存储管理,以及云端训练、评估与边缘部署优化,助力智慧课堂落地。
基于 YOLO11 的学生课堂行为检测:从数据集管理到云上训练实践
|
1月前
|
存储 人工智能 运维
能说会写的ai—阿里云技术
阿里云以全栈自研技术(飞天OS、CIPU芯片、神龙架构、AliFlash)打造高性能、高可靠云端底座,网络时延达微秒级,存储持久性达12个9;提供函数计算、OSS等弹性智能服务,深度适配AI与国产生态,覆盖全球29地92可用区,SLA高达99.975%。(239字)
|
1月前
|
存储 API 数据处理
阿里云智能媒体管理(IMM)对接使用全攻略:从开通到生产级实践
本文全面解析阿里云智能媒体管理(IMM)的对接与使用。首先介绍IMM的产品定位与服务架构,阐明其与OSS的深度集成关系。然后详细说明开通服务、创建项目、绑定Bucket的全流程操作,并给出Java和Python两种主流语言的SDK初始化与API调用示例。接着深入讲解文档格式转换、文档预览、视频截帧、图片智能检测等核心功能的实现方法,涵盖同步与异步处理两种模式。同时针对权限配置、新旧版本差异、计费规则、性能优化等关键问题进行专项剖析,帮助读者构建生产级的媒体处理能力。全文基于新版IMM(API版本2020-09-30)撰写,适合开发者、架构师及技术决策者阅读。
|
1月前
|
人工智能 安全 决策智能
数学周刊第25期(2026年07月06日-07月12日)韦东奕获奖中科院发布全流程数学研究智能体MMAT
数学周刊第25期(2026年07月06日-07月12日)韦东奕获奖中科院发布全流程数学研究智能体MMAT
|
1月前
|
人工智能 安全 API
阿里云JVS智能体套件对接使用完全指南:从架构解析到API深度集成
本文提供了一份完整的阿里云JVS智能体套件对接使用指南。JVS是阿里云推出的企业级AI智能体一体化产品家族,由JVS Claw、JVS Crew和JVS Mobile三大产品组成,基于Harness分布式架构与'环境范式'设计理念,实现思考与执行的分离。文章从账号准备、产品选型开始,逐步讲解Clawbot创建与配置、多渠道接入(QQ、企业微信、钉钉等)、JVS Crew的API对接(含完整的Python SDK示例)、JVS Mobile的云端手机实例创建与使用,以及自定义Skill开发流程。在技术层面深入解析了Harness四层架构(统一接入层、智能体运行时层、安全沙箱层、数据层)和Agen

热门文章

最新文章