redis-cluster主流客户端驱动不支持pipeline,该怎么解决。

redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持 redis集群客户端JedisCluster优化 - 管道(pipeline)模式支持Redis在3.0版正式引入了集群这个特性,扩展变得非常简单。然而当你开心的升级到3.0后,却发现有些很好用的功能现在工作不了了, 比如我们今天要聊的pipeline功能。 我们知道,普通的情况下,redis client与server之间采用的是请求应答的模式,即: Client: command1 阅读详情

redis-cluster,是基于redis的基础上开发分布式缓存数据库系统。

1、redis-cluster集群的特点:

1)无中心节点(share-nothing)架构,各个节点对等,每个节点存储集群数据的一部分。

2)集群数据分布在所有master节点上的16384个slots中,无冗余。

3)通过redis配置slave节点,完成数据备份存储以及提供failover节点。

4)redis cluster提供HA方案。节点之间通过gossip协议进行通信,交换节点的状态信息;如果超过半数以上的master节点与故障节点通信超时,则认为该节点是故障节点,则通过投票协议完成选举,实现redis 主从节点自动切换(auto-failover)。

5)直接ASK 转向/MOVED 转向机制.

6)redis cluster支持在线扩容、迁移和升级。

2、redis-cluster不足之处:

1)任意master挂掉,且当前master没有slave时,集群进入fail状态;

2)如果集群中超过半数的master故障,不管故障master是否有存活的salve,集群都会进入fail状态;

3)目前主流的redis-cluster客户端均不支持pipeline操作(这节所讲的重点)

3、如何实现redis-cluster的pipeline操作?

redis是一个cs模式的tcp-server,使用和http类似的请求响应协议,一个client可以通过一个socket链接发送多个请求命令。每次client发出请求命令后通常会阻塞等待server处理请求,server端处理完请求命令后给客户端返回响应报文。如果我们发送四次请求,需要8个tcp报文才能完成,其中如果包含报文发送时间,网络延时,这极大的浪费了redis server的处理数据的能力。具体通信过程如下:

client: set f1 1

server:OK

client: set f2 1

server:OK

client: set f3 1

server:OK

client: set f4 1

server:OK

如果我们利用redis的pipeline操作,我们则可以把多个命令打包成一个请求报文一次性发送给redis服务端,这样就不需要等待单条命令执行结果的返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下

client: set f1 1

client: set f2 1

client: set f3 1

client: set f4 1

server:OK

server:OK

server:OK

server:OK

但是目前redis-cluster客户端并不支持pipeline操作,客户端在初始化redis集群数据的时候,使用的是JedisCluster而不是Jedis对象,而JedisCluster 并没有发现提供有像Jedis一样的获取Pipeline对象的 pipelined()方法.

    private static JedisCluster jc;
    
    private final static String REDIS_CLUSTER_HOSTS = "redis_cluster_hosts";
    
    static {
        String redis_cluster_hosts = Config.getConfigValue(REDIS_CLUSTER_HOSTS);
        String[] redis_hosts = redis_cluster_hosts.split(",");
        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        for(String redisNode:redis_hosts){
            String[] hostPort = redisNode.split(":");
            HostAndPort hostAndPort = new HostAndPort(hostPort[0], Integer.parseInt(hostPort[1]));
            jedisClusterNodes.add(hostAndPort);
        }
        jc = new JedisCluster(jedisClusterNodes);
    }

根据redis-cluster的特性,集群数据分布在所有master节点上的16384个slots中,redis客户端在存储key的时候,首先是计算key存储的slot,再通过集群中solt与节点的映射,插入到对应的slot的master节点中。

如果我们需要支持批量操作,第一步,我们需要通过下面代码得到slotHostMap映射:

Map<String, JedisPool> nodeMap = jc.getClusterNodes();
String anyHostAndPortStr = nodeMap.keySet().iterator().next();
TreeMap<Long, String> slotHostMap = getSlotHostMap(anyHostAndPortStr);
/**
 * 获取slot与host对应关系
 * @param anyHostAndPortStr
 * @return
 */
private static TreeMap<Long, String> getSlotHostMap(String anyHostAndPortStr) {
    TreeMap<Long, String> tree = new TreeMap<Long, String>();
    String parts[] = anyHostAndPortStr.split(":");
    HostAndPort anyHostAndPort = new HostAndPort(parts[0], Integer.parseInt(parts[1]));
    Jedis jedis = null;
    try{
        jedis = new Jedis(anyHostAndPort.getHost(), anyHostAndPort.getPort());
        List<Object> list = jedis.clusterSlots();
        for (Object object : list) {
            List<Object> list1 = (List<Object>) object;
            List<Object> master = (List<Object>) list1.get(2);
            String hostAndPort = new String((byte[]) master.get(0)) + ":" + master.get(1);
            tree.put((Long) list1.get(0), hostAndPort);
            tree.put((Long) list1.get(1), hostAndPort);
        }
    }catch(Exception e){
        logger.error("getSlotHostMap error",e);
    }
    return tree;
}

通过上面的代码,我们可以得到每个master节点上分布的slot。这样我们就可以通过key计算出slot,再通过slot找到对应存储的节点。

  int slot = JedisClusterCRC16.getSlot(key); 
        //获取到对应的Jedis对象
        Map.Entry<Long, String> entry = slotHostMap.lowerEntry(Long.valueOf(slot));
        Jedis jedis = nodeMap.get(entry.getValue()).getResource();

找到了Jedis对象,那我们就可以通过jedis.pipelined()创建pipeline对象实现pipeline了。

在我们暴露给其他开发人员使用的批量操作方法中,是支持多个key批量操作,在计算每个key存储的slot之后,我们需要对通过节点上的key进行分类,然后分批通过pipeline操作同一个redis节点。

 public static String batchSet(Map<String,String> keyValues){
        logger.error("keymap size={}",keyValues.size());
        //通过key获取到相应的node,再通过node把key做分类
        Map<String, Map<String, String>> todoMap = getNodeKeyMap(keyValues);
        try {
            //todoMap保存了node与key之间的一对多的映射关系
            for(String key:todoMap.keySet()){
                Jedis jedis = nodeMap.get(key).getResource();
                Map<String, String> kv = todoMap.get(key);
                if(kv.size() > 0){
                    Pipeline p = jedis.pipelined();
                    for(String _key:kv.keySet()){
                        p.set(_key, kv.get(_key));
                    }
                    p.sync();
                }
            }
        } catch (Exception e) {
          logger.error("batchSet error",e);
        }
        return null;
    }

以上的一系列操作,最终的目的还是为了获取到单个master节点的Jedis对象,获取到pipeline对象。

休息之余总结出来的方法,如果大家有更好的方法,欢迎一起探讨。qq:1549690699


数据库之Redis运维手册(私人整理) 1、redis配置文件 #cat 8000.conf daemonize no #[yes/no]默认值no,该参数用于定制redis服务是否以守护模式运行。 pidfile /var/run/redis.pid #默认值/var/run/redis.pid,指定redis服务的进程号文件路径,以守护模式运行时需要配置本参数; port 8000 #默认值6379,指定redis服务... 阅读详情

相关推荐

Redis 八股文深度解析:线程模型、内存管理与事务机制全掌握

在后端开发与系统设计中,高性能缓存是解决高并发读写压力的关键技术,而 Redis 作为内存数据结构的代表,其底层原理常成为面试与性能调优的焦点。理解 Redis 的快速响应机制,不能仅停留在“基于内存”的表面,更需深入其单线程执行模型、IO 多路复用、高效数据结构编码以及内存淘汰策略等核心设计。例如,LRU 与 LFU 等淘汰算法如何影响缓存命中率,MULTI/EXEC 事务为何与关系型数据库的 ACID 特性存在差异。掌握这些原理,不仅能应用于缓存穿透、击穿、雪崩等经典场景的治理,还能指导 bigkey

weixin_30899023的博客 288

Redis cluster使用pipeline

本场 Chat 分享主要介绍如何在Redis cluster模式下使用jedis的pipeline方法。 本场 Chat 内容将涉及如下: Redis cluster模式下使用jedis的常见方法; Redis cluster模式下使用jedis的pipeline方法; ...

GitChat 1194

机器学习解决方案架构:从GCP落地到生产稳定的实战地图

机器学习解决方案架构(ML Solution Architecture)是保障AI项目从实验走向高可用生产的核心工程范式,其本质是通过分层设计、可观测性建设与成本敏感型决策,在数据接入、特征工程、模型服务和应用集成四大环节建立故障隔离边界与可验证交付标准。它超越单一算法选型,聚焦数据Schema治理、特征一致性保障、在线服务熔断机制及API网关业务规则注入等关键实践,直接支撑金融风控、电商推荐、工业质检等真实场景的10万QPS稳定推理与分钟级故障定位。本文基于GCP/Vertex AI技术栈,系统拆解可落地

culuo8053的博客 628

--Redis入坑--RedisPipelineException:Pipeline contained one or more invalid commands;WRONGTYPE ...

异常说明 最近在写代码的时候,redis报了如下错误: org.springframework.data.redis.connection.RedisPipelineException: Pipeline contained one or more invalid commands; nested exception is io.lettuce.core.RedisCommandException: WRONGTYPE Operation against a key holding the wrong k

qq_41120902的博客 9898

NoSQL选型本质:从业务读写模式匹配数据模型

NoSQL并非关系型数据库的简单替代,而是基于文档、宽列、键值、搜索四种核心数据模型,对现实业务约束进行结构性解耦的技术范式。其底层原理在于存储结构与查询路径的强绑定——MongoDB的BSON序列化决定IO效率,Cassandra的分区键定义物理磁盘布局,Redis的数据结构即API契约,Elasticsearch的倒排索引重构检索逻辑。这种模型驱动的设计,使NoSQL在高并发、海量时序、亚秒级搜索等场景具备不可替代的技术价值。典型应用场景包括实时风控(Redis)、设备监控(Cassandra)、内容管

weixin_30600197的博客 440

Redis

redis

の博客 381

为什么RedisCluster无法使用pipeline

我们知道,Redis 集群的键空间被分割为 16384 个槽(slot),集群的最大节点数量也是 16384 个。每个主节点都负责处理 16384 个哈希槽的其中一部分。具体的redis命令,会根据key计算出一个槽位(slot),然后根据槽位去特定的节点redis上执行操作。如下所示: master1(slave1): 0~5460 master2(slave2):5461~10922 master3(slave3):10923~16383 集群有三个master节点组成,其中master1分配了

搓搓那年时光静好 2990

从Mate到Mate40 Pro+:华为旗舰核心配置演进与选购避坑指南

本文回顾了华为Mate系列从初代到Mate40 Pro+的核心配置演进历程,重点分析了处理器性能、影像系统、屏幕设计及续航快充的技术突破。针对选购需求,提供了区分版本、5G选择及存储配置的实用避坑建议,帮助消费者明智选择华为旗舰机型。

weixin_30015371的博客 494

关于在Redis集群模式下不支持Scan和pipline的解释以及解决方案

 最近在写程序的过程中遇到一个问题,就是需要删除redis中key值以某个字符串开头的数据。因为通过查阅资料以后说如果数据量过大使用keys可能会产生死锁,并且速度会很慢,所以通过查阅各种资料发现使用scan会是比较好的一种方案,但是在真实的开发过程中发现了单节点的redis会支持scan但是集群环境中并不支持scan命令(本人使用的是redistemplate),不仅如此并且之前所熟知的Pipl...

TankyZhang的博客 1万+

国际项目投标那些事(三)海外项目招标文件的组成

以一个实际的项目作为例子,是我2020年初投的一个东南亚国家的水厂的竞争性投标。这个投标的招标基于FIDIC yellow book (Design and Build) 合同模板。 海外项目的招标一般是有专门的咨询公司(consulting engineer)写招标文件,有的咨询公司非常专业,对于技术、合同、业绩的要求非常细致。 我这个项目的招标文件共5册 400多页(全英文),附件26册将...

WTSolutions的博客 2004

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

Redis 知识体系(文档型 NoSQL)

本文深入解析Redis八大基础数据结构及其底层编码实现,涵盖String、List、Set、ZSet、Hash、Geo、Bitmap、HyperLogLog和Stream等核心结构。通过源码级分析,揭示了SDS、Ziplist、Dict等底层组件的设计原理,并详细探讨了Redis的高性能IO模型、持久化机制(RDB/AOF/混合模式)、内存管理策略及高可用架构(主从/哨兵/Cluster)。 重点剖析了Redis在工程实践中的典型问题与优化方案,包括缓存穿透/击穿/雪崩的解决方案、分布式锁的完整实现(含Re

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 796

NVIDIA Tao Toolkit环境配置踩坑

请搭配食用该文章为 Tao 安装中可能出现的问题进行解答,如果存在本文章中没出现的问题,欢迎提问,由我复现后更新文章。由于大部分云服务器厂商不能支持 docker,因此我使用的环境为2023年5月27日在平台租的 3080 旧版环境进行实验。

qq_36630208的博客 771

爬虫教程( 4 ) --- scrapy-redis、集群、curl-cffi、scrapy-stealth、aio-scrapy、omnicrawl-core、反检测(反爬)浏览器

分布式爬虫 scrapy-redis、集群

freeking101的博客 6826

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 940

实战落地!Python抓取股票历史数据:开盘/收盘/成交量全维度爬取(附数据清洗+可视化)

股票历史数据抓取的核心是“数据准确性+完整性”,网页爬取适合小批量、个性化需求,API调用适合批量、标准化需求。多市场数据抓取:适配港股(00700.HK)、美股(AAPL)的抓取逻辑;高频数据抓取:抓取分钟级、小时级行情数据,用于短线量化策略;财务数据扩展:抓取市盈率、市净率、净利润等财务指标,结合价格数据做基本面分析;量化策略回测:将清洗后的数据接入Backtrader、VNPY等量化框架,验证策略有效性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1740

【Redis】原理篇 3w字详解

try {// 1.建立连接// 2.获取输出流、输入流// 3.发出请求// 3.1.获取授权 auth 123321// 3.2.set name 虎哥sendRequest("set", "name", "虎哥");// 4.解析响应// 3.2.set name 虎哥// 4.解析响应// 3.2.set name 虎哥// 4.解析响应// 5.释放连接try {if (reader!if (writer!

ashiho的博客 560

提示词工程在机器翻译质量提升中的应用

Introduction to Prompt Engineering in Machine Translation Quality Improvement Keywords

AI天才研究院 1151

召回系统数据准备:YAML配置驱动与Pydantic验证实践

在推荐与搜索系统中,召回环节负责从海量候选集中快速筛选相关物品,其性能直接影响用户体验。为实现高效召回,业界普遍采用数据预处理与分层存储架构,将业务数据离线加工成向量、画像等专用格式,以解耦在线服务、优化查询性能。这一过程的核心是配置驱动的数据流水线,它通过定义数据源、转换规则与输出目标,实现流程的灵活编排与敏捷迭代。本文聚焦于使用YAML进行复杂配置管理,并结合Pydantic实现强类型验证与安全渲染,确保数据生成任务的稳定与可维护性,为向量召回、实时画像等场景提供可靠的数据供给。

weixin_34184158的博客 326

实战:利用 Agent Harness 自动化 PPT 制作

本文将带你从零开始,用轻量级Agent编排框架,结合主流大模型(GPT-4o、通义千问、文心一言等),搭建一套全自动化的PPT生成工作流:从用户输入自然语言需求,到需求解析、大纲生成、内容填充、数据匹配、排版美化、导出成品,全程不需要手动操作,最快10分钟就能产出符合要求的PPT。我们不会讲晦涩的Agent理论,所有步骤都有可直接运行的代码示例,哪怕你只有基础的Python语法基础,也能跟着一步步做出能用的自动PPT工具。

AI Agent Harness Engineering 569

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【人工智能专题】Redis 杀进 AI 数据层:向量搜索、语义缓存与 Agent 记忆工程从入门到踩坑

大多数团队手里已经有一个 Redis 在跑缓存。这篇文章要回答的是:能不能、该不该把它升级成 AI 应用的向量库 + 语义缓存 + Agent 记忆层。全文围绕 Redis 8.0 到 8.6 的 AI 能力演进展开,包含 Query Engine 与 Vector Sets 两条向量检索路径的完整对比、FT.HYBRID 混合检索、语义缓存的三种落地方式(RedisVL / Vector Sets 手写 / LangCache 托管)、语义路由、以及 Agent 记忆的双层模型。

weixin_42260382的博客 488

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Canal】实现原理和搭建方案

canal.adapter,相当于canal的客户端,会从canal-deployer中获取数据,然后对数据进行同步,可以同步到MySQL、Elasticsearch和HBase等存储中去。(1)全局配置:conf/application.properties(也可以是conf/application.yml,连接 Canal-Server、配置同步目标、全局参数)下载canal.deployer,可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理。

weixin_44823875的博客 944

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java最高频八股文速通

final 类:String 类被声明为 final,这意味着它不能被继承,从而防止了通过继承改变其行为。final 字段:String 类中的 value 字段是 final 的,这保证了 String 对象在创建后其内部字符数组不会被改变。没有提供修改方法:String 类没有提供任何可以修改其内容的方法。所有对 String 的操作(如拼接、替换等)都会生成一个新的String 对象。

qq_43751506的博客 6395

AI编程代理如何深度集成CI/CD与测试流程

AI编程代理已从代码补全工具演进为可嵌入真实软件工程流水线的智能执行单元。其核心原理在于打破沙盒隔离,通过环境镜像同步、事件驱动触发和双向状态回写,实现与Jira、GitLab、SonarQube等企业级工具链的语义级集成。技术价值体现在显著降低CI失败率(63%→4.2%)、提升测试有效性(+41%)及增强发布可审计性。典型应用场景包括自动化单元测试生成、Pipeline根因诊断、SBOM可信链构建与Changelog合规生成。本文聚焦Devin在金融级CI/CD、Testing与Integrations

技术百科 604

并行分布式框架:Celery、rq、funboost

Celery是一个异步任务的调度工具,也可以叫做 "分布式任务队列(Distributed Task Queue)"。

freeking101的博客 5万+

Node.js与WebSocket实现实时通信全攻略

WebSocket协议作为HTTP协议的补充,实现了真正的全双工通信,解决了传统HTTP轮询的效率问题。其核心原理是在单个TCP连接上建立持久化通道,允许服务端主动推送数据,特别适合实时性要求高的场景。Node.js凭借事件驱动和非阻塞I/O特性,成为构建WebSocket服务的理想平台。在电商大促、在线协作、金融交易等场景中,这种技术组合能轻松应对每秒上万级的并发请求。通过心跳检测、二进制传输、Redis广播等进阶技巧,开发者可以构建高性能的实时通信系统。本文以电商订单状态更新为案例,详细讲解从环境搭建到

weixin_34221276的博客 395
上一篇: 使用filter解决xss攻击
下一篇: 发生死锁的线程dump日志
南方的北方
博客等级 码龄14年 7粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值