哈希

HashMap?

…衆ロ難τιáo~ 提交于 2020-02-27 19:08:42
HashMap数据结构是什么? JDK1.7 HashMap由数组+链表组成的,JDK1.8 HashMap由数组+链表+红黑树组成的 数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。 =============================================================================== key-value是通过什么方式存储进去的? key使用set集合来存储的,value使用collection来存储的。 =============================================================================== 解释hashcode、取余、去重等操作? 计算hashcode的值: //这是一个神奇的函数,用了很多的异或,移位等运算

ZhaoWei-2020-01-18

别等时光非礼了梦想. 提交于 2020-02-27 18:34:33
Redis官方文档 简介 Redis是开源的(BSD许可)内存 数据结构存储 ,用作数据库,缓存和消息代理。它支持数据结构,例如 字符串 , 哈希 , 列表 , 集合 ,带范围查询的 排序集合 , 位图 , 超日志 ,带有半径查询的 流 空间索引 和 流 。Redis具有内置的 复制 , Lua脚本 , LRU逐出 , 事务 和不同级别的 磁盘持久性 ,并通过以下方式提供高可用性 Redis Sentinel 和 Redis Cluster 自动分区。 您可以 对这些类型运行 原子操作 ,例如 追加到字符串 ; 在哈希中增加值 ; 将元素推送到列表 ; 计算集的交集 , 并集 和 差 ; 或 获得排序集中排名最高的成员 。 为了获得出色的性能,Redis使用 内存中的数据集 。根据您的用例,您可以通过 将数据集 偶尔 转储到磁盘上 ,或者通过 将每个命令附加到log 来持久化它。如果只需要功能丰富的网络内存缓存,则可以选择禁用持久性。 Redis还支持琐碎的设置 主从异步复制 ,具有非常快速的非阻塞式第一次同步,自动重新连接以及网络拆分中的部分重新同步。 开发语言 现在我们都用高级语言来编程,比如Java、python等。也许你会觉得C语言很古老,但是它真的很有用,毕竟unix系统就是用C实现的,所以C语言是非常贴近操作系统的语言。Redis就是用C语言开发的,所以执行会比较快。

2020PHP面试-Redis篇

匆匆过客 提交于 2020-02-26 23:48:23
一、Redis 数据类型 1. string 字符型。 2.hash hash 结构化的对象。 key不可重复 3.list 队列 lpush rpop lpop rpush 4. set 集合 value不可重复 5. zset 有序集合 set的基础上加了分数(排序)。 二、Redis事务 1.multi (事务启动) 、 exec (事务执行) 、 watch(监视某几个键有没有被别的客户端进行修改,一旦有任何的键被修改过,exec的时候都会直接返回一个nil,不执行事务)、discard(立刻取消事务,清空事务队列中所有命令)。 2.redis数据库里会存在一个watched_keys字典,这个字典里 key为被监视的key,值为一个链表,链表里记录着监视该key的客户端,一旦被监视的key发生了修改,该key对应的客户端会打开REDIS_DIRTY_CAS标识,代表该客户端的事务安全性被破坏了。这就是watch命令的实现。 3.为什么redis的事务不支持回滚?   因为这种复杂的功能和redis的设计理念不符。并且redis事务中出错原因通常是编程错误,只在开发环境出现,生产环境可避免。 4.redis事务中命令执行出错的结果?   redis并不会中断事务的执行,会继续执行后续的操作命令。exec的时候,出错的命令会被标识出来,并给出原因。 5.

数据结构和对应的集合

試著忘記壹切 提交于 2020-02-26 22:18:11
栈结构和队列结构 栈: 先进后出。 队列: 先进先出。 6.数组和链表 数组: 在内存中是一片连续的空间。 查询快,增删慢。 查询快:因为可以通过数组的地址值和索引直接定位到某个元素。 增删慢:因为数组不可变,每次要添加或者删除都要创建一个新的数组。 把老数组中的元素赋值给新数组。 链表: 是多个节点组成的。 每一个节点都是单独new出来的对象,在内存中链表不是一个连续的空间。 是通过互相记录地址值实现的。 单向链表: 前一个记录后一个地址值。 但是后一个不会记录前一个地址值。 双向链表 也是由节点组成的。 前一个记录后一个地址值。 后一个也会记录前一个。 7.ArrayList 和 LinkedList ArrayList : 底层是一个数组。 特点:查询快,增删慢 LinkedList : 底层是一个双向链表。 特点:查询慢,增删快 总结: ArrayList 和 LinkedList 基本使用是一模一样的。 增 删 改 查,所写代码几乎一样。 但是在底层数据结构是不一样的。 8.LinkedList void addFirst(E e) 向集合中第一个位置添加元素 void addLast(E e) 向集合中最后一个位置添加元素 E getFirst() 获取集合中第一个元素 E getLast() 获取集合中最后一个元素 E removeFirst() 删除集合中第一个元素

部署Memcache服务

旧城冷巷雨未停 提交于 2020-02-25 15:26:17
博文结构 Memcache简介 Memcache工作流程 Memcache调度算法 Memcache实现原理 安装Memcache 一.Memcache简介 Memcache是一套自由、开源、高性能、分布式的高速缓存系统。由于Memcache通过在内存中缓存数据和对象来减少读取数据库的次数。目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。 memcache是一套分布式的高速缓存系统,可以提高网站访问的速度,尤其是对于一些大型的公司或者频繁访问数据库的网站访问速度提升效果十分显著,memecache是一个开源免费的软件,memcache通过键值对的方式将数据缓存在内存当中,减少从后端数据库读取数据的次数。 二.Memcache工作流程 MemCache 虽然被称为”分布式缓存”,但是 MemCache 本身完全不具备 分布式的功能,MemCache 集群之间不会相互通信(与之形成对比的,比如 JBoss Cache,某 台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据),所谓的” 分布式”,完全依赖于客户端程序的实现,就像上面这张图的流程一样。 同时基于这张图,理一下 MemCache 一次写缓存的流程: (1)应用程序输入需要写入缓存的数据; (2)API将Key输入路由算法模块

一致性哈希

夙愿已清 提交于 2020-02-24 21:36:40
一致性哈希是指分布式系统做负载均衡策略时的一种算法。 前言:本身负载均衡策略有一种模式是通过hash算法,将一些固定请求映射到固定某台服务器上。这样有个弊端就是,如果某台服务器挂了,或者新增机器的时候,这种用户id与服务器的hash关系就会大量失效。 一致性哈希的出现主要是为了解决此场景。 原理:1.将所有服务器的ip地址首先计算出来,从0-最大正整数之间形成一个闭环。    2.用户请求时,将用户的ip hash值计算出来后,看离着闭环上的哪台服务器的节点最近,就由那台服务器去处理请求。    3.特性:单调性、分散性、平衡性。 扩展:1. 虚拟节点,为了降低分散性,节约成本(加机器成本太高)。    2. 均匀一致性哈希: 使每台服务器尽量负载均衡。 以上只为小叙,详情参考大佬文章: https://www.jianshu.com/p/e968c081f563   来源: https://www.cnblogs.com/camouflage/p/12358677.html

Redis学习笔记(六)—— Redis Cluster(上)

ぃ、小莉子 提交于 2020-02-24 21:17:22
六. 集群——第一部分 参考视频:https://coding.imooc.com/class/151.html 笔记 下载地址 欢迎star、fork、follow素质三连 6.1 数据分布 单机情况下,对一份特别大的全量数据无法全部保存,只能使用集群模式,将全量数据按照一定规则分配到各个节点上。常用的分区有两个方式: 顺序分区 哈希分区 对比 : 分布方式 特点 典型产品 顺序分布 1. 数据分散度容易倾斜 2. 键值业务相关 3. 可顺序访问 4. 支持批量操作 1. BigTable 2. HBase 哈希分布 1. 数据分散度高 2. 键值分布和业务无关 3. 无法顺序访问 4. 不支持批量操作 1. 一致性哈希Memcache 2. Redis Cluster 3. 其他缓存产品 6.2 哈希分布 6.2.1 节点取余 节点取余分区(客户端分片)是最简单的哈希分布: hash(key) % nodes ,但是它存在最大的问题是:数据扩容时,可能导致大规模数据发生搬迁。可以使用 多倍扩容方式 降低数据大规模搬迁(大约有50%的数据会搬迁)。 大规模数据迁移带来最直接的问题时:迁移完成后第一次访问会导致部分数据缓存失效,需要直接到数据库中重新查找数据,并回显给redis缓存,之后再次访问数据时,缓存数据才有效。 对于依靠缓存支撑的系统而言,节点取余法是不能接受的

data type

允我心安 提交于 2020-02-24 17:34:40
# Begin print(123,456,789, end="\n", sep="*") #123*456*789 lst = ['jay','jj'] for i,j in enumerate(lst,2): print(i,j) a = 18 a = format(a,'06') print(a) #000018 print((1 or (2 and 3>4))) lst = [1,2,3,4,5,6,7] for i in range(len(lst)): print(lst[i]) lst = [1,2,3,[1]] lst1 = lst.copy() #id不同 内层元素操作共享 lst1[-1].append(2) print(id(lst1)) print(id(lst)) print(lst,lst1) #[1, 2, 3, [1, 2]] [1, 2, 3, [1, 2]] python 是解释性语言 逐行的解释执行 编译型: 代码想执行,必须先经过编译.用户拿着着编译的结果取运行 执行效率高 开发效率较低 *输入输出 print(12,34,56,end='',sep='*') input() <input type='text'> 变量: 把一个数据暂时存储在内存中,方便后面的程序使用. 命名规范: 1 数字字母下划线 2 不能纯数字,不能字母开头 3

三大主流负载均衡软件对比(LVS+Nginx+HAproxy)

风流意气都作罢 提交于 2020-02-23 20:53:00
LVS: 优点 : 1、抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低 2、工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。 3、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived) 4、应用范围比较广,可以对所有应用做负载均衡; 5、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接) 缺点: 1、不支持正则处理,不能做动静分离。 2、配置 复杂,对网络依赖比较大,稳定性很高。 Ngnix: 优点: 1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构; 2、Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能; 3、Nginx安装和配置比较简单,测试起来比较方便; 4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发; 5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。 6、Nginx对请求的异步处理可以帮助节点服务器减轻负载; 7、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。 8、不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好, 9

北京大学肖臻老师《区块链技术与应用》公开课笔记9——BTC脚本篇

孤人 提交于 2020-02-19 13:53:04
北京大学肖臻老师《区块链技术与应用》公开课笔记 比特币脚本篇,对应肖老师视频:https://www.bilibili.com/video/av37065233?p=9 全系列笔记请见:https://blog.csdn.net/Mu_Xiaoye/article/details/104299664 之前文中有提及,比特币交易验证其合法性依赖于脚本进行,本篇便专门写比特币系统中的脚本语言。 另:某些图片右下角出现马赛克是由于文章先发布于牛客平台,而该平台有防盗链机制,故截图时在不影响观看的情况下对水印进行了马赛克处理(这部分图忘记保存了,再制一次图太麻烦了),不涉及抄袭。在牛客平台,该文也是公开的,请进入导航页,里面有相关链接,可以查看到其中对应图片右下角是没有马赛克的。 提醒:多图预警,本篇许多内容解释都在图中标识了出来。流量党请慎重进入!!! 交易实例: 比特币系统中使用的脚本语言非常简单,唯一可以访问的内存空间只有栈,所以也被称为“基于栈的语言” 交易的宏观信息: Vin的内容: 如果存在 一个交易有多个输入,那么每个输入都要说明币的来源并给出签名(BTC中一个交易可能需要多个签名) Vout的内容: 输入输出脚本的执行 如图所示,为脚本执行流程。在早期,直接将两个脚本按照如图顺序(input script在前,output script在后) 拼接后执行