??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区视频在线观看,亚洲成在人线中文字幕,亚洲另类古典武侠http://www.tkk7.com/zzzlyr/zh-cnFri, 09 May 2025 13:36:51 GMTFri, 09 May 2025 13:36:51 GMT60springboot3+springcloudstream4.x配置集成http://www.tkk7.com/zzzlyr/articles/451511.html׃a׃aThu, 31 Oct 2024 03:27:00 GMThttp://www.tkk7.com/zzzlyr/articles/451511.htmlhttp://www.tkk7.com/zzzlyr/comments/451511.htmlhttp://www.tkk7.com/zzzlyr/articles/451511.html#Feedback0http://www.tkk7.com/zzzlyr/comments/commentRss/451511.htmlhttp://www.tkk7.com/zzzlyr/services/trackbacks/451511.html阅读全文

׃a 2024-10-31 11:27 发表评论
]]>
springboot3.X + nacos2.3 集成使用备忘http://www.tkk7.com/zzzlyr/articles/451507.html׃a׃aSun, 27 Oct 2024 14:16:00 GMThttp://www.tkk7.com/zzzlyr/articles/451507.htmlhttp://www.tkk7.com/zzzlyr/comments/451507.htmlhttp://www.tkk7.com/zzzlyr/articles/451507.html#Feedback0http://www.tkk7.com/zzzlyr/comments/commentRss/451507.htmlhttp://www.tkk7.com/zzzlyr/services/trackbacks/451507.html
   其中dataid 是指配置文g名称Qgroup:相当于给配置文g分类Qnamespace:用来隔离环境?例如Qdev,test,product)

   比较x的点?bootstrap.ymlQ?application.yml q两文g用途和加蝲序

  1. bootstrap.yml 用于配置nacos地址Q用户名Q密码,命名I间(相当要先q接上nacos),然后才能拉去nacos上的配置文g信息; 
  2. application.yml 文g用于配置在本地的配置文g(其实q个也可以放到nacos?

    bootstrap配置文g是spring cloud新增的启动配|文Ӟ需要引入spring-cloud-context依赖后,才会q行加蝲(看spring cloud 2022版本以以??/p>

    • bootstrapqApplicationContext加蝲Q所以比application优先加蝲

    • 因ؓbootstrap优先于application加蝲Q所以不会被覆盖

    • 使用配置中心spring cloud configӞ需要在bootstarp中配|配|中心的地址Q从而实现父ApplicationContext加蝲Ӟ从配|中心拉ȝ应的配置到应用中?/p>

    它们加蝲序Qbootstrap.yaml文g生效后,去nacos拉去完配|信息后Q与本地的application.yaml配置信息q行合ƈQ然后加载到spring容器?br />
    在springboot工程中用基上用两个注释:@RefreshScope 攑֜cM和@value 配置使用 
    要实现取值和动态刷新通过实验证明使用@NacosValue是不行了Q因Z用了Spring Cloud的依赖包Q所以根据官Ҏ档显C,要通过 Spring Cloud 原生注解 @RefreshScope + @Value 来实现配|自动更斎ͼ我们可以用下面的Ҏ辑ֈ同样的效?br />nacos client 从服务端拉取配置信息会放到client 本地~存h 默认目录Q?{user}\nacos\config ?拉到调试时候有?
                            
    详细文章 Qhttps://developer.aliyun.com/article/859891

    

׃a 2024-10-27 22:16 发表评论
]]>
软g微服务体pM的分层设计和领域划分http://www.tkk7.com/zzzlyr/articles/435939.html׃a׃aSun, 26 Sep 2021 10:09:00 GMThttp://www.tkk7.com/zzzlyr/articles/435939.html阅读全文

׃a 2021-09-26 18:09 发表评论
]]>
InnoDB的锁的机制探I?/title><link>http://www.tkk7.com/zzzlyr/articles/435921.html</link><dc:creator>׃a</dc:creator><author>׃a</author><pubDate>Mon, 12 Jul 2021 07:38:00 GMT</pubDate><guid>http://www.tkk7.com/zzzlyr/articles/435921.html</guid><wfw:comment>http://www.tkk7.com/zzzlyr/comments/435921.html</wfw:comment><comments>http://www.tkk7.com/zzzlyr/articles/435921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zzzlyr/comments/commentRss/435921.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zzzlyr/services/trackbacks/435921.html</trackback:ping><description><![CDATA[<h1>InnoDB的锁</h1> <h2>InnoDB的行锁:׃n锁、排他锁、MDL?/h2> <h5>׃n锁:又称读锁、S锁。一个事务获取一个数据行的共享锁Q其他事务能获取该行对应的共享锁Q但不能获得排他锁;即一个事务在d一个数据行Ӟ其他事务也可以读Q但不能Ҏ据进行增删改查?/h5> <p>应用Q?/p> <p>1.自动提交模式下的select查询Q不加Q何锁Q直接返回查询结?/p> <p>2.通过select……lock in share mode在被d的行记录或范围上加一个读锁,其他事务可以读,但是甌加写锁会被阻?/p> <h5>排他锁:又称写锁、X锁。一个事务获取了一个数据行的写锁,其他事务׃能再获取该行的其他锁Q写锁优先最高?/h5> <p>应用Q?/p> <p>1.一些DML操作会对行记录加写锁</p> <p>2.select for update会对d的行记录上加一个写锁,其他M事务都不能对锁定的行加Q何锁Q否则会被阻?/p> <h5>MDL锁:MySQL5.5引入Q用于保证表中元数据的信息。在会话A中,表开启了查询事务后,会自动获得一个MDL锁,会话B׃能执行Q何DDL语句的操?/h5> <h3>行锁实现方式</h3> <p>InnoDB 行锁是通过l烦引上的烦引项加锁来实现的Q这一?MySQL ?Oracle 不同Q后者是 通过在数据块中对相应数据行加锁来实现的。InnoDB q种行锁实现特点意味着:只有通过 索引条g索数据,InnoDB 才用行U锁Q否则,InnoDB 用表? 在实际应用中Q要特别注意 InnoDB 行锁的这一Ҏ,不然的话Q可能导致大量的锁冲H, 从而媄响ƈ发性能?/p> <h3>行锁的三U算?/h3> <p>InnoDB 存储引擎有三U行锁的法Q其分别是:</p> <ul><li>Record Lock: 单个行记录上的锁</li><li>Gap Lock: 间隙锁,锁定一个范_但不包含记录本n</li><li>Next-Key ? Gap Lock + Record LockQ锁定一个范_q且会锁定记录本w?/li></ul> <p>RC模式下只采用Record LockQRR模式下采用了Next-Key</p> <h3>加锁场景分析</h3> <ul><li>主键索引</li></ul> <p>如果我们加锁的行上存在主键烦引,那么׃在这个主键烦引上d一?Record Lock?/p> <ul><li>辅助索引</li></ul> <p>如果我们加锁的行上存在辅助烦引,那么我们׃在这行的辅助索引上添?Next-Key LockQƈ在这行之后的辅助索引上添加一?Gap Lock</p> <p>辅助索引上的 Next-Key Lock ?Gap Lock 都是针对 Repeatable Read 隔离模式存在的,q两U锁都是Z防止q读现象的发生?/p> <ul><li>唯一的辅助烦?/li></ul> <p>q里有一个特D情况,如果辅助索引是唯一索引的话QMySQL 会将 Next-Key Lock 降?Record LockQ只会锁定当前记录的辅助索引?/p> <p>如果唯一索引由多个列l成的,而我们只锁定其中一个列的话Q那么此时ƈ不会q行锁降U,q会d Next-Key Lock ?Gap Lock?/p> <ul><li>Insert 语句</li></ul> <p>?InnoDB 存储引擎中,对于 Insert 的操作,其会查插入记录的下一条记录是否被锁定Q若已经被锁定,则不允许查询?/p> <h2>意向?/h2> <p>意向锁可以分为意向共享锁(Intention Shared Lock, IS)和意向排他锁(Intention eXclusive Lock, IX)。但它的锁定方式和共享锁和排他锁q不相同Q意向锁上锁只是表示一U?#8220;意向”,q不会真的将对象锁住Q让其他事物无法修改或访问。例如事物T1惌修改?code>test</code>中的?code>r1</code>Q它会上两个?</p> <ol><li>在表<code>test</code>上意向排他锁</li><li>在行<code>r1</code>上排他锁</li></ol> <p>事物T1?code>test</code>表上上了意向排他锁,q不代表其他事物无法讉K<code>test</code>了,它上的锁只是表明一U意向,它将会在<code>db</code>中的<code>test</code>表中的某几行记录上上一个排他锁?/p> <table> <thead> <tr> <th><br /></th> <th>意向׃n?/th> <th>意向排他?/th> <th>׃n?/th> <th>排他?/th> </tr> </thead> <tbody> <tr> <td>意向׃n?/td> <td>兼容</td> <td>兼容</td> <td>兼容</td> <td>不兼?/td> </tr> <tr> <td>意向排他?/td> <td>兼容</td> <td>兼容</td> <td>不兼?/td> <td>不兼?/td> </tr> <tr> <td>׃n?/td> <td>兼容</td> <td>不兼?/td> <td>兼容</td> <td>不兼?/td> </tr> <tr> <td>排他?/td> <td>不兼?/td> <td>不兼?/td> <td>不兼?/td> <td>不兼?/td> </tr> </tbody> </table> <h2>一致性非锁定?/h2> <p>一致性非锁定L?InnoDB 存储引擎通过行多版本控制(multi version)的方式来d当前执行旉数据库中行的数据。具体来说就是如果一个事务读取的行正在被锁定Q那么它׃去读取这行数据之前的快照数据Q而不会等待这行数据上的锁释放。这个读取流E如?所C?</p> <p><img src="https://passage-1253400711.cos.ap-beijing.myqcloud.com/2018-03-06-052802.png" alt="?" /></p> <p>行的快照数据是通过undoD|实现的,而undoD는来回滚事务,所以快照数据本w没有额外的开销。此外,d快照数据时不需要上锁的Q因为没有事务会对快照数据进行更攏V?/p> <p>MySQL 中ƈ不是每种隔离U别都采用非一致性非锁定ȝd模式Q而且q是采用了一致性非锁定读,不同隔离U别的表C不相同。在 READ COMMITTED ?REPEATABLE READ q两U隔ȝ别下QInnoDB存储引擎都用一致性非锁定诅R但是对于快照数据,READ COMMITTED 隔离模式中的事务d的是当前行最新的快照数据Q?REPEATABLE READ 隔离模式中的事务d的是事务开始时的行数据版本?/p> <h2>一致性锁定读</h2> <p>?InnoDB 存储引擎中,<code>select</code>语句默认采取的是一致性非锁定ȝ情况Q但是有时候我们也有需求需要对某一行记录进行锁定再来读取,q就是一致性锁定读?/p> <p>InnoDB 对于<code>select</code>语句支持以下两种锁定?</p> <ul><li><code>select ... for update</code></li><li><code>select ... lock in share mode</code></li></ul> <p><code>select ... for update</code>会对d的记录加一个X锁,其他事务不能够再来ؓq些记录加锁?code>select ... lock in share mode</code>会对d的记录加一个S锁,其它事务能够再ؓq些记录加一个S锁,但不能加X锁?/p> <p>对于一致性非锁定读,即行记录上加了X锁,它也是能够读取的Q因为它d的是行记录的快照数据Qƈ没有d行记录本w?/p> <p><code>select ... for update</code>?code>select ... lock in share mode</code>q两个语句必d一个事务中Q当事务提交了,锁也释放了。因此在使用q两条语句之前必d执行<code>begin</code>, <code>start transaction</code>Q或者执?code>set autocommit = 0</code>?/p> <h2>InnoDB 在不同隔ȝ别下的一致性读及锁的差?/h2> <pre><code class="lang-">consisten read //一致性读 share locks //׃n? Exclusive locks //排他? </code></pre> <table> <thead> <tr> <th><br /></th> <th><br /></th> <th>L提交</th> <th>d提交</th> <th>可重复读</th> <th>串行?/th> </tr> </thead> <tbody> <tr> <td>SQL</td> <td>条g</td> <td><br /></td> <td><br /></td> <td><br /></td> <td><br /></td> </tr> <tr> <td>select</td> <td>相等</td> <td>None locks</td> <td>Consisten read/None lock</td> <td>Consisten read/None lock</td> <td>Share locks</td> </tr> <tr> <td><br /></td> <td>范围</td> <td>None locks</td> <td>Consisten read/None lock</td> <td>Consisten read/None lock</td> <td>Share Next-Key</td> </tr> <tr> <td>update</td> <td>相等</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> </tr> <tr> <td><br /></td> <td>范围</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> </tr> <tr> <td>Insert</td> <td>N/A</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> </tr> <tr> <td>Replace</td> <td>无键冲突</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> </tr> <tr> <td><br /></td> <td>键冲H?/td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> </tr> <tr> <td>delete</td> <td>相等</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> </tr> <tr> <td><br /></td> <td>范围</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> </tr> <tr> <td><strong>Select … from … Lock in share mode</strong></td> <td>相等</td> <td>Share locks</td> <td>Share locks</td> <td>Share locks</td> <td>Share locks</td> </tr> <tr> <td><br /></td> <td>范围</td> <td>Share locks</td> <td>Share locks</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> </tr> <tr> <td><strong>Select * from … For update</strong></td> <td>相等</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive locks</td> </tr> <tr> <td><br /></td> <td>范围</td> <td>Exclusive locks</td> <td>Exclusive locks</td> <td>Exclusive next-key</td> <td>Exclusive next-key</td> </tr> <tr> <td><strong>Insert into … Select …</strong></td> <td><strong>innodb_locks_ unsafe_for_bi nlog=off</strong></td> <td>Share Next-Key</td> <td>Share Next-Key</td> <td>Share Next-Key</td> <td>Share Next-Key</td> </tr> <tr> <td>(指源表锁)</td> <td><strong>innodb_locks_ unsafe_for_bi nlog=on</strong></td> <td>None locks</td> <td>Consisten read/None lock</td> <td>Consisten read/None lock</td> <td>Share Next-Key</td> </tr> <tr> <td><strong>create table … Select …</strong></td> <td><strong>innodb_locks_ unsafe_for_bi nlog=off</strong></td> <td>Share Next-Key</td> <td>Share Next-Key</td> <td>Share Next-Key</td> <td>Share Next-Key</td> </tr> <tr> <td>(指源表锁)</td> <td><strong>innodb_locks_ unsafe_for_bi nlog=on</strong></td> <td>None locks</td> <td>Consisten read/None lock</td> <td>Consisten read/None lock</td> <td>Share Next-Key</td> </tr> </tbody> </table> <h5>在了?InnoDB 锁特性后Q用户可以通过设计?SQL 调整{措施减锁冲突和死锁,包括:</h5> <ul><li>量使用较低的隔ȝ?</li><li>_ֿ设计索引Qƈ量使用索引讉K数据Q加锁更精,从而减锁冲突的机?</li><li>选择合理的事务大, 事务发生锁冲突的几率也更小;</li><li>l记录集昄加锁Ӟ最好一ơ性请求够别的锁。比如要修改数据的话Q最好直接申h他锁Q而不是先甌׃n锁,修改时再h排他锁,q样Ҏ产生死锁;</li><li>不同的程序访问一l表Ӟ应尽量约定以相同的顺序访问各表,对一个表而言Q尽可能以固定的序存取表中的行。这样可以大大减死锁的Z;</li><li>量用相{条件访问数据,q样可以避免间隙锁对q发插入的媄?</li><li>不要甌过实际需要的锁?除非必须Q查询时不要昄加锁;</li><li>对于一些特定的事务Q可以用表锁来提高处理速度或减死锁的可能?/li></ul> <h2>参考资?/h2> <p>1.https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-intention-locks  mysql官网开发手?br /></p> <p>2.《MySQL 技术内q?– InnoDB 存储引擎?/p> <p>3.《深入浅出MySQL?/p> <p>4.https://www.modb.pro/db/33873</p><p><br /></p><img src ="http://www.tkk7.com/zzzlyr/aggbug/435921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zzzlyr/" target="_blank">׃a</a> 2021-07-12 15:38 <a href="http://www.tkk7.com/zzzlyr/articles/435921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大厂链\q踪架构?鹰眼)http://www.tkk7.com/zzzlyr/articles/435886.html׃a׃aFri, 04 Jun 2021 07:36:00 GMThttp://www.tkk7.com/zzzlyr/articles/435886.htmlhttp://www.tkk7.com/zzzlyr/comments/435886.htmlhttp://www.tkk7.com/zzzlyr/articles/435886.html#Feedback0http://www.tkk7.com/zzzlyr/comments/commentRss/435886.htmlhttp://www.tkk7.com/zzzlyr/services/trackbacks/435886.html整体架构
从日志生成到抓取、存储、分析、展现的多个pȝ间交互过E?/span>


image

EagleEye 的核?/h1>
  • TraceId

在复杂的分布式系l环境下QEagleEye是一个有q泛用途的调用分析和问题排查工兗与一般的调用信息埋点日志相比QEagleEye埋点的一个显著的不同点在于它的每条日志都有与每次h兌的上下文IDQ我们称为TraceId。通过TraceIdQ后期的日志处理时可以把一ơ前端请求在不同服务器记录的调用日志兌hQ重新组合成当时q个h的调用链。因此,EagleEye不仅可以分析到应用之间的直接调用关系Q还可以得到他们的间接调用关pR以及上下游的业务处理信息;对于调用铄底层pȝQ可以追溯到它的最上层h来源以及中间l过的所有节点;对于调用铄上层入口Q可以收集到它的整棵调用树,从而定位下游系l的处理瓉Q当下游某个应用有异常发生时Q能q速定位到问题发生的位|?/span>

image

如上图所C,应用A是接受到来自用户览器的Webh的前端服务器Q它是一条调用链的开始端Q在TBSession和EagleEyeFilter中都做了EagleEye上下文埋炏V请求收到后它会先调用EagleEye StartTrace生成TraceIdq放|在当前U程的ThreadLocalQ日志埋点请求信息(如URL、SessionId、UserId{)。在h处理完毕提交相应Ӟ再调用EndTrace清理U程中的EagleEye信息?在应用A调用应用B、C的HSF服务Q或者发送Notify消息ӞTraceId被包含在EagleEye上下文中Q随|络h到达应用B、C、D、E之中Qƈ攄在线EThreadLocal内,因此后箋调用到的q些pȝ都会有EagleEyeq次h的上下文。这些系l再发v|络hӞ也类似的携带了上下文信息的?/p>

  • RpcId

Z区别同一个调用链下多个网l调用的序和嵌套层ơ,EagleEyeq需要传输和记录RpcId?RpcId?.X1.X2.X3.....Xi来表C,Xi都是非负整数Q根节点的RpcId固定?开始,W一层网l调用的RpcId?.X1Q第二层的则?.X1.X2Q依ơ类推?例如Q从根节点发出的调用的RpcId?.1?.2?.3QRpcId?.1的节点发出的RpcId则ؓ0.1.1?.1.2?.1.3。如下图所C?/p>

image


通过RpcIdQ可以准的q原用链上每ơ调用的层次关系和兄弟调用之间的先后序?例如上图应用 G 的两ơ调?.2.1.1?.1.2.1Q可以看出对 DB 的访?.2.1.1源于 C ?G 的调?.2.1Q对 Tair 的访?.1.2.1源于B ?G 的调?.1.2?很多调用场景会比上面说的完全同步的调用更为复杂,比如会遇到异步、单向、广播、ƈ发、批处理{等Q这时候需要妥善处理好ThreadLocal上的调用上下文,避免调用上下文؜乱和无法正确释放。另外,采用多序号的RpcId设计Ҏ会比单序号递增更容易准还原当时的调用情况?/span>





׃a 2021-06-04 15:36 发表评论
]]>
分布式锁实现-redis,zk http://www.tkk7.com/zzzlyr/articles/435834.html׃a׃aWed, 24 Mar 2021 12:11:00 GMThttp://www.tkk7.com/zzzlyr/articles/435834.htmlhttp://www.tkk7.com/zzzlyr/comments/435834.htmlhttp://www.tkk7.com/zzzlyr/articles/435834.html#Feedback0http://www.tkk7.com/zzzlyr/comments/commentRss/435834.htmlhttp://www.tkk7.com/zzzlyr/services/trackbacks/435834.html 1:分布锁有好多实现方式
  •  Z数据库实?/li>
      q个实现方式比较复杂,考虑因素比较多,比如Q超?非公q锁,非重入等会有各种各样的问题,在解决问题的q程中会使整个方案变得越来越复杂。操作数据库需要一定的开销Q性能问题需要考虑      
  • Zredis实现(q个对于不太敏感的场景可以用,׃redis集群和单机,q有客户端,版本{多斚w因素考虑情况比较?
       性能好。用缓存实现分布式锁的~点 其数据库一?/div>
  • Zzookeeper实现(q个是最l也是最好最可靠?
       创徏临时节点Q可以解军_机,锁无法释放,非阻塞,不可冲入Q非公^的问?br /> 
    ȝ
从理解的难易E度角度Q从低到高)

数据?> ~存 > Zookeeper

从实现的复杂性角度(从低到高Q?br />
Zookeeper > ~存 > 数据?br />
从性能角度Q从高到低)

~存 > Zookeeper >= 数据?br />
从可靠性角度(从高CQ?br />
Zookeeper > ~存 > 数据?
下面讲基于redis实现分布锁代码:RedisTemplate 客户?lettuce


@Service
public class RedisDistributedLockUtils {

    @Autowired
    
private RedisTemplate redisTemplate;

    
private static final Long RELEASE_SUCCESS = 1L;

    
private static final long DEFAULT_TIMEOUT = 1000 * 10;
    
//因ؓ要用lua 脚本是因?nbsp;redis 执行lua脚本是原子操?/span>
    private static final String UNLOCK_LUA= "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

    
/**
     * 实时获取?br />     *
     * 试获取分布式锁 redis版本升?.1以上(spring-boot-starter-data-redis 版本 2.X以上)Q然后用setIfAbsent 不存?br />     * 当setIfAbsent成功之后断开q接Q下面设|过期时间的代码 stringRedisTemplate.expire(key,timeout);是无法执行的Q这时候就会有大量没有q期旉的数据存在数据库
     * 
@param lockKey    ?br />     * @param requestId  h标识
     * 
@param expireTime 期旉
     * 
@return 是否获取成功
     
*/
    
public boolean trySetDistributedLock(String lockKey, String requestId, long expireTime) {
        
return redisTemplate.opsForValue().setIfAbsent(lockKey, requestId,0 == expireTime ? DEFAULT_TIMEOUT : expireTime, TimeUnit.MILLISECONDS);
    }

    
/**
     * 以阻塞方式的获取?br />     * 
@param key
     * 
@param value
     * 
@param timeout
     * 
@return
     
*/
    
public boolean setDistributedLock(String key, String value, long timeout) {
        Boolean lock 
= false;
        
long start = System.currentTimeMillis();
        
while (!lock && (System.currentTimeMillis() - start < timeout)) {
            
//执行set命o
            lock = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.MILLISECONDS);
            
//不频J去获取?/span>
            try {
                
if (!lock) {
                    Thread.sleep(
60);
                }
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
return lock;
    }

    
public boolean releaseLock(String key, String value) {
        
// 使用Lua脚本Q先判断是否是自p|的锁,再执行删?br />        // 使用lua脚本删除redis中匹配value的keyQ可以避免由于方法执行时间过长而redis锁自动过期失效的时候误删其他线E的?br />        // spring自带的执行脚本方法中Q集模式直接抛Z支持执行脚本的异常EvalSha is not supported in cluster environment
        
// 所以只能拿到原redis的connection来执行脚?/span>

        List
<String> keys = new ArrayList<>();
        keys.add(key);
        List
<String> args = new ArrayList<>();
        args.add(value);
        Long result 
= (Long)redisTemplate.execute(new RedisCallback<Long>() {
            @Override
            
public Long doInRedis(RedisConnection connection) throws DataAccessException {
                Object nativeConnection 
= connection.getNativeConnection();
                
// 集群模式和单机模式虽然执行脚本的Ҏ一P但是没有共同的接口,所以只能分开执行
                
// 集群模式
                if (nativeConnection instanceof JedisCluster) {
                    
return (Long)((JedisCluster)nativeConnection).eval(UNLOCK_LUA, keys, args);
                }
                
//客户端是Jedis时?单机模式)
                else if (nativeConnection instanceof Jedis) {
                    
return (Long)((Jedis)nativeConnection).eval(UNLOCK_LUA, keys, args);
                }
                
//q里使用 redisTemplate 中lettuce 客户?/span>
                else{
                    DefaultRedisScript
<Long> redisScript = new DefaultRedisScript<>();
                    redisScript.setScriptText(UNLOCK_LUA);
                    redisScript.setResultType(Long.
class);
                    
return (Long)redisTemplate.execute(redisScript, keys, value);
                }
            }
        });
        
//q回最l结?/span>
        return RELEASE_SUCCESS.equals(result);
    }
}
Zzookeeper实现下期补上Q?br />

介绍分布式锁文章写的比较详细Q?br />https://blog.csdn.net/u010963948/article/details/79006572


׃a 2021-03-24 20:11 发表评论
]]>JDK 8 函数式接? Supplier、Function、Consumer、Predicatehttp://www.tkk7.com/zzzlyr/articles/435611.html׃a׃aFri, 24 Jul 2020 07:46:00 GMThttp://www.tkk7.com/zzzlyr/articles/435611.htmlhttp://www.tkk7.com/zzzlyr/comments/435611.htmlhttp://www.tkk7.com/zzzlyr/articles/435611.html#Feedback0http://www.tkk7.com/zzzlyr/comments/commentRss/435611.htmlhttp://www.tkk7.com/zzzlyr/services/trackbacks/435611.html函数式接口的特征

1、三U方?/span>

  • 唯一的抽象方?/span>
  • 使用default定义普通方法(默认ҎQ,通过对象调用?/span>
  • 使用static定义静态方法,通过接口名调用?/span>

2、一个新注解@FunctionInterface

  • 注解@FunctionalInterface告诉~译器这是一个函数式接口Q明这个函C只有一个抽象方法,当你试在接口中~写多个抽象Ҏ的时候编译器不允许Q但是可以有多个非抽象方法?/span>

  • 不过ObjectcȝҎ可以定义为抽象方法,因ؓ接口的实现类一定是Object的子c?/span>

  • 如果接口被标注了@FunctionalInterfaceQ这个类必ȝ合函数式接口的规?/span>

  • 即一个接口没有标注@FunctionalInterfaceQ如果这个接口满_数式接口规则Q依旧被当作函数式接口?/span>

3?/span>JDK 1.8 新增加的函数接口?/span>Q?br />   

    java.util.function.*
    java.util.function 它包含了很多接口Q用来支?Java?函数式编E,它们大致分ؓ五类Q?/span>

    
   

 4、代码样?br />

    
    /**
     *JDK 8 函数式接?nbsp; Supplier、Function、Consumer、Predicate
     *
     * @param args
     * @throws Exception
     
*/

    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor executor = (ThreadPoolExecutor)newFixedThreadPool(10);
        //1:JDK8以前Q通过匿名内部cd现函数式接口
        executor.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("JDK8以前Q通过匿名内部cd现函数式接口");
            }
        });
        //2:JDK8以后可以使用lambda 表达式来实现Qlambda表达式就是ؓ了优化匿名内部类而生(分开写效?
        Thread thread = new Thread(() -> System.out.println("task running !"));
        Runnable r = () -> System.out.println("JDK8以后可以使用lambda 表达式来实现Qlambda表达式就是ؓ了优化匿名内部类而生(分开写效?!");
        executor.submit(r);
        //3:合ƈh效果
        executor.submit(() -> {
            System.out.println("JDK8以后可以使用lambda 表达式来实现Qlambda表达式就是ؓ了优化匿名内部类而生!");
        });

        //4:其它 Supplier、Function、Consumer、Predicate 都可以用lambda 表达式来实现
        Supplier<String> supplier = () -> "我是SuSupplier";
        Supplier<Integer> supplier2 = () -> new Integer(1);
        System.out.println("supplier=" + supplier.get() + ";supplier2=" + supplier2.get());

        //5: Function功能型函数式接口 Function<T, R> 接受一个输入参数TQ返回一个结果R
        Function<String,Integer> function=str -> Integer.parseInt(str);
        Function<Integer,String> fun2 = item -> item+"";
        System.out.println("输入字符?nbsp;1 q回int型结果:"+function.apply("1"));
        System.out.println("输入整型 1 q回字符型结果:"+fun2.apply(2));

        //6: Consumer 一个接受单个输入参数ƈ且不q回l果的操作?nbsp;与大多数其他函数接口不同Q?nbsp;Consumer接口期望通过接受参数Q改普通对象引用?说明白点是对原来的D行加工,注意q回?nbsp;void)
        Consumer<StringBuffer> consumer= sb->sb.append("-yyy");
        StringBuffer sb1=new StringBuffer().append("111");
        consumer.accept(sb1);
        //改变sb的内部引用?/span>
        System.out.println("=========s="+sb1.toString());

        //7: Predicate<T> 断言型接口常用于集合的过滤,得到一个新的集?nbsp;Stream filter(Predicate<? super T> predicate);
        Predicate<Integer> predicate = age -> age > 18;
        Predicate<String> predicate2 = str -> str != null;
        System.out.println(predicate.test(19));
        System.out.println(predicate2.test(null));
        //我们常用集合qocd是对q个接口实现c?nbsp;其中 filter(Predicate<? super T> predicate) 用的是q个接口
        List<String> list= Lists.newArrayList("1","2","2","3","4","4","8");
        list.stream().map(s -> Long.parseLong(s)).distinct().filter(s -> s < 10).collect(Collectors.toList()).forEach(-> System.out.println(u));

        //ȝQ以上的例子其实都是JDK8 lambda 表达式简z的写法Q而且全是合ƈ写的Qƈ没有分开步骤?所有函数性接口,都可以用lambda 表达式简z写?

        
//关闭U程?/span>
        executor.shutdownNow();
    }


׃a 2020-07-24 15:46 发表评论
]]>
JDK 8 CompletableFuture 详细使用介绍http://www.tkk7.com/zzzlyr/articles/435608.html׃a׃aThu, 23 Jul 2020 11:29:00 GMThttp://www.tkk7.com/zzzlyr/articles/435608.htmlhttp://www.tkk7.com/zzzlyr/comments/435608.htmlhttp://www.tkk7.com/zzzlyr/articles/435608.html#Feedback0http://www.tkk7.com/zzzlyr/comments/commentRss/435608.htmlhttp://www.tkk7.com/zzzlyr/services/trackbacks/435608.html

JDK 8 ?CompletableFuture 是对 Future 的增?大大化了异步~程步骤,在Spring 框架中配合@EnableAsync @Async 更加事办功倍?/span>

1:在JDK 8 之前实现多线必需实现两个接口 Runnable 不带q回|另一个Callable带返回值的接口,配合ThreadPoolTaskExecutor.submit(Callable callable) q回一个Future对象? 使用Future获得异步执行l果Ӟ要么调用dҎget()Q要么轮询看isDone()是否为trueQ这两种Ҏ都不是很好,因ؓȝE也会被q等待,而CompletableFuture出现改变了这个问题,而且提供更多q且强大的其它功能?br /> 2QCompletableFuture? CompletableFuture<T> implements Future<T>, CompletionStage<T> 其实CompletableFuture 除了实现原来的Future 接口外,其它大部分方法都是在CompletionStage? CompletableFuture cd
大致介绍下completableFuture的命名规?/span>Q?/span>

1:按功能分cȝ话:

  • xxx()Q表CҎl在已有的线E中执行Q?/span>

  • xxxAsync()Q表C将异步在线E池中执行?/span>

  • 异步执行Ҏ默认一个参数的话Q务是?nbsp;ForkJoinPool.commonPool() U程池中执行的,带executor 参数的?nbsp;executorU程池异步执行?/span>

2:按逻辑和组l方式来分话(completableFuture 中大U有50个来Ҏ)

  • 一U是 then 的逻辑Q即前一个计完成的时候调度后一个计?/span>

  • 一U是 both 的逻辑Q即{待两个计算都完成之后执行下一个计,只要能组合一个和另一个,我们可以无限复用这?+1 的逻辑l合L多的计算

  • 另一U是 either 的逻辑Q即{待两个计算的其中一个完成之后执行下一个计。注意这L计算可以说是非确定性的。因l合的两个计中先触发下一个计执行的那个会被作ؓ前一个计,而这两个前置的计到底哪一个先完成是不可预知的

3:从依赖关pd出入参数cd区别Q基本分Zc:

  • apply 字样的方式意味着l合方式?nbsp;FunctionQ即接受前一个计的l果Q应用函C后返回一个新的结?/span>

  • accept 字样的方式意味着l合方式?nbsp;ConsumerQ即接受前一个计的l果Q执行消费后不返回有意义的?/span>

  • run 字样的方式意味着l合方式?nbsp;RunnableQ即忽略前一个计的l果Q仅{待它完成后执行动作
其中出入参数主要有JDK8 FunctionQConsumer或Runnable三中函数型接?每一U都军_了是怎么样一U依赖关p?我有一文章详l介l了JDK8函数型接口用法,能有助理解completableFutureҎ使用?/span>
http://www.tkk7.com/zzzlyr/articles/435611.html

4:completableFuture 配合框架使用

  因ؓ自从JDK8以后增强了多U程的用便L度:
1QJDk8 的函数式接口和lambda表过?/span>
2QcompletableFuture ?Future cȝ增强?/span>
q只是JDK 基础包中的功能,现在大部分开发都在用框?java 现在基本上都在用spring框架Q因为JDK基础包中的功能还是不如框架用方便,下边文章详细介绍 springboot中对JDK基础包中多线E功能配|和使用?
http://www.tkk7.com/zzzlyr/articles/435305.html





׃a 2020-07-23 19:29 发表评论
]]>
SpringBoot异步及线E池配置(jdk8新增加线E支持CompletableFuture)http://www.tkk7.com/zzzlyr/articles/435305.html׃a׃aWed, 25 Mar 2020 12:19:00 GMThttp://www.tkk7.com/zzzlyr/articles/435305.htmlhttp://www.tkk7.com/zzzlyr/comments/435305.htmlhttp://www.tkk7.com/zzzlyr/articles/435305.html#Feedback0http://www.tkk7.com/zzzlyr/comments/commentRss/435305.htmlhttp://www.tkk7.com/zzzlyr/services/trackbacks/435305.html阅读全文

׃a 2020-03-25 20:19 发表评论
]]>
生服务CPU100%问题快速定?/title><link>http://www.tkk7.com/zzzlyr/articles/433541.html</link><dc:creator>׃a</dc:creator><author>׃a</author><pubDate>Mon, 10 Dec 2018 07:59:00 GMT</pubDate><guid>http://www.tkk7.com/zzzlyr/articles/433541.html</guid><wfw:comment>http://www.tkk7.com/zzzlyr/comments/433541.html</wfw:comment><comments>http://www.tkk7.com/zzzlyr/articles/433541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zzzlyr/comments/commentRss/433541.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zzzlyr/services/trackbacks/433541.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: tahoma, 宋体; font-size: 13px; text-align: justify; background-color: #fafafc;">或者按Shift+p</span>公司生服务上常常出?CPU 100% 问题Q需要快速定位问题出现在那里Q以下备注解x法步骤:<br /><br /><div>1: 工具QtopҎQ?/div><div>•<span style="white-space:pre"> </span>执行top -c Q显CE运行信息列?/div><div>•<span style="white-space:pre"> </span>键入P (大写p)Q进E按照CPU使用率排?nbsp; Q?span style="color: #333333; font-family: tahoma, 宋体; font-size: 13px; text-align: justify; background-color: #fafafc;">输入大写PQ则l果按CPU占用降序排序。输入大写MQ结果按内存占用降序排序?注:大写P可以在capslock状态输入pQ?/span><span style="color: #333333; font-family: tahoma, 宋体; font-size: 13px; text-align: justify; background-color: #fafafc;">或者按Shift+p)<br /></span><img src="http://p99.pstatp.com/large/3224000379ba9d9d0956" alt="线上服务CPU100%问题快速定位实战" /><br />如上图找出最耗CPU q程 10765<br /><span style="font-size: 13px; color: #333333; font-family: tahoma, 宋体; line-height: 22.4px; text-align: justify; background-color: #fafafc;"><strong>l计信息?/strong></span><p style="font-size: 13px; color: #333333; font-family: tahoma, 宋体; line-height: 22.4px; text-align: justify; background-color: #fafafc;">前五行是pȝ整体的统计信息。第一行是d队列信息Q同 uptime 命o的执行结果。其内容如下Q?/p><div style="font-size: 13px; word-wrap: break-word; font-family: tahoma, 宋体; line-height: 22.4px; text-align: justify; background-color: #fafafc;"><table cellspacing="1" border="0" style="color: #333333; border-style: solid; border-color: #90a080; margin: 10px; background-color: #90a080;"><tbody><tr><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">01:06:48</td><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">当前旉</td></tr><tr><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">up 1:22</td><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">pȝq行旉Q格式ؓ??/td></tr><tr><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">1 user</td><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">当前d用户?/td></tr><tr><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">load average: 0.06, 0.60, 0.48</td><td style="font-family: Verdana, Helvetica, Arial; font-size: 14px; word-wrap: break-word; line-height: 1.6; padding: 2px 5px; margin: 0px; background-color: #ffffff;">pȝ负蝲Q即d队列的^均长度?br />三个数值分别ؓ 1分钟?分钟?5分钟前到现在的^均倹{?/td></tr></tbody></table><br /><font color="#333333">步骤二:扑և最耗CPU的线E?/font><br /><ol style="color: #333333;"><li>   top -Hp 10765 昄一个进E的U程q行信息列表</li><li>键入shift +p U程按照CPU使用率降序排?/li></ol><font color="#333333"> 步骤三: ?10765 转化?6q制(因ؓ堆栈是线Eid是十六进?</font><br /><font color="#333333">     命oQ?printf '%x' 10765   输出l果Q?a0d</font><br /><br /><font color="#333333">步骤四: 使用JVM命o  jstatck </font><br /><font color="#333333">            jstack 10765 | grep '2a0d' -C5 --color     打印堆栈信息Q通过id qo到线E的堆栈信息?/font><br /><br /><br /><font color="#333333">以下是top 其它常用命oQ?/font><br /><br /><p style="color: #000000; line-height: 1.5; margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: start; background-color: #ffffff;">附常用操?</p><div style="margin: 5px 0px; text-align: start; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important;">top <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">每隔5U显式所有进E的资源占用情况</span><span style="color: #008000; line-height: 1.5 !important;"><br /></span>top -d <span style="color: #800080; line-height: 1.5 !important;">2</span> <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">每隔2U显式所有进E的资源占用情况</span><span style="color: #008000; line-height: 1.5 !important;"><br /></span>top -c <span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">每隔5U显式进E的资源占用情况Qƈ昄q程的命令行参数(默认只有q程?</span><span style="color: #008000; line-height: 1.5 !important;"><br /></span>top -p <font color="#800080">1111 </font>-p <span style="color: #800080; line-height: 1.5 !important;">6789</span><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">每隔5U显Cpid?111和pid?789的两个进E的资源占用情况</span><span style="color: #008000; line-height: 1.5 !important;"><br /></span>top -d <span style="color: #800080; line-height: 1.5 !important;">2</span> -c -p <font color="#800080">1111</font><span style="color: #008000; line-height: 1.5 !important;">//</span><span style="color: #008000; line-height: 1.5 !important;">每隔2U显Cpid?111的进E的资源使用情况Qƈ昑ּ该进E启动的命o行参?/span><font color="#333333" style="font-family: tahoma, 宋体; font-size: 13px; text-align: justify;">   </font><font color="#333333" style="font-family: tahoma, 宋体; font-size: 13px; text-align: justify;">     </font></pre></div></div></div><img src ="http://www.tkk7.com/zzzlyr/aggbug/433541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zzzlyr/" target="_blank">׃a</a> 2018-12-10 15:59 <a href="http://www.tkk7.com/zzzlyr/articles/433541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://cytanhuang.com" target="_blank">պһ</a>| <a href="http://ryhjled.com" target="_blank">ݺɫۺվɫ</a>| <a href="http://qulu999.com" target="_blank">ĻƵ</a>| <a href="http://16lds.com" target="_blank">޾Ʒa߹ۿ</a>| <a href="http://xianzznn.com" target="_blank">һ</a>| <a href="http://qzapp88.com" target="_blank">Ƶ</a>| <a href="http://srztw.com" target="_blank">ƬѸ߿</a>| <a href="http://kkxzz.com" target="_blank">78˾ƷӰ߲պƷӰһ </a>| <a href="http://hnmxld.com" target="_blank">gv޹gvո</a>| <a href="http://maopiandao163.com" target="_blank">պƷһůů</a>| <a href="http://zhnetbar.com" target="_blank">һд</a>| <a href="http://xingdagx.com" target="_blank">޾ƷԲ߹ۿ</a>| <a href="http://aqddv.com" target="_blank">Ƶѹۿ</a>| <a href="http://26uuyy.com" target="_blank">þùƷһ</a>| <a href="http://ri9999.com" target="_blank">պ˳վ</a>| <a href="http://15nw.com" target="_blank">ƷۺϾþĻ</a>| <a href="http://wogool.com" target="_blank">ëƬ18ŮëƬ96</a>| <a href="http://cebeke.com" target="_blank">þþþþӰԺþþþѾƷС˵</a>| <a href="http://323799.com" target="_blank">Ļ޳AƬ</a>| <a href="http://0359jgyy.com" target="_blank">޹þþþƷ</a>| <a href="http://qnyjny.com" target="_blank">ˬˬƵѿԿ</a>| <a href="http://yjszhukao.com" target="_blank">99ƷƵѹۿ</a>| <a href="http://cfxzp.com" target="_blank">һѵӰ</a>| <a href="http://kanzhelu23.com" target="_blank">Ļ޳AƬ</a>| <a href="http://www282pp.com" target="_blank">þþþþ޾Ʒ</a>| <a href="http://lhtjdj.com" target="_blank">߹ۿ</a>| <a href="http://leeszewan.com" target="_blank">99reþӾƷƵ</a>| <a href="http://shlamore.com" target="_blank">ëƬ벥</a>| <a href="http://yxjcgs.com" target="_blank">ƷһƵ</a>| <a href="http://010youhua.com" target="_blank">ɫվwwwͬ</a>| <a href="http://zz198.com" target="_blank">av볱߹ۿ </a>| <a href="http://dszb0099.com" target="_blank">AV볱߹ۿ </a>| <a href="http://rp71.com" target="_blank">޵һƷӰ</a>| <a href="http://doubaye.com" target="_blank">99ȳ˾ƷȾþ</a>| <a href="http://jgc528.com" target="_blank">Ʒѹһ</a>| <a href="http://sijep.com" target="_blank">ŷ˳ɾƷѹۿ</a>| <a href="http://haiwaizhuyun.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://mlhcd.com" target="_blank">һػɫѴƬƵ</a>| <a href="http://cc006.com" target="_blank">ƷƵ</a>| <a href="http://51jingpai.com" target="_blank">츾AVպ츾</a>| <a href="http://ksp33.com" target="_blank">91۲޾Ʒ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>