架构知识使用Redis的分布式Java锁

基于Redisson的联锁(MultiLock) 基于Redis的分布式MultiLock对象允许对Lock对象进行分组并将它们作为单个锁进行处理。每个RLock对象可能属于不同的Redisson实例。如果获取的Redisson实例MultiLock崩溃,那么它可能永远挂在获取状态。为了避免这种情况,Redisson维护了一个锁看门狗,它会在持有者Redisson实例处于活动状态时延长锁过期时间。默认情况下,锁定看门狗超时为30s,可以通过Config.lockWatchdogTimeout设置进行更改。 阅读详情

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。

了解有关分布式锁定以及如何在项目中实现它的更多信息!

什么是分布式锁定?

在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能导致争用情况,错误和其他意外行为。

为了确保没有两个线程可以同时访问同一资源,并确保以可预测的顺序对资源进行操作,程序员使用一种称为锁的机制。每个线程首先获取锁,然后对资源进行操作,最后将锁释放给其他线程。

在Java中,由于多种原因,锁定对象通常比使用同步块更灵活。首先,Lock API可以以不同的方法运行,而同步块完全包含在一个方法中。

另外,如果线程被阻止,则无法访问同步的块。使用Lock,该线程将仅在可用时获取锁。这大大减少了线程等待的时间。另外,当线程正在等待时,可以调用一种方法来中断线程,而当线程正在等待获取同步块时,这是不可能的。

分布式锁定意味着你不仅需要考虑多个线程或进程,还需要考虑在不同计算机上运行的不同客户端。这些单独的服务器必须进行协调,以确保它们中的任何一个在任何给定时间都在使用资源。

基于Redis的分布式Java锁定工具

Redisson框架是用于Java的基于Redis的内存数据网格,可为需要执行分布式锁定的程序员提供多个对象。 下面,我们将讨论每个选项及其之间的区别。

  1. 锁

RLock接口在Java中实现java.util.concurrent.locks.Lock接口。 这是一个可重入锁,这意味着线程可以多次锁定资源。 一个计数器变量跟踪锁定请求被执行了多少次。 一旦线程发出足够的解锁请求并且计数器达到0,资源便被释放。

以下简单代码示例演示了如何在Redisson中创建和初始化Lock:

RLock lock = redisson.getLock("anyLock");

// Most familiar locking method

lock.lock();

try {

  ...

} finally {

  lock.unlock();

}

 

如果获取此锁的Redisson实例崩溃,则该锁可能会在此获取状态下永久挂起。 为了避免这种情况,Redisson维护了一个锁“看门狗”,该“看门狗”会在持有该锁的Redisson实例仍处于活动状态时延长该锁的过期时间。 默认情况下,此锁定看门狗的超时为30秒。 可以通过Config.lockWatchdogTimeout设置更改此限制。

Redisson还允许你在获取租约时指定leaseTime参数。 在指定的时间间隔后,锁将自动释放:

// Acquire lock and release it automatically after 10 seconds

// if unlock method hasn't been invoked

lock.lock(10, TimeUnit.SECONDS);

// Wait for 100 seconds and automatically unlock it after 10 seconds

boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);

if (res) {

   try {

     ...

   } finally {

       lock.unlock();

   }

}

 

Redisson还为Lock对象提供了异步/响应/ rxjava2接口:

RLock lock = redisson.getLock("anyLock");

lock.lockAsync();

...

// Reactive Stream (Spring Project Reactor implementation)

RLockReactive lock = redissonReactive.getLock("anyLock");

Mono<Void> res = lock.lock();

...

// Reactive Stream (RxJava2 implementation)

RLockReactive lock = redissonRx.getLock("anyLock");

Flowable<Void> res = lock.lock();

...

 

由于RLock实现了Lock接口,因此只有拥有锁的线程才能解锁资源。 否则,任何尝试都会遇到IllegalMonitorStateException。

2. FairLock

与其表兄弟RLock一样,RFairLock也实现了java.util.concurrent.locks.Lock接口。 通过使用FairLock,你可以保证线程将按照请求资源的顺序来获取资源(即``先进先出''队列)。 在为队列中的下一个线程解锁资源之前,Redisson会给已死掉五秒钟的线程重新启动。

与RLocks一样,创建和启动FairLock是一个简单的过程:

RLock lock = redisson.getFairLock("anyLock");

lock.lock();

try {

  ...

} catch {

  lock.unlock();

}

 

3. ReadWriteLock

 Redisson的RReadWriteLock实现了java.util.concurrent.locks.ReadWriteLock接口。 在Java中,读/写锁实际上是两个锁的组合:一个只读锁可以同时由多个线程拥有,而写锁只能一次由一个线程拥有。

创建和初始化RReadWriteLock的方法如下:

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");

rwlock.readLock().lock();

try {

  ...

} finally {

  rwlock.readLock().lock();

}

rwlock.writeLock().lock();

try {

  ...

} finally {

  rwlock.writeLock().lock();

}

 

4. RedLock

RedissonRedLock对象实现Redlock锁定算法,以将分布式锁与Redis一起使用:

RLock lock1 = redissonInstance1.getLock("lock1");

RLock lock2 = redissonInstance2.getLock("lock2");

RLock lock3 = redissonInstance3.getLock("lock3");

RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);

lock.lock();

try {

  ...

} finally {

   lock.unlock();

}

 

在Redlock算法中,我们在单独的计算机或虚拟机上有许多独立的Redis主节点。 该算法尝试使用相同的键名和随机值依次获取这些实例中的每个实例的锁。 仅当客户端能够比锁有效的总时间更快地从大多数实例中获取锁时,才获取锁。

5.多重锁

RedissonMultiLock对象能够将多个单独的RLock实例组合在一起并作为单个实体进行管理:

RLock lock1 = redissonInstance1.getLock("lock1");

RLock lock2 = redissonInstance2.getLock("lock2");

RLock lock3 = redissonInstance3.getLock("lock3");

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);

lock.lock();

try {

  ...

} finally {

  lock.unlock();

}

 

正如我们在上面的示例中看到的那样,每个RLock对象可能属于不同的Redisson实例。 反过来,这可能会连接到其他Redis数据库。

最后的想法

在本文中,我们探讨了Java开发人员可用于在Redis数据库之上的Redisson框架中执行分布式锁定的一些不同工具:Lock,FairLock,ReadWriteLock,RedLock和MultiLock。 有关Redisson中分布式计算的更多信息,请遵循GitHub上的项目Wiki。

> 喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
 > 如果你对java技术很感兴趣也可以交流学习,共同学习进步。 
> 不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货

Java后端架构技术面试汇总:基础+设计模式+MySQL+分布式+微服务等 下述整理的180道Java后端常问的面试体系汇总,有整理出一份知识点复习笔记和Java后端高频知识考点专题文档答案免费分享给大家!由于篇幅原因,在这只把部分的题目列举出来 阅读详情

相关推荐

美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还实现了可重入锁(Reentrant Lock)、公平锁(Fair Lock、联锁(MultiLock)、 红锁(RedLock)、 读写锁(ReadWriteLock)等,还提供了许多分布式服务。Redisson提供了使用Redis的最简单和最便捷的方法。

架构师尼恩 3001

使用Redis的分布式Java锁

什么是分布式锁定? 在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能会导致竞争条件,错误和其他意外行为。 为了确保没有两个线程同时访问同一资源并且资源以可预测的顺序进行操作,程序员使用称为锁的机制。每个线程首先获取锁,对资源进行操作,最后将锁释放到其他线程。 在Java中,出于多种原因,锁定对象通常比使用同步块更灵活。首先,Lock API可以以不同的方式...

Tybyqi的博客 540

京东面试:Redis主从切换,锁失效了,怎么办?

Redis 分布式锁 主从切换问题的,有两个层面的解决方案:按照两个层面进行 深度回答,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,里边有大量的大厂真题、面试难题、架构难题。很多小伙伴刷完后, 吊打面试官, 大厂横着走。在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。另外,如果没有面试机会,可以找尼恩来改简历、做帮扶。前段时间,

架构师尼恩 1617

Redisson分布式锁和同步器详解-官方原版

Redisson分布式锁和同步器

深圳市多克创新科技有限公司 748

Redis 锁的重入性详解

Redis 锁的。

longgelaile的博客 1166

RedisDistributedLock:在Java中实现基于Redis的分布式可重入锁

SETNX是“SET if Not eXists”的缩写,是Redis的一个原子命令,用于设置键值对,如果键不存在则设置成功并返回1,如果键已经存在则不进行任何操作并返回0。SETNX是实现分布式锁的关键命令之一,因为它确保了在同一时刻只有一个客户端可以设置成功,从而避免了竞态条件。EXPIRE命令用于设置键的过期时间,以秒为单位。当给定的键在指定的时间内过期时,它会被Redis自动删除。这是实现自动锁释放机制的关键命令。

weixin_36012152的博客 964

使用redisson实现分布式锁

Redis based distributed reentrant Lock object for Java and implements java.util.concurrent.locks.Lock interface. If Redisson instance which acquired lock crashes then such lock could hang forever in acquired state. To avoid this Redisson maintains lock wat

qq_39624298的博客 591

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 576

java看门狗_架构知识使用Redis的分布式Java锁

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。了解有关分布式锁定以及如何在项目中实现它的更多信息!什么是分布式锁定?在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能导致争用情况,错误和其他意外行为。为了确保没有两个线程可以同时访问同一资源,并确保以可预测的顺序对资源进行操作,程序员使用一种称为锁的机制。每个线程首先...

weixin_39888412的博客 595

Simulink模块库介绍(一)——信号源模块

Simulink模块库介绍(一)——信号源模块库目录Clock模块Digital Clock模块Band-Limited White Noise模块 目录 simulink模块库中提供了丰富的信号源模块组。逐一介绍,算是对之前做个总结吧 Clock模块 通过时钟模块,输出的时间作为判断呢,如下图,前2s之前为高斯白噪声,后2s为正弦曲线,共计10s。 Digital Clock模块 数字时钟模块主要用于离散系统的计时,sample time表示采用时间,如下图:分别是1s和0.5s的采样时间 Band-

5万+

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

java 看门狗_架构知识使用Redis的分布式Java锁

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。了解有关分布式锁定以及如何在项目中实现它的更多信息!什么是分布式锁定?在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能导致争用情况,错误和其他意外行为。为了确保没有两个线程可以同时访问同一资源,并确保以可预测的顺序对资源进行操作,程序员使用一种称为锁的机制。每个线程首先...

weixin_42676876的博客 233

FOC电机控制中电流采样延迟补偿的原理和方法

摘要: FOC电机控制中,电流采样、计算与PWM更新存在固有延迟(约1.5个PWM周期),导致相位滞后,限制电流环带宽。主流补偿方法包括: 一阶前向预测法:基于历史电流值预测未来电流,抵消延迟,工程应用广泛; 相位超前补偿:通过s/z域校正器设计实现等效预测; 状态观测器法(如龙伯格观测器):通过电机模型闭环估计状态,兼具噪声抑制和参数辨识能力,但复杂度高。实际需注意参数敏感性、离散化精度及延迟时间校准,避免过补偿风险。一阶预测法因平衡效果与复杂度成为工业首选。

jifengzhiling的博客 2232

Java架构系列让你在大厂的征途上运筹帷幄:高并发+高性能+高可用

前言 很多人做java开发2至3年后,都会感觉自己遇到瓶颈。什么都会又什么都不会,如何改变困境,为什么很多人写了7,8年还是一个码农,工作中太多被动是因为不懂底层原理。公司的工作节奏又比较快,难有机会学习架构原理,也没人教,所以这个时候,学习架构原理,扩展思维,对自己以后职业生涯尤为重要。 同样公司的两个新人,一个新人一点就通,学东西很快,有的人,学东西很慢,也很痛苦,处处都是新技术。为什么?因为那个人懂原理,万物都有规律,掌握了规律学其他东西原理相通,一触就会,不懂原理就会处处碰壁,学习很慢还很折..

javassb的博客 260

OpenCV-Python实战(3)——OpenCV中绘制图形与文本

OpenCV 是一个的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。本文介绍了 OpenCV 提供的与绘制图形和文本相关的函数。在图形方面,我们了解了如何绘制基本图形(直线、矩形和圆形等)以及高级图形(剪裁线、箭头、椭圆和多边形)。在文本方面,我们了解了如何绘制文本以及 OpenCV 库中的所有可用字体。

盼小辉丶的博客 2万+

基于STM32L4XX、HAL库的MCP4561数字电位器驱动程序设计

/ HAL库需要左移一位。* @param address: 设备地址(0x2C-0x2F)* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hi2c: I2C句柄。

zhusl6688的博客 340

Java最新细说Redis分布式锁,java面试消息队列

千千万万要记得:多刷题!!多刷题!!之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!篇幅有限,以下只能截图分享部分的资源!!(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)(2)刷的算法题(还有左神的算法笔记)(3)面经+真题解析+对应的相关笔记(很全面)(4)视频学习(部分)ps:当你觉得学不进或者累了的时候,视频是个不错的选择在这里,最后只一句话:祝大家offer拿到手软!!本文已被。

2401_84007049的博客 1053

STM32F103RCT6的FLASH读写操作

STM32F103RCT6是一款常用的32位微控制器,它具有内置的FLASH存储器,可以用于存储程序代码和数据。在本文中,我们将详细介绍如何进行STM32F103RCT6的FLASH读写操作,并提供相应的源代码。写入数据时,我们通过将数据直接写入FLASH地址来完成。通过使用适当的API和规则,我们可以有效地读取和写入数据。写入FLASH时,我们需要按特定的规则进行编程。首先,我们需要包含适当的头文件和定义相关的宏和变量,以便在代码中使用FLASH API。类型的指针,我们可以直接读取FLASH中的数据。

UplKubernetes的博客 1034

java互联网架构

BAT面试之深入理解Java虚拟机.mp4 Mysql查询计划与索引优化最佳实践.mp4 Mysql索引底层数据结构.mp4 Spring Boot核心源码剖析.avi 【分布式系列】Redis高并发分布式锁实战.mp4 【分布式系列】RocketMq、Kafka.mp4 【分布式系列】大型网站群SSO服务如何搭建.mp4 【分布式系列】深入剖析Zookeeper集群原理.mp4 【分布式系列】微...

weixin_44019542的博客 237

【漏洞复现】WordPress Plugin NotificationX 存在sql注入CVE-2024-1698

技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。WordPress和WordPress plugin都是WordPress基金会的产品。WordPress Plugin NotificationX 存在安全漏洞,该漏洞源于对用户提供的参数转义不充分以及对现有 SQL 查询缺乏充分的准备,很容易通过“type”参数受到 SQL 注入攻击。

失心少年 1382

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java 后端系统设计完整知识体系(全栈架构师级)

这篇文章全面系统地介绍了Java后端系统设计的完整知识体系,涵盖基础理论、存储层、服务层、分布式核心能力、高可用高性能安全以及工程落地与面试实战六大模块。主要内容包括: 系统设计基础理论:核心衡量指标(性能、可用性、可扩展性等)、经典架构演进路线(单体到云原生)、分布式理论(CAP定理、一致性算法)、流量与容量设计、架构设计原则(如单一职责、开闭原则等)。 存储层设计:详细讲解了MySQL表结构设计规范、性能优化、分库分表方案;Redis核心架构、数据结构应用场景、缓存问题解决方案;消息队列(RocketM

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java 实现基于Redis的分布式可重入锁

Java 实现基于Redis的分布式可重入锁 之前在 Java实现基于的Redis的分布式锁 这篇文章中,已经实现了加锁的逻辑,但是有个缺点,就是不可重入,任何重入锁的尝试都会导致死锁的发生,想了一下,这个问题可以解决。     Thinking   如何实现可重入?   首先锁信息(指redis中lockKey关联的value值) 必须得设计的能负

莫名的拉风的博客 5927

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

从单机架构到分布式:Redis为何成为架构升级的关键一环?

本文是Redis系列的开篇先导,将采取循序渐进的方式来讲解,不会深入Redis的具体命令和配置,而是聚焦于回答一个根本问题:我们的架构为什么会走到需要Redis这一步?让我们从最初的起点开始...(温馨提示,本文文字内容较多,建议收藏下来反复学习喔)

2301_81073317的博客 1万+

Java分布式架构知识体系及知识体系图

Java分布式架构整体知识体系涉及多个方面,包括分布式理论基础、分布式计算、存储、消息传递、缓存、锁、事务、服务注册与发现、负载均衡、微服务架构等。在实际应用中,需要根据具体需求选择合适的技术和框架来构建高性能、高可用、可扩展的分布式系统。

helloworldchina的博客 1823

Java中常用的分布式排他锁实现方式

在分布式系统中,实现排他锁需要跨节点的协调机制。根据具体场景选择合适方案,并结合框架(如Redisson、Curator)简化开发。:利用Consul的会话(Session)和KV存储实现锁。:利用etcd的事务和租约(Lease)机制实现锁。:利用数据库的唯一约束或乐观锁机制确保锁的互斥性。:高并发场景,如缓存更新、秒杀系统。:通过临时顺序节点和监听机制实现锁。:对一致性要求高的系统,如金融交易。:利用Redis的原子操作(如。:微服务环境中的服务协调。:低频操作或小型系统。)和Lua脚本实现锁。

ttyy1112的专栏 1198

java redis锁用法_精心整理架构干货 使用Redis的分布式Java锁

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。了解有关分布式锁定以及如何在项目中实现它的更多信息!什么是分布式锁定?在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能导致争用情况,错误和其他意外行为。为了确保没有两个线程可以同时访问同一资源,并确保以可预测的顺序对资源进行操作,程序员使用一种称为锁的机制。每个线程首先...

weixin_42502860的博客 521
上一篇: 解决Java应用程序中的应用程序性能
程序员plus
博客等级 码龄8年 41粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值