node

redis主动向页面push数据

人盡茶涼 提交于 2019-12-22 14:09:59
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 对于页面上定时刷新显示的数据,之前一直都是比较“传统”的思想——那就是“页面通过ajax请求后台,后台响应后把数据返回给前台展示,如此反复……”,而自己也从来没有过“服务端主动向页面推送数据”的概念。 现在需要用到redis的发布/订阅,页面“订阅”某一channel,服务端在某一channel“发布”内容。服务端发布后,客户端可以通过订阅实时将刚刚发布的内容展示出来。 说说我探索的解决过程吧。。从用tomcat的WebSocketServlet,但发现已经不推荐使用( 废弃 ) 了,加上它必须依赖tomcat,并且前台订阅的逻辑也难以表达,所以不行;后来又想到用javax.websocket-api.jar的@ServerEndpoint,但是,还是卡住了。。因为也是难以体现redis的发布/订阅功能。 后来一直苦于用何种解决方案,这时,socket.io+redis+node.js实时聊天的例子让我眼前一亮。。 好了,说说我对nodejs的理解—— Node是一个Javascript运行环境(runtime),就是Js的服务器,类似tomcat或weblogic是java代码的运行服务器一样。。安装nodejs之后,最新版已经带了npm,而npm是用于安装各种支持nodejs扩展的客户端的

nodejs 安装mysql、socket.io 插件

萝らか妹 提交于 2019-12-22 14:02:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 使用cmd窗口命令,代码如下: cd c:\Program Files (x86)\nodejs //进入nodejs 安装目录中nodejs目录下 执行命令行: c:\Program Files (x86)\nodejs\npm install mysql //安装mysql插件 c:\Program Files (x86)\nodejs\npm install socket.io //安装socket.io 插件 .... Socket.IO是一个WebSocket库,包括了客户端的js和服务器端的nodejs; socket.io的目标是构建可以在不同浏览器和移动设备上使用的实时应用。 socket.io 会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5,可以满足大部分需求。 一 使用方法 io.sockets.on函数 io.sockets.on 函数 接受字符串"connection"作为客户端发起连接的事件,当连接成功后,调用带有socket参数的回调函数。我们在使用socket.IO的时候,基本上都在这个回调函数里面处理用户的请求。示例代码; 服务器端 io.sockets.on(

多线程5一AbstractQueuedSynchronizer源码分析一

走远了吗. 提交于 2019-12-22 09:28:15
AQS的源码分析 <一> 文章目录 前言 1、什么是CAS ? 2、同步器类结构 3、CLH同步队列 4、AQS中静态内部类Node 5、方法分析 5.1、acquire(int arg ) 5.2、release(int arg) 释放锁 6、总结 前言 在多线程环境下,我们一般会对临界区资源(共享资源)进行加锁,释放锁,保证同一时刻最多只有一个线程(独占模式),就如去公共厕所里,在使用一个小房间时会加锁避免自己在使用的时候,别人突然闯进来一样,引起不必要的麻烦,在使用完后,再打开锁,其他人才可使用;还有生产者消费者模型中,线程之间要同步,需要等待和通知机制,来协调线程合作。那么这些是这么实现的?如可重入锁ReentrantLock, 读写锁ReadWriteLock, 信号量 Semaphore, 计数器CountDownLatch,这些都会涉及线程之间的协调同步,那么会有一个抽象的结构,将这些需要共用的功能抽离出来,统一来满足要求吗?我们一起来看看AbstractQueuedSynchronizer 这个抽象类,如何来实现这些功能和其设计的巧妙, 我们能看到Doug lea 大佬在很多地方使用的循环CAS操作(自旋锁)。 1、什么是CAS ? CAS 即 compare and swap 比较并交换, 涉及到三个参数,内存值V, 预期值A, 要修改的新值B,

《数据结构 - 线性表》链式存储 双向链表

好久不见. 提交于 2019-12-22 06:23:27
一:双向链表定义   - 在单链表的每个节点中,在设置一个指向前驱节点的指针域   - 所以在 双向链表结点都有两个指针域 , 一个 指向 前驱 位置, 一个 指向 后驱 位置。   - 双向链表 也叫 双面链表 。每个节点有两个链接:一个指向前一个节点, 当此节点为第一个节点时,指向空值 ;而另一个指向下一个节点, 当此节点为最后一个节点时,指向空值 。 二:双链和单链的区别   - 相同     - 由于双向链表是从单向链表衍生出来的,所以在 计算链表长度/查找元素位置/查找元素中,都只需要涉及一个方向的指针就可以,在这方面,他们是相同的。   - 不同     - 由于多了一个指针域,所以在 掺入/删除 时候,都要修改两个指针变量。 三:双向链表 <?php /** * 线性表,双向链表 * 特点: * 1:所以在双向链表结点都有两个指针域,一个指向前驱位置,一个指向后驱位置。 * 2:双向链表也叫双面链表。 * 3:每个结点有两个链接: * 一个指向前一个结点,当此节点为第一个节点时,指向空值; * 一个指向下一个节点,当此节点为最后一个节点时,指向空值。 */ class DoubleLinkList { public $headNode; //头结点 public function __construct() { $this->initLink(); } public

java实现单链表常见操作

こ雲淡風輕ζ 提交于 2019-12-22 05:33:37
一、概述:    本文主要总结单链表常见操作的实现,包括链表结点添加、删除;链表正向遍历和反向遍历、链表排序、判断链表是否有环、是否相交、获取某一结点等。 二、概念: 链表:    一种重要的数据结构,HashMap等集合的底层结构都是链表结构。链表以结点作为存储单元,这些存储单元可以是不连续的。每个结点由两部分组成:存储的数值+前序结点和后序结点的指针。即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作。 单链表结构: Java中单链表采用Node实体类类标识,其中data为存储的数据,next为下一个节点的指针: package com.algorithm.link; /** * 链表结点的实体类 * @author bjh * */ public class Node { Node next = null;//下一个结点 int data;//结点数据 public Node(int data){ this.data = data; } } 三、链表常见操作: package com.algorithm.link; import java.util.Hashtable; /** * 单链表常见算法 * @author bjh * */ public class MyLinkedList { /**链表的头结点*/

数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

不打扰是莪最后的温柔 提交于 2019-12-22 05:32:25
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构图文解析之:树的简介及二叉排序树C++模板实现. 数据结构图文解析之:AVL树详解及C++模板实现 数据结构图文解析之:二叉堆详解及C++模板实现 1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的 有限序列 。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。 数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种 相同 的抽象数据类型。可以是C语言的内置类型或结构体,也可以是C++自定义类型。 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界。C语言中定义一个数组: 数组下标是从0开始的,a[0]对应第一个元素。其中,a[0]称为数组a的下界,a[6]称为数组a的上届。超过这个范围的下标使用数组,将造成 数组越界错误 。 数组的特点是: 数据连续,支持快速随机访问。 数组分为固定数组与动态数组。其中固定数组的大小必须在编译时就能够确认,动态数组允许在运行时申请数组内存。复杂点的数组是多维数组

队列的图文解析 和 对应3种语言的实现(C/C++/Java)

一世执手 提交于 2019-12-22 05:31:57
概要 本章和介绍" 栈 "时的流程一样,先对队列进行介绍,然后分别给出队列的C、C++和Java三种语言的实现。内容包括: 1. 队列的介绍 2. 队列的C实现 3. 队列的C++实现 4. 队列的Java实现 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3562279.html 更多内容: 数据结构与算法系列 目录 队列的介绍 队列(Queue),是一种线性存储结构。它有以下几个特点: (01) 队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的。 (02) 队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。 队列通常包括的两种操作: 入队列 和 出队列 。 1. 队列的示意图 队列中有10,20,30共3个数据。 2. 出队列 出队列前 :队首是10,队尾是30。 出队列后 :出队列(队首)之后。队首是20,队尾是30。 3. 入队列 入队列前 :队首是20,队尾是30。 入队列后 :40入队列(队尾)之后。队首是20,队尾是40。 下面介绍队列的实现,分别介绍C/C++/Java三种实现 队列的C实现 共介绍4种C语言实现。 1. C语言实现一:数组实现的队列,并且只能存储int数据。 2. C语言实现二:单向链表实现的队列,并且只能存储int数据。 3. C语言实现三

栈的图文解析 和 对应3种语言的实现(C/C++/Java)

限于喜欢 提交于 2019-12-22 05:31:39
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例。注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈。内容包括: 1. 栈的介绍 2. 栈的C实现 3. 栈的C++实现 4. 栈的Java实现 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3562239.html 更多内容: 数据结构与算法系列 目录 栈的介绍 栈(stack),是一种线性存储结构,它有以下几个特点: (01) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。 (02) 向栈中添加/删除数据时,只能从栈顶进行操作。 栈通常包括的三种操作: push 、 peek 、 pop 。 push -- 向栈中添加元素。 peek -- 返回栈顶元素。 pop -- 返回并删除栈顶元素的操作。 1. 栈的示意图 栈中的数据依次是 30 --> 20 --> 10 2. 出栈 出栈前 :栈顶元素是30。此时,栈中的元素依次是 30 --> 20 --> 10 出栈后 :30出栈之后,栈顶元素变成20。此时,栈中的元素依次是 20 --> 10 3. 入栈 入栈前 :栈顶元素是20。此时,栈中的元素依次是 20 --> 10 入栈后 :40入栈之后,栈顶元素变成40。此时,栈中的元素依次是

单台Linux服务器实现Redis群集

柔情痞子 提交于 2019-12-22 04:20:14
一、Redis简介 Redis是目前大规模使用的缓存中间件,由于它强大、高效、便捷的功能,得到了广泛的使用。 Redis在2015年发布了3.0.0,官方就已经支持了redis cluster。redis cluster在设计的时候,就考虑到了去中心化、去中间件。也就是说,集群中的每个节点都是平等的关系,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需连接集群中的任意一个节点,就可以获取到其他节点的数据。 二、Redis集群介绍 Redis集群是一个可以在多个Redis节点之间进行数据共享的设施。Redis集群不支持那些需要同时处理多个键的redis命令,因为执行这些命令需要在多个节点之间移动数据,并且在高负载的情况下,这些命令将降低redis集群的性能,并导致不可预测的行为。 Redis集群通过分区来提供一定程度的可用性,即使集群中一部分节点失效或者无法通信,集群也可以继续处理命令请求。 三、Redis集群原理 Redis是如何合理发呢配这些节点和数据的? Redis并没有采用传统的一致性哈希来分配数据,而是采用了另一种叫做哈希槽的方式分配的。Redis cluster默认分配了16384个slot,当我们set一个key时,会采用CRC16算法(循环冗余校验码)来获取所属的slot

链表相关编程题总结

回眸只為那壹抹淺笑 提交于 2019-12-22 03:29:38
1、复制带随机指针的链表 class Solution(object): def copyRandomList(self, head): """ :type head: Node :rtype: Node """ if head is None: return None p = head while p: node = Node(x=p.val, next=p.next) p.next = node p = p.next.next p = head while p: if p.random: p.next.random = p.random.next else: p.next.random = None p = p.next.next p = head.next head = p while p.next: p.next = p.next.next p = p.next return head 来源: https://www.cnblogs.com/weswes/p/12078923.html