哈希

Redis Hash哈希(2)

断了今生、忘了曾经 提交于 2020-03-12 01:54:58
存储类型 包含键值对的无序散列表。value只能是字符串,不能嵌套其他类型。 同样是存储字符串,Hash与String的主要区别? 1、把所有相关的值聚集到一个key中,节省内存空间 2、只使用一个key,减少key冲突 3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU的消耗 Hash不适合的场景: 1、Field不能单独设置过期时间 2、没有bit操作 3、需要考虑数据量分布的问题(value值非常大的时候,无法分布到多个节点) 存储(实现)原理 Redis的Hash本身也是一个KV的结构,类似于Java中的HashMap。 外层的哈希(RedisKV的实现)只用到了hashtable。当存储hash数据类型时,我们把它叫做内层的哈希。内层的哈希底层可以使用两种数据结构实现: ziplist:OBJ_ENCODING_ZIPLIST(压缩列表) hashtable:OBJ_ENCODING_HT(哈希表) 执行命令 ziplist压缩列表 ziplist是一个经过特殊编码的双向链表,它不存储指向上一个链表节点和指向下一个链表节点的指针,而是存储上一个节点长度和当前节点长度,通过牺牲部分读写性能,来换取高效的内存空间利用率,是一种时间换空间的思想。只用在字段个数少,字段值小的场景里面。 ziplist的内部结构 ziplist.c源码第16行的注释:

hash一致性算法讲解

江枫思渺然 提交于 2020-03-11 11:23:31
概述 一致Hash在分布式应用中,是常见的负载均衡方式,多用于资源请求映射分散到具体某一台节点服务器,使得每一台服务器能固定处理部分请求,同时,能较小的减少由于动态增减服务器节点带来请求的失效,保证系统更好对外提供服务。 从问题的发展引入思考 图1.假设现在有200万张图片资源,需要随机的分配到3台服务器 除余法 很多人一下子就想到了除余法,通过给每个图片唯一编号(较少的情况),或者通过hash文件名(假设文件名不重复)得到唯一的数字串,然后除余就能随机存放到服务器。 hash ( 文件名 ) % n 正常情况下这个算法已经基本满足,因为每次除余之后必然会得到0,1,2三个数,分别对应三台服务器,下次需要找回这些图片资源只要按同样的方式hash之后就能在对应服务器找到。 但是当图片资源过多无法满足需要增加一台服务器的时候,因为除数的改变,带来余数的改变,也就是服务器数量的改变,带来存储位置的改变,之前存储的图片资源失去了意义,在缓存服务器中,这会导致大量缓存失效,造成缓存的雪崩,为了解决这些问题,一致性hash应运而生。 揭开一致性Hash神秘面纱 首先了解一下计算一致性hash时采用的方式和步骤: 在一个0~2^32区间的圆环上,计算服务器节点的hash值,。 用同样的方式计算存储数据的hash,并映射到相同的圆上。 然后从数据映射到的位置开始顺时针查找

2.2.1 Nginx高性能负载均衡器

北城以北 提交于 2020-03-09 08:43:07
目录 2.2.1.1 Nginx负载均衡 1、Nginx简介 1.1、Nginx作为负载均衡的8个原因 2、正向代理和反向代理 2.1、正向代理 2.2、反向代理(Reverse Proxy) 2.3、反向代理的作用 3、负载均衡原理 4、Nginx负载均衡的4种配置方案 1、轮询(Round Robin)【默认】 2、最少连接least_conn 3、IP地址哈希ip_hash 4、基于权重weight 2.2.1.2 代理缓存机制 1、Nginx缓存简介 1.1、缓存文件放在哪里? 1.2、如何指定哪些请求被缓存? 1.3、缓存的有效期是多久? 1.4、对于某些请求,是否可以不走缓存? 2.2.1.3 通过Lua拓展Nginx 2.2.1.4 高性能Nginx最新实践 2.2.1.1 Nginx负载均衡 1、Nginx简介 Nginx是一款轻量级的web( 静态 )服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD协议下发行,几乎可以在所有操作系统中运行。 Nginx做web服务器:比如Html解析、JS静态文件解析...... 由俄罗斯程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站、搜索引擎Rambler使用。 特点 : 占有内存少、高性能、高并发性 (最初用于解决C10K问题,现在可以C100K) 主要用epoll方式

Java与C ++中的哈希

余生颓废 提交于 2020-03-07 20:06:59
Java和C ++在语法上有些相似,但是随着时间的流逝而发生了变化。Java受到C ++的宽松启发,但最初并未采用C ++的模板结构,也不需要C ++的头文件/内容文件分离,并且当然,它使用JVM并编译为字节码而不是机器码。 从那时起,这两种语言在某种程度上融合了起来-它们遵循相似的编码准则,支持Lamda构造,泛型/模板,循环语法的多个相同形式,等等。但是,现代用途肯定存在差异。C ++模板支持专业化,而Java泛型支持类型限制。它们也具有相似的基本集合类型。 哈希表,哈希图和类似类型的数据结构,这些数据结构允许通过唯一键进行索引,但是该索引是以非常特定的方式实现的。现在,任何关联的容器类型都可以让你通过特定键访问数据。例如,你可以使用链表作为存储结构,也可以使用双链表或二叉树。哈希表本质上使用数组,但是该数组由哈希值索引。 Java 具有作为类的基本关联容器类型 java.util.HashMap 。 C ++ 有 std::unordered_map 。 基于哈希的容器在数据存储方面具有明显的优势。当使用具有低冲突可能性的哈希生成器时,两个容器( HashMap 和 unordered_map )都具有 O ( 1 )查找性能。碰撞的可能性越大,容器的性能就越接近 O ( n ),其中 n 是存储在容器中的元素数。这两个容器也都使用标准的哈希函数 -Java 需要键来实现

Perl语言入门笔记 第六章 哈希(hash)

旧巷老猫 提交于 2020-03-07 20:06:55
=pod 哈希 哈希表里只是一堆的键值对而已,而没有任何顺序,键可以是任意字符串,值也是 awk的哈希键值对增多的时候会逐渐变慢,而perl没有这个缺点 访问哈希元素: $hash{$some_key} foreach my $person (qw< barney fred >) { print "I'v heared of $person $family_name{$person}.\n"; } 在挑选哈希名的时候,最好使得哈希名和键之间能放进去一个"for"字,比如"family_name for fred"是filntstone, 因此把哈希命名为family_name能清晰地反映出键和值之间的关系。 $foo = 'bar'; print $family_name{$foo . 'ney'}; #打印"rubble",连接在一块 哈希可以被转换成列表 哈希赋值: 不是常见用法,但哈希真的可以用一般的赋值语法来赋值; my %new_hash = %old_hash; 得到一个反序的哈希:键值互换 my %inverse_hash = reverse %any_hash; 胖箭头: my $last_name = ( 'fred' => 'flintstone', 'dino' => 'undef', ); 哈希函数: perl中有很多有用的函数可以一次处理整个哈希。

MySQL 索引

霸气de小男生 提交于 2020-03-07 04:09:08
用来记笔记的软件电脑端登不进去了,本来打算过了这段时期,专门总结下知识点,那就直接写在这里吧,有什么问题欢迎指出。 按功能分类 普通索引 唯一索引 主键索引 组合索引 外键索引 全文索引 按结构分类 B+ Tree索引:InnoDB和MyISAM Hash索引:Memory B+ Tree B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现的,一个节点中的key从左到右非递减排列。 Hash 哈希索引能以 O(1) 时间进行查找,但是失去了有序性: 无法用于排序与分组; 只支持精确查找,无法用于部分查找和范围查找。 InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就可以实现快速的哈希查找。 InnoDB存储引擎 InnoDB的数据文件本身就是索引文件。 叶子节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引(这样的索引成为聚集索引)。 InnoDB的辅助索引data域存储相应记录主键的值。这使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引。 MyISAM存储引擎 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,索引文件和数据文件是分离的。 比较

哈希&布隆过滤器

巧了我就是萌 提交于 2020-03-07 02:28:18
哈希 1. 设计RandomPool结构 380. 常数时间插入、删除和获取随机元素 题目:设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入。 delete(key):将原本在结构中的某个key移除。 getRandom(): 等概率随机返回结构中的任何一个key。 要求: Insert、delete和getRandom方法的时间复杂度都是 O(1) 思路:使用两个相互对应的HashMap,map的尺寸为size。第一个keyIndexMap存 [key, value] ,第二个IndexKeyMap存 [vlaue, key] 。其中value为该key存入map的次序(从0开始),将其作为索引。 getRandom()方法:使用Math.random() * size,根据size值,等概率地从尺寸为size的map中获取到一个value,从而获取到对应的键值对。 delete(key)方法:修改最后一个键值对,修改后将其覆盖到相应的删除位置,然后删除键值对含“key”的键值对。 package hash ; import java . util . HashMap ; public class Solution_RandomizedSet { public static class RandomizedSet {

mysql索引的数据结构

妖精的绣舞 提交于 2020-03-06 03:27:07
哈希索引:通过对键值进行一定的哈希算法得到新的哈希值,检索时不需要像btree那样从根节点到叶子节点逐级查找,而是通过哈希算法就可以快速定位到位置 btree和哈希结构的比较: 1、哈希结构的索引适合等值查询,前提是值唯一,因为会出现哈希碰撞的情况,就会导致找到具体的位置后,还得扫描链表 2、哈希结构不适合范围查找,原本有序的磁盘数据经过键值的哈希算法后可能试键值出现不连续,导致不能范围查找 3、哈希机构不适合排序、模糊查询、分组查询,因为这些本质上是范围查询 4、哈希结构不能遵循复合索引的最左原则 B-tree索引:是一个多路平衡搜索树,和二叉树的区别是二叉树每个节点只允许有两个子节点,而btree可以有多个节点 其特点是: 1、所有键值分布在整棵树中 2、任何一个关键字出现且只出现在一个节点中 3、一次查询可能未到叶子节点就可以查询结束,因为真实数据也存储在非叶子节点;性能逼近二分查找 B+tree也是一种多路平衡搜索树,它和B-tree的区别是: 1、B+tree存储的真实数据只在叶子节点 2、为所有叶子节点增加了一个链指针 为什么使用B+tree 1、B+树更适合外部存储,由于内节点无 data 域,一个结点可以存储更多的内结点,每个节点能索引的范围更大,也意味着 B+树单次磁盘IO的信息量大于B-树,I/O效率更高。 2、Mysql是一种关系型数据库

Java 集合小结

倖福魔咒の 提交于 2020-03-05 12:26:33
1.List 1.1 ArrayList 以数组实现。节约空间,但数组有容量限制。 超出限制时会增加50%容量,用System.arraycopy()复制到新的数组。因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组 。 按数组下标访问元素-get(i)、set(i,e) 的性能很高,这是数组的基本优势。 如果按下标插入元素、删除元素- add(i,e)、 remove(i)、remove(e),则要用System.arraycopy()来复制移动部分受影响的元素 ,性能就变差了。 越是前面的元素,修改时要移动的元素越多。直接在数组末尾加入元素-常用的add(e),删除最后一个元素则无影响。 1.2 LinkedList 以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,每插入一个元素都要构造一个额外的Node对象,也需要额外的链表指针操作。 按下标访问元素-get(i)、set(i,e) 要悲剧的部分遍历链表将指针移动到位 (如果i>数组大小的一半,会从末尾移起)。 插入、删除元素时修改前后节点的指针即可,不再需要复制移动。但还是要部分遍历链表的指针才能移动到下标所指的位置。 只有在链表两头的操作-add()、addFirst()、removeLast()或用iterator()上的remove()倒能省掉指针的移动。 Apache

redis面试题

懵懂的女人 提交于 2020-03-05 00:53:06
什么是redis? Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-value数据库。 Redis的数据类型? Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 Redis相比Memcached有哪些优势? (1) Memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) Redis的速度比Memcached快很多 (3) Redis可以持久化其数据 Redis是单进程单线程的? Redis是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。 一个字符串类型的值能存储最大容量是多少? 512M MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据? redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 Redis 有哪几种数据淘汰策略? volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires