键值

Redis5的集群搭建

一个人想着一个人 提交于 2019-11-29 23:47:53
说道Redis,自然少不了集群。真实生产环境,一般使用都是集群,以应对巨大的缓存数据量。Java分布式技术体系中,使用集群的框架非常之多,但是往往在集群中的节点之间是互相同步数据的,也就是无论应用调用到哪个节点,产生的效果都是一样的。尤其是在我了解服务注册类框架的时候,节点之间的一致性更是硬性要求。 Redis集群给我印象较深的就是节点之间的数据是完全不需要同步的。首先来讲,集群没有Leader,之间的关系互相平等。那Redis集群是怎么存储数据的呢? 我们都知道Redis的数据格式都是key-value,类似于Java中的HashMap。不错,和HashMap的结构类似,Redis集群同样是用key生成出的Hash值来决定保存key-value这对键值的位置。 Redis集群的结构中共有哈希槽16384个,例如集群有三个节点,那这三个节点分配到的哈希槽分别为: node1: 0-5500, node2:5501-11000, node3:11001-16383。 也就是说当保存一对键值的时候,会根据key生成出来的值分配到这三个当中的一个。那么不免会有疑问当键值被保存到node2的情况下,但是我的应用只连接到node1,这个时候怎么处理呢? 应用使用key来获取value的时候,同样使用key来得到键值保存的位置,发现在node2节点后,会跳转到node2,

b树与b+树

亡梦爱人 提交于 2019-11-29 23:46:34
https://blog.csdn.net/z_ryan/article/details/79685072 https://blog.csdn.net/qq_26222859/article/details/80631121 1.b树 1.根结点至少有两个子女。 2.每个中间节点都包含k-1个元素和k个孩子,其中 ceil(m/2) ≤ k ≤ m 3.每一个叶子节点都包含k-1个元素,其中 ceil(m/2) ≤ k ≤ m 4.所有的叶子结点都位于同一层。 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分 6.每个结点的结构为:(n,A0,K1,A1,K2,A2,… ,Kn,An) 其中,Ki(1≤i≤n)为关键字,且Ki<Ki+1(1≤i≤n-1)。 Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki+1。 n为结点中关键字的个数,满足ceil(m/2)-1≤n≤m-1。 b树中每个节点都包含卫星数据(索引元素所指向的数据记录),每个节点中每个元素都 包含一个指针 指向卫星数据,浪费空间。 2.b+树 1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据 都保存在叶子节点。 2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针

Redis简介以及命令操作

青春壹個敷衍的年華 提交于 2019-11-29 23:19:23
Redis简介 什么是Redis Redis是用C语言开发的一个开源的高性能键值对 key-value 数据库,官方提供测试数据, 50 个并发执行 100000 个请求,读的速度是 110000次/s ,写的速度是 81000次/s ,且 Redis 通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止 Redis 支持的键值数据类型如下: 1) 字符串类型 string 2) 哈希类型 hash : map格式 3) 列表类型 list : linkedlist格式。支持重复元素 4) 集合类型 set : 不允许重复元素 5) 有序集合类型 sortedset:不允许重复元素,且元素有 Redis的应用场景 缓存(数据查询、短连接、新闻内容、商品内容等等) 聊天室的在线好友列表 任务队列。(秒杀、抢购、12306等等) 应用排行榜 网站访问统计 数据过期处理(可以精确到毫秒 分布式集群架构中的session分离 Nosql NoSQL(NoSQL = Not Only SQL) ,意即“不仅仅是 SQL ‘’,是一项全新的数据库理念,泛指非关系型的数据库。 主流的Nosql数据库: 键值 (Key-Value) 存储数据库 相关产品: Tokyo Cabinet / Tyrant 、 Redis 、 Voldemort 、 Berkeley DB 典型应用: 内容缓存

AVL树的插入与删除操作

坚强是说给别人听的谎言 提交于 2019-11-29 21:09:43
AVL树是一种较老的数据结构,它的出现是为了解决了二叉查找树在最坏情况下的插入结果。 二叉查找树(以下称为二叉树)如果能以较好的插入序列来创建,使得树的结构趋于平衡,则其大部分操作都可以O(logN)的复杂度实现。但如果以类似{1,2,3,4,5,6,.....}这种已序序列来进行插入,那么形成的二叉树将是极不平衡的,甚至有可能只有左子树或只有右子树,这样的二叉树与链表是没有太大区别的,各种操作的复杂度也将升至O(N)这种无法接受的线性复杂度。 如果可以为二叉树设置一种限定条件,使得对于每个根节点,其左子树与右子树的高度差在一个可以接受的范围内(实现中为1),那么二叉树的平衡性就可以保证,以上就是AVL树的原始的设计理念。 由此引发了两个问题:1.我们怎样才能够随时获取每个节点的高度来作为是否平衡的信息呢? 2. 我们如何调整树的结构(实际上是对指针的调整)来使得树从不平衡变为平衡? 问题1有两种解决方案,一种是设计一个函数,其接受一个节点参数,返回此节点的高度。这种函数式的思想是自然而然的,由于此函数可以使用递归实现,其编程复杂度也不高。但是,如果树的高度足够高,在同一时间,我们为了一个简单信息,有可能在在同一时间内,造成大量函数栈在内存中堆叠。越是庞大的二叉树,这种方式的成本就越高,有点得不偿失。 另一种解决方案是,为每一个节点,保存其高度信息,并在插入

数据类型及内置方法2

僤鯓⒐⒋嵵緔 提交于 2019-11-29 19:33:08
一、元组 作用:能够存储多个元素,元素与元素之间逗号隔开。元组可以是任意类型,元组不能被修改。 定义 t = (1, 2, 3, 'a', [1, 2, 3]) t = tuple((1, 2, 3)) t = tuple((1,)) # 内部只有一个元素的时候,也要加逗号。 print(type(t)) 有序or无序 有序 可变or不可变 不可变 常用操作和内置方法 按索引取值(只能取不能存) t = (1, 2, [3, 4]) print(t[0] # 1 t[-1][1] = 5 print(t) # (1, 2, [3, 5]) # 包含的可变类型能改 切片(顾头不顾尾,步长) t = (1, 2, 3, 4) print(t[::2]) # (1, 3) 长度 t = (1, 2, 3, 4) print(len(t)) # 4 成员运算 t = (1, 2, 3) print(1 in t) # True 循环 t = (1, 2, 3) for i in t: print(i) 计数 t = (1, 1, 3) print(t.count(1)) # 2 查询索引 t = (1, 2, 3) print(t.index(2)) # 1 二、字典 作用:能存储多组键值对,key是不可变类型,value可以是任意类型 有序or无序 无序 可变or不可变 可变 定义 d

Java8新特性 Stream流式思想(二)

為{幸葍}努か 提交于 2019-11-29 19:24:08
如何获取Stream流 刚开始写博客,有一些不到位的地方,还请各位论坛大佬见谅,谢谢! package cn.com.zq.demo01.Stream.test01.Stream; import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper; import java.io.Serializable; import java.util.*; import java.util.stream.Stream; /* * java.util.stream.Stream<T> 是Java8新加入的流式接口 * 获取一个流非常简单 ,主要有以下几种方式 : * 1、所有的Collection集合都可以通过调用 默认方式 stream() 获取Stream流。 * 2、获取数组对应的流,使用 Stream接口的静态方法 of() 进行获取即可。 * 3、那Map集合呢? 他不是Collection接口的子接口。这里我们可以采用以下两种方式 : * 分别通过Map集合的 keySet()方法 、values()方法获取到Map集合对象的Stream流。 * 或者就是通过Map集合的entrySet方法获取到Map集合的键值对,直接将键值对转换为Stream流即可。 * */ public class

PHP数组基础知识总结以及排序

不打扰是莪最后的温柔 提交于 2019-11-29 17:18:34
最近刚刚实习,经常用到php的数组,所以总结一下,以后不用随时去乱搜。 一:基础知识 PHP支持数字索引数组和关联数组,关联数组允许使用更有意义的数据(如字符串)作为索引。以及允许间隔性地使用数组和字符串作为数组的索引。 1、数组定义: $arr = [1,2,3,4];//数字索引数组 php5.4以上提供的新方式 $arr = ['a'=>1,'b'=>2];//关联索引数组 $arr = array(1,2,3,4); $arr = array('a'=>1,'b'=>2); $arr = range(1,n);//自动创建1~n的数字数组 PHP的数组不需要预先初始化或创建,在第一次使用时就会自动的创建如: $arr['a'] = 1; $arr['b'] = 2; $arr['c'] = 3; 2、数组的遍历 for循环 只能用于有序的数字索引数组 for($i = 0;$i<count($arr);$i++){ echo $arr[$i]; } foreach for($arr as $key=>$value){ echo $key."--".$value; } each while($ele = each($arr)){ echo ele['key']."--".ele['value']; } list(常用) reset($arr);//重置指针 while

Hadoop系列之四:MapReduce进阶

放肆的年华 提交于 2019-11-29 17:16:50
1、mapper和reducer MapReduce对数据的处理分为两个阶段:map阶段和reduce阶段,这两个阶段分别由用户开发的map函数和reduce函数完成,在MapReduce运行环境中运行时,它们也分别被称为mapper和reducer。 键值对 (key-value pair)是MapReduce的基础数据结构,mapper和reducer读入和输出的数据均为键值对。MapReduce中,“键”和“值”可以是基础类型数据,如整数、浮点数、字符串或未经加工的字节数据,也可以是任意形式的复杂数据类型。程序员可以自行定义所需的数据类型,也可借助于Protocol Buffer、Thrift或Avro提供的便捷方式完成此类工作。 MapReduce算法设计的工作之一就是在给定数据集上定义“键-值”数据结构,比如在搜索引擎搜集、存储网页类工作中,key可以使用URL来表示,而value则是网页的内容。而在有些算法中,Key也可以是没有任何实际意义的数据,其在数据处理过程中可被安全忽略。在MapReduce中,程序员需要基于如下方式定义mapper和reducer: map: (k1,v1)-->[(k2,v2)] reduce: (k2,[v2])-->[(k3,v3)] 其中[...]表示其可能是一个列表。这些传递给MapReduce进行处理的数据可以存储于分布式文件系统上

进程间通信

让人想犯罪 __ 提交于 2019-11-29 12:20:45
消息队列 key_t ftok(char* pathname,char proj) //获得键值 返回文件名对应的键值。 pathname:文件名、路径 proj:项目名,不为0即可 int msgget(key_t key,int msgflg) //获取消息队列描述字 key:键值,通过ftok获得 msgflg:标志位 IPC_CREAT,IPC_EXCL,IPC_NOWAIT 例如 IPC_CREAT|0666; 返回与键值对应的消息队列描述字 int msgsnd(int msgid,struct msgbuf* msgp, int msgsz ,int msgflg) //向消息队列中发送一条消息 msqid 已打开的消息队列id msgp 存放消息的结构 struct msgbuf { long mtype; //消息类型,可以为int char mtext[1]; /消息数据的首地址,不一定是mtext[1] , } msgsz 消息数据长度 msgflg IPC_NOWAIT,当消息队列不够空间放要发送的消息时,指明msgsnd是否等待。 消息收发的类型要一样 int msgrcv(int msqid,struct msgbuf*msgp,int msgsz,long msgtyp,int msgflg) /

最大堆和最小堆基本概念

早过忘川 提交于 2019-11-29 11:20:53
堆和栈的区别: 一、堆栈空间分配区别:   1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;   2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 二、堆栈缓存方式区别:   1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;   2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。    三、堆栈数据结构区别:   堆(数据结构):堆可以被看成是一棵树,如:堆排序;   栈(数据结构):一种先进后出的数据结构。 最大堆和最小堆是二叉堆的两种形式。 最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。 最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。 堆树的定义如下 : (1)堆树是一颗完全二叉树; (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值; (3)堆树中每个节点的子树都是堆树。 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆。如下图所示,左边为最大堆,右边为最小堆。 具体代码实现参考以下链接: