使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的解决

Spring Cache Redis使用Jackson序列化时遇到的问题 发现redis里保存列表数据时,“java.util.List”集合类型丢失,报错com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected VALUE_STRING: need JSON String, Number of Boolean that contains type id (for subtype of java.lang.Object) 阅读详情

应用场景

我们希望通过缓存来减少对关系型数据库的查询次数,减轻数据库压力。在执行DAO类的select***(), query***()方法时,先从Redis中查询有没有缓存数据,如果有则直接从Redis拿到结果,如果没有再向数据库发起查询请求取数据。

序列化问题

要把domain object做为key-value对保存在redis中,就必须要解决对象的序列化问题。Spring Data Redis给我们提供了一些现成的方案:

  • JdkSerializationRedisSerializer. 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class),但缺点是序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。
  • Jackson2JsonRedisSerializer. 使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。

如果用方案一,就必须付出缓存多占用4倍内存的代价,实在承受不起。如果用方案二,则必须给每一种domain对象都配置一个Serializer,即如果我的应用里有100种domain对象,那就必须在spring配置文件中配置100个Jackson2JsonRedisSerializer,这显然是不现实的。

通过google, 发现spring data redis项目中有一个#145 pull request, 而这个提交请求的内容正是解决Jackson必须提供类型信息的问题。然而不幸的是这个请求还没有被merge。但我们可以把代码copy一下放到自己的项目中:

/**
 * @author Christoph Strobl
 * @since 1.6
 */
public class GenericJackson2JsonRedisSerializer implements RedisSerializer<Object> {

    private final ObjectMapper mapper;

    /**
     * Creates {@link GenericJackson2JsonRedisSerializer} and configures {@link ObjectMapper} for default typing.
     */
    public GenericJackson2JsonRedisSerializer() {
        this((String) null);
    }

    /**
     * Creates {@link GenericJackson2JsonRedisSerializer} and configures {@link ObjectMapper} for default typing using the
     * given {@literal name}. In case of an {@literal empty} or {@literal null} String the default
     * {@link JsonTypeInfo.Id#CLASS} will be used.
     * 
     * @param classPropertyTypeName Name of the JSON property holding type information. Can be {@literal null}.
     */
    public GenericJackson2JsonRedisSerializer(String classPropertyTypeName) {

        this(new ObjectMapper());

        if (StringUtils.hasText(classPropertyTypeName)) {
            mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);
        } else {
            mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
        }
    }

    /**
     * Setting a custom-configured {@link ObjectMapper} is one way to take further control of the JSON serialization
     * process. For example, an extended {@link SerializerFactory} can be configured that provides custom serializers for
     * specific types.
     * 
     * @param mapper must not be {@literal null}.
     */
    public GenericJackson2JsonRedisSerializer(ObjectMapper mapper) {

        Assert.notNull(mapper, "ObjectMapper must not be null!");
        this.mapper = mapper;
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.data.redis.serializer.RedisSerializer#serialize(java.lang.Object)
     */
    @Override
    public byte[] serialize(Object source) throws SerializationException {

        if (source == null) {
            return SerializationUtils.EMPTY_ARRAY;
        }

        try {
            return mapper.writeValueAsBytes(source);
        } catch (JsonProcessingException e) {
            throw new SerializationException("Could not write JSON: " + e.getMessage(), e);
        }
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.data.redis.serializer.RedisSerializer#deserialize(byte[])
     */
    @Override
    public Object deserialize(byte[] source) throws SerializationException {
        return deserialize(source, Object.class);
    }

    /**
     * @param source can be {@literal null}.
     * @param type must not be {@literal null}.
     * @return {@literal null} for empty source.
     * @throws SerializationException
     */
    public <T> T deserialize(byte[] source, Class<T> type) throws SerializationException {

        Assert.notNull(type,
                "Deserialization type must not be null! Pleaes provide Object.class to make use of Jackson2 default typing.");

        if (SerializationUtils.isEmpty(source)) {
            return null;
        }

        try {
            return mapper.readValue(source, type);
        } catch (Exception ex) {
            throw new SerializationException("Could not read JSON: " + ex.getMessage(), ex);
        }
    }
}

然后在配置文件中使用这个GenericJackson2JsonRedisSerializer:

<bean id="jacksonSerializer" class="com.fh.taolijie.component.GenericJackson2JsonRedisSerializer">
    </bean>

重新构建部署,我们发现这个serializer可以同时支持多种不同类型的domain对象,问题解决。

Spring Boot Redis Cache 原理与生产避坑指南 缓存是提升系统性能的关键技术,其本质是在一致性、吞吐量与资源成本间动态权衡。Spring Cache 提供统一抽象层,Redis 作为物理存储载体,二者通过 CacheManager、Cache 和 RedisCacheWriter 构成完整链路:从 @Cacheable 声明意图,到 RedisTemplate 执行 SETEX 命令,再到序列化策略影响数据可读性与兼容性。理解 TTL 配置、Key/Value 序列化机制、null 值处理及并发控制逻辑,是解决缓存穿透、击穿、雪崩等高频问题的技术基础。本 阅读详情

相关推荐

Spring Cache缓存失效时间精细化配置实战:从Redis TTL到多级缓存架构

缓存是提升系统性能、减轻数据库压力的核心技术,其核心原理是将高频访问数据存储在更快的介质中。Spring Cache作为Java生态中广泛使用的缓存抽象层,通过声明式注解简化了集成,但其原生对缓存失效时间(TTL)的管理存在短板,无法满足不同业务数据对实时性的差异化需求。在工程实践中,精细化的TTL控制对于保障数据一致性、防止缓存击穿与雪崩至关重要。本文聚焦于Spring Boot项目中,如何基于Redis等缓存中间件,实现按缓存名称空间配置差异化TTL、探索动态TTL的可行方案,并进一步探讨结合Caffe

453

①优雅的缓存框架:SpringCache入门

SpringCache优雅实现 不侵入业务代码 实现方法级缓存结果。

weixin_42973338的博客 177

Spring Cache缓存失效时间(TTL)配置全解析:Redis与Caffeine实战指南

缓存是提升应用性能、降低数据库负载的核心技术,其核心原理是将高频访问的数据暂存于高速存储中,实现快速响应。缓存失效时间(TTL)是控制数据一致性与新鲜度的关键技术参数,直接影响系统的稳定性和用户体验。在Java生态中,Spring Cache作为主流的缓存抽象层,为开发者提供了统一的编程模型,但其默认的TTL行为往往隐藏着数据不一致或内存溢出的风险。本文聚焦于Spring Cache与主流缓存实现(Redis、Caffeine)的深度集成,详细阐述如何针对不同业务场景,精细化配置缓存失效时间,有效应对缓存雪

weixin_34101784的博客 286

使用SpringCache实现缓存,自定义序列化方式,解决序列化bug

使用SpringCache实现缓存,自定义序列化方式,解决序列化bug 在学习SpringCache之前,很多同学会使用硬编码的方式去给代码设置缓存,缓存操作和业务逻辑之间的代码耦合度高,对业务逻辑有较强的侵入性。 当然我们也可以结合Spring的AOP和自定义注解去实现缓存。 那么在Spring中,我们可以直接使用SpringCache来完成我们在项目中数据的缓存操作。 缓存声明 名称 解释 @Cacheable 根据方法的请求参数对其结果进行缓存,下次同样的参数来执行该方法时可以直接从缓

wazk2008的博客 4956

告别开发“坐牢”:Spring Boot集成Redis缓存实战与多练辅助方法论

缓存是提升系统性能、降低数据库负载的核心技术之一,其原理是将高频访问的数据存储在更快的介质中,减少对后端数据源的直接访问。在分布式系统中,缓存技术对于应对高并发场景、保障系统响应速度具有关键价值,广泛应用于电商秒杀、社交动态、内容推荐等场景。然而,在实际集成缓存时,开发者常因环境配置、缓存穿透、数据一致性等问题陷入调试困境,即所谓的“坐牢”状态。本文以Spring Boot集成Redis为具体案例,系统性地演示了如何通过**环境辅助**与**任务拆解**的方法论,将复杂的技术集成过程工程化,从搭建可复现的D

weixin_30655569的博客 447

STM32MP157+AD7606BSTZ四通道IEPE传感器采集方案实战(附完整电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器采集方案,涵盖硬件电路设计、软件驱动开发及系统性能优化。通过精确的恒流源设计和同步采样技术,实现高精度振动信号采集,适用于工业振动监测等应用场景。

weixin_42713608的博客 700

SpringCache如何自定义序列化类型

if(!} }

weixin_44308078的博客 354

power bi 演唱会-佐罗

我是业务分析人员,注重使用性,因此,课程不到 30% 的内容就可以解决目前为止我碰到的所有业务问题,剩下的 70% 内容是帮助我提升,优化,升华,精益求精用的,比如第三方工具,比如代码运行速度优化,比如查询逻辑优化等等。系统性上来说,结构明晰,安排上非常有条理,层层递进;《BI 真经》,中有真经二字,略显夸大,而当我第一次证明了这点的时候,我也非常惊讶,这就是我做以下所有事情的一切动力。《BI 真经》综合考量思想性,系统性,本质性,创新性,通用性,技巧性,启发性,对比其他课程有压倒性的显著优势。

v_1090213742的博客 911

Spring Cache

key的生成指定生成缓存的key:key属性指定,接收一个Spel指定缓存的数据的存活时间:配置文档中修改存活时间将数据保存为json格式。

闰土的博客 1386

用Simulink对Carsim车辆进行档位控制

用Simulink对Carsim车辆进行档位控制一、carsim中的档位设置为开环控制二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear三、双击进去设置常量为 0四、输入和输出IO通道五、验证 :输入 为 3 档 ----- 输出 为 3!六、参考 一、carsim中的档位设置为开环控制 二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear 三、双击进去设置常量为 0 四、输入和输出IO通道 五、验证 :输入 为 3 档 -

qq_42027654的博客 2599

浅谈IC测试向量(pattern)及其转换

随着集成电路的飞速发展,其规模越来越大,对电路的质量与可靠性要求进一步提高,集成电路的测试方法也变得越来越困难,为了实现芯片的快速测试和筛选,ATE设备为其提供了强有力的支撑。ATE运用芯片设计仿真文件,将其作为芯片输入激励,通过ATE测试平台提供芯片测试环境,将芯片的输出和测试结果进行比较,以此来判定芯片的好坏。 说起IC测试,不得不说一下Pattern这个词,它中文的意思是模式。在图像处理中,这个词意思为图像的纹理特征,而在IC也即芯片测试行业,这个词实际上代表了需要测试芯片的时序特征。简单的说,在测

flomingo1的专栏 1万+

使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的解决...

应用场景 我们希望通过缓存来减少对关系型数据库的查询次数,减轻数据库压力。在执行DAO类的select***(), query***()方法时,先从Redis中查询有没有缓存数据,如果有则直接从Redis拿到结果,如果没有再向数据库发起查询请求取数据。 序列化问题 要把d...

WGH100817的博客 232

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2801

使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的处理

序列化报:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to *.*.Model

今晚摸鱼 1928

视觉提示学习(Prompt Learning):CV领域的GPT时刻?

视觉提示学习(Prompt Learning):CV领域的GPT时刻? ,人工智能,计算机视觉,大模型,AI,在人工智能技术不断演进的今天,计算机视觉(Computer Vision,CV)作为人工智能领域的重要分支,始终致力于让机器 “看懂” 世界。从早期基于传统特征工程的图像识别方法,到深度学习时代卷积神经网络(Convolutional Neural Networks,CNN)的崛起,CV 领域经历了多次重大变革。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 794

Spring Boot整合Redis缓存:从零到生产级实战指南

缓存是提升应用性能、降低数据库负载的核心技术之一,其原理是将高频访问的数据存储在更快的介质中,减少对后端资源的直接请求。在Java生态中,Spring Boot通过其强大的自动配置和缓存抽象,极大地简化了与Redis等缓存中间件的集成。这种技术组合的价值在于,开发者能以声明式的方式(如使用@Cacheable注解)快速为应用添加缓存层,从而显著提升查询响应速度与系统吞吐量。典型的应用场景包括电商商品详情、用户会话管理、热点数据查询等。本文以Spring Boot整合Redis实现缓存为具体案例,深入探讨了从

weixin_34315485的博客 437

Motoman机器人离线编程——Motocom32开发简介

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章: Motoman机器人离线编程——Motocom32开发简介 Motoman机器人离线编程——Visio Studio环境配置 Motoman机器人离线编程——Motocom32库函数的使用与封装 Motoman机器人离线编程——Motocom32参考文献及注意事项 Motoman机器人离线编程——MotocomES介绍 ...

冯Jungle的个人博客 8713

第35篇-Redis缓存集成

本文摘要: 《Kotlin + Spring Boot 4 从零到架构师》第35篇主要讲解Redis缓存集成。文章首先对比数据库和Redis的性能差异,指出Redis在读取性能上具有100倍优势,适合商品详情等读多写少场景。接着详细介绍了通过Docker部署Redis的方法,包括docker-compose配置和密码设置。然后讲解了Spring Boot集成Redis的步骤,包括依赖添加、连接配置和JSON序列化设置,特别比较了RedisTemplate和StringRedisTemplate的区别。最后演

liumingxiy的博客 189

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

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

分布式多级缓存框架layering-cache:为高并发场景设计的监控友好型解决方案

在当今高并发的微服务架构中,缓存已成为提升系统性能的关键组件。然而,传统的单级缓存方案往往难以应对复杂的分布式环境需求。layering-cache应运而生,这是一个专为监控而生的分布式多级缓存框架,通过创新的分层架构设计,为开发者提供了高性能、高可用且易于运维的缓存解决方案。 --- ## 核心架构设计:多级缓存与数据一致性保障 layering-cache的核心设计理念在于**分层缓存架

gitblog_00833的博客 1063

深度学习工具包 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")

Spring Data Redis实战指南:从核心原理到生产级应用

在Java后端开发中,缓存是提升系统性能的关键技术,而Redis作为高性能的内存数据存储,常被用于缓存、会话存储等场景。其核心原理基于内存操作与丰富的数据结构,通过键值对存储实现高速读写。Spring Data Redis作为Spring生态的抽象层,为开发者提供了统一、模板化的操作接口,屏蔽了底层客户端差异与序列化细节,极大提升了开发效率与代码可维护性。在实际工程实践中,合理配置序列化策略(如Jackson2JsonRedisSerializer)与连接工厂(如Lettuce),并掌握分布式锁、缓存注解等

weixin_34195142的博客 433

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring Boot整合Redis实战:秒杀系统优化与性能提升

Redis作为高性能内存数据库,在现代分布式系统中扮演着关键角色。其核心原理基于内存存储与高效数据结构,通过键值存储实现毫秒级响应。在Java生态中,Spring Data Redis提供了与Redis交互的便捷方式,支持连接池管理、序列化配置等关键技术点。针对高并发场景如秒杀系统,合理使用Redis可以显著提升系统吞吐量,实测QPS可从800提升至4500+。通过多级缓存、分布式锁等机制,能有效解决缓存穿透、数据一致性等典型问题。本文结合电商项目实战,详细解析Spring Boot集成Redis的最佳实践

weixin_34080951的博客 408

Spring Boot Redis客户端选型:Jedis、Lettuce、RedisTemplate与Redisson深度解析

在分布式系统和高并发应用中,缓存是提升性能、降低数据库负载的核心技术之一。Redis作为高性能的键值存储数据库,其Java客户端的选择直接关系到应用的稳定性和效率。理解不同客户端的底层原理,如Jedis的同步阻塞IO模型与Lettuce基于Netty的异步非阻塞架构,是进行技术选型的基础。这些原理决定了客户端在高并发场景下的资源利用率和吞吐量,其技术价值在于能够为系统提供可靠的数据访问层,支撑电商秒杀、实时监控等应用场景。在实际工程实践中,针对缓存穿透、击穿、雪崩等经典问题,需要结合客户端特性设计防御策略,

cuiji1279的博客 501

用豆包辅助从头开始学习java spring cloud(七)

这是 Spring Cloud 学习笔记(七),Docker 部署 Redis,SpringBoot 接入 RedisTemplate,实现字符串读写。给用户查询接口增加 Redis 缓存,解决 JDK 序列化、Jackson 反序列化类型转换坑。通过缓存空值实操解决缓存穿透,讲解缓存穿透、击穿、雪崩的现象与解决方案。区分三者概念,提及更新库后删缓存的策略。明日学习架构演进与 RESTful 规范。

逸辰轩的博客 446
上一篇: Spring MVC Tomcat下GET请求和POST请求乱码的解决
下一篇: Spring AOP + Redis缓存数据库查询
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值