next

Netty进阶内部组件详解

℡╲_俬逩灬. 提交于 2020-10-05 14:25:07
Netty进阶 Bootstrap、ServerBootstrap Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中ServerBootstrap是服务端的启动引导类,Bootstrap是客户端引导类 常用方法 方法 说明 public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) 服务器端:设置两个EventLoopGroup public B channel(Class<? extends C> channelClass) 服务器端:设置通道的实现 public B option(ChannelOption option, T value) 服务器端:为Server Channel添加配置 public ServerBootstrap childOption(ChannelOption childOption, T value) 服务器端:给接收的通道添加配置 public ServerBootstrap childHandler(ChannelHandler childHandler) 服务器端:设置业务处理类型(自定义handler) public ChannelFuture

WebSocket node.js服务器

痴心易碎 提交于 2020-10-05 09:13:03
const Koa = require('koa') // 路由 const route = require('koa-route') const websockify = require('koa-websocket') const app = websockify(new Koa()); let ctxs = []; app.ws. use(async (ctx, next) => { ctxs.push(ctx) return next(ctx) }) .use(route.all('/echo', async (ctx) => { ctx.websocket.on('message', (message) => { console.log(`客户端数据:${message}`) for (let i = 0; i < ctxs.length; i++) { if(ctx == ctxs[i]) continue ctxs[i].websocket.send(message) } }) })) app.listen(3000, "127.0.0.1") 来源: oschina 链接: https://my.oschina.net/wwyywg/blog/4428556

为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

故事扮演 提交于 2020-10-05 07:07:21
B-树由来 定义:B-树是一类树,包括B-树、B+树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。B-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。 先来看看为什么会出现B-树这类数据结构。 传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。那么我们如何提高程序性能?减少磁盘 IO 次数,像 AVL 树,红黑树这类平衡二叉树从设计上无法“迎合”磁盘。 关于磁盘可参考 浅谈计算机中的存储模型(四)磁盘 上图是一颗简单的平衡二叉树,平衡二叉树是通过旋转来保持平衡的,而旋转是对整棵树的操作,若部分加载到内存中则无法完成旋转操作。其次平衡二叉树的高度相对较大为 log n(底数为2),这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),所以这类平衡二叉树在数据库和文件系统上的选择就被 pass 了。

学习go语言的第一天

偶尔善良 提交于 2020-10-05 06:49:08
Go语言的特点 1.无继承和多态 2.强一致性 3.接口不需要显式声明(Duck Typing) 4.无异常处理 5.基于首字母的可访问特性 6.不用的Import或变量会引起编译错误 7.完整且卓越的标准库包 Go语言的优势 1.易上手 2.效率高 3.出身名门(Google公司) 4.自由高效,支持并发编程,包括过程,面向对象,面向接口,函数式编程。 5.强大的标准库:互联网应用,系统编程和网络编程 6.部署方便:二进制文件,Copy部署 7.简单的并发:goroutines和通道(创新之处) 8.稳定性:提供了软件生命周期的各个环节的工具:如 go tool,go fmt,go test 核心特性 1.静态语言 2.天生并发 3.内置GC 4.安全 5.语法简单 6.编译快速 3.环境搭建: 下载地址: https://golang.google.cn/dl/ 安装步骤很简单 Next完事 4.安装开发工具 Goland以及配置 下载地址:https://download.jetbrains.com/go/goland-2019.2.3.exe 安装步骤也是一直Next 运行时遇到的问题: CreateProcess error=216, 该版本的 %1 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者。 解决方式:

HashMap 为什么会导致 CPU 100%?文章看不懂?来看这个视频吧!——面试突击 006 期

不想你离开。 提交于 2020-10-05 06:47:24
哈喽,大家好,我是老王,欢迎来到 Java 面试突击,我们今天来开始第 6 期的内容。 本期的问题是:HashMap 为什会导致 CPU 运行 100%?这是一个比较常见的经典问题了,但是有很多人读者朋友给我反馈,尼玛,看文章根本看不懂啊?Sun 公司都不知道这个问题的原因吧?不,是 Oracle 公司都不知道这个问题的原因吧?面试官怕也不知道这个的答案吧? 咳咳,作为一个很正经的面试官,我觉得这个问题一点都不重要,重要的是你不知道答案啊。好的,下一位面试者请进,您先回去等通知吧。 为了避免这种尴尬的事情发生,今天我们来好好聊一下这个问题,毕竟技能再手,才能吊打面试官不是? 正文 这个问题相关的知识点,有以下几个: H``` ashMap 的底层数据结构是什么? 什么是哈希碰撞?如何该解决这个问题? 什么是扩展因子?它有什么用? 还有对 HashMap 源码的理解,为什么 HashMap 会导致死循环? 视频版答案 视频内容如下: 图文答案 1.HashMap 的底层数据结构 先来说 HashMap 的底层数据结构,看过 HashMap 的源码我们就会发现,JDK 1.7 和 JDK 1.8 HashMap 的组成是不同的,JDK 1.7 HashMap 的组成是数组 + 链表的形式,而 JDK 1.8 新增了红黑树的数据结构,当 HashMap 中的链表长度大于 8 时

Spring Security 中如何让上级拥有下级的所有权限?

为君一笑 提交于 2020-10-05 06:18:29
本文基于当前 Spring Security 5.3.4 来分析,为什么要强调最新版呢?因为在在 5.0.11 版中,角色继承配置和现在不一样。旧版的方案我们现在不讨论了,直接来看当前最新版是怎么处理的。 1.角色继承案例 我们先来一个简单的权限案例。 创建一个 Spring Boot 项目,添加 Spring Security 依赖,并创建两个测试用户,如下: @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("javaboy") .password("{noop}123").roles("admin") .and() .withUser("江南一点雨") .password("{noop}123") .roles("user"); } 然后准备三个测试接口,如下: @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "hello"; } @GetMapping("/admin/hello") public String

跟高手学习LINUX笔记26--cobbler实践之从安装到应用

匆匆过客 提交于 2020-10-05 05:54:28
本教程精华是篇尾的KS配置文件,关于自动化安装KS应答文件往往是安装成功与否的关键,以下是本人常用网络安装KS配置信息,文件仍然在所在公司机房使用,纯实战干货: 1.1 cobbler简介   Cobbler--“补鞋匠”是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装、重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等。 Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),还提供了API接口,可以方便二次开发使用。 Cobbler是较早前的kickstart的升级版,优点是比较容易配置,还自带web界面比较易于管理。网间传说:如果说kickstart要求管理员是大专水平的话则Cobbler则只要求管理员初中水平,以此说明Cobbler的进步。 1.2 安装cobbler 1.2.1 环境说明 本机IP地址:192.168.101.171 关闭与禁用selinux、firewalld [root@node ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@node ~]# uname -r 3.10.0-957.5.1.el7.x86_64 [root@node ~]# getenforce Disabled

Spring Boot 2.x基础教程:使用集中式缓存Redis

◇◆丶佛笑我妖孽 提交于 2020-10-04 22:29:40
之前我们介绍了两种进程内缓存的用法,包括Spring Boot默认使用的 ConcurrentMap缓存 以及 缓存框架EhCache 。虽然EhCache已经能够适用很多应用场景,但是由于EhCache是进程内的缓存框架,在集群模式下时,各应用服务器之间的缓存都是独立的,因此在不同服务器的进程间会存在缓存不一致的情况。即使EhCache提供了集群环境下的缓存同步策略,但是同步依然是需要一定的时间,短暂的缓存不一致依然存在。 在一些要求高一致性(任何数据变化都能及时的被查询到)的系统和应用中,就不能再使用EhCache来解决了,这个时候使用集中式缓存就可以很好的解决缓存数据的一致性问题。接下来我们就来学习一下,如何在Spring Boot的缓存支持中使用Redis实现数据缓存。 动手试试 本篇的实现将基于 上一篇 的基础工程来进行。先来回顾下上一篇中的程序要素: User实体的定义 @Entity @Data @NoArgsConstructor public class User implements Serializable { @Id @GeneratedValue private Long id; private String name; private Integer age; public User(String name, Integer age) { this

【强化学习】python 实现 q-learning 例一

℡╲_俬逩灬. 提交于 2020-10-04 16:33:35
本文作者:hhh5460 本文地址: https://www.cnblogs.com/hhh5460/p/10134018.html 问题情境 -o---T # T 就是宝藏的位置, o 是探索者的位置 这一次我们会用 q-learning 的方法实现一个小例子,例子的环境是一个 一维世界 ,在世界的右边有宝藏,探索者只要得到宝藏尝到了甜头,然后以后就记住了得到宝藏的方法,这就是他用强化学习所学习到的行为。 Q-learning 是一种记录行为值 (Q value) 的方法,每种在一定状态的行为都会有一个值 Q(s, a),就是说 行为 a 在 s 状态的值是 Q(s, a)。s 在上面的探索者游戏中,就是 o 所在的地点了。而每一个地点探索者都能做出两个行为 left/right,这就是探索者的所有可行的 a 啦。 致谢:上面三段文字来自这里:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-general-rl/ 要解决这个问题,下面的几个事情要先搞清楚: 0.相关参数 epsilon = 0.9 # 贪婪度 greedy alpha = 0.1 # 学习率 gamma = 0.8 # 奖励递减值 1.状态集 探索者的状态,即其可到达的位置,有6个。所以定义

浅析python迭代器和生成器

六月ゝ 毕业季﹏ 提交于 2020-10-04 11:56:56
可迭代对象 概念 一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么这个对象就是可迭代对象 常见的可迭代对象 集合或序列类型(如list、tuple、set、dict、str)或文件对象 在类中定义了__iter__()方法的对象,可以被认为是 Iterable对象,但自定义的可迭代对象要能在for循环中正确使用,就需要保证__iter__()实现必须是正确的 在类中实现了如果只实现__getitem__()的对象可以通过iter()函数转化成迭代器但其本身不是可迭代对象。所以当一个对象能够在for循环中运行,但不一定是Iterable对象。 针对第一点可以使用print(isinstance([], Iterable)) 进行校验,返回True则是可迭代对象。 关于第二点我们可以通过print(hasattr([], "__iter__"))返回True知道内部实现了__iter__方法,但是这里我们需要注意的是要想被for循环遍历,能够被内置的iter()函数调用并转化成Iterator对象(如下代码所示) from collections import Iterable class IterObj: def __iter__(self): return self print(isinstance([], Iterable)) it =