哈希

【Redis】集群教程(Windows)

核能气质少年 提交于 2020-04-08 04:34:53
概述 Redis集群数据分片 Redis集群节点通讯 环境准备 搭建Redis集群 测试Redis集群 概述 Redis Cluster provides a way to run a Redis installation where data is automatically sharded across multiple Redis nodes Redis集群提供一个在多个Redis节点数据自动共享的方式,简单来说就是添加服务器的数量,达到 高可用,让Redis服务长时间有效运行,不会因为硬件/软件问题导致不可用 可扩展性,动态添加节点/删除节点,达到增加性能/减少服务器资源 分布式,节点可以不是 容错,若其中一台服务器故障挂了Redis也能继续使用(前提是有从节点并且可用) Redis集群数据分片 Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念. Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么: 节点 A 包含 0 到 5500号哈希槽. 节点 B 包含5501 到 11000 号哈希槽. 节点 C 包含11001 到 16384号哈希槽 这种结构的好处就是非常容易增加/删除节点,并且不会影响集群的使用 增加节点

HASH 字符串哈希 映射转化

二次信任 提交于 2020-04-06 05:41:49
哈希HASH的本质思想类似于映射、离散化。 哈希,通过给不同字符赋不同的值、并且钦定一个进制K和模数,从而实现一个字符串到一个模意义下的K进制数上。 它的主要目的是判重,用于$DFS$、$BFS$判重(八数码),字符串判断相等、出现等等。 本篇总结字符串哈希以及一些应用例题。 为什要用字符串哈希? 因为取出一个字符串是$O(n)$的,比较一遍又是$O(n)$的,况且要比较两个甚至多个。这就成了$n^2$级别的了。 那我们比较数字怎么就不用这么麻烦呢?因为数字可以直接比较,(虽然不知道内部是怎么实现的,反正比一位一位比较肯定快)所以我们考虑把字符串映射到数字上。 就有了字符串哈希。 通过字符串哈希,只要题目支持预处理,我们可以$O(n)$预处理之后,$O(1)$进行提取,$O(1)$进行判重。 字符串哈希需要什么? 1.字符。初始坐标无所谓。 2.K进制数,通常选择$131$,$13331$,这两个质数冲突几率很小 (不要问我为什么) 。 3.取模数,我用过 $1e9+7$,$998244353$,用$2^{64}$也可以,这里利用自然溢出,一般不会有问题。提一句,$unsigned\space long\space long$做减法,即使算出来应该是负数,会自动加上$2^{64}$,相当于$(a+mod-b)%mod$了。没有问题。 处理hash: 1.预处理$K^{len}$

区块链应用开发技术架构模式介绍

血红的双手。 提交于 2020-04-06 05:17:13
区块链应用开发技术架构模式介绍 区块链应用场景多样,从数字货币金融到去中心化互联网。大多数用例都可以归纳为几种模式。源中瑞ruiecjo给大家讲解基于区块链的去中心化应用的常见的4种架构模式。 1、IAM的架构模式 背景信息: IAM环境包括许多用户和服务提供商。IAM系统为每个用户提供一个帐户和一组功能,使用户可以前往服务提供商,展示其帐户所有权,然后根据其功能接收服务。 力量:需要实现一个分散的IAM环境,在该环境中,一个恶意用户或几个用户不会对系统造成重大影响。 解决方案:建议的模式候选者以以下方式使用万维网联合会(W3C)DID规范和W3C可验证声明规范。 我们可以在这一架构模式上处理大多数的IAM用例。例如,我们可以通过可验证声明来控制访问权限,确保只有具备某些特征的用户可以访问区块链系统。 需要区块链应用开发技术可找ruiecjo了解,我们将为您讲解区块链技术发展历史,以及未来区块链技术又如何发展下去。 2、可审计历史的架构模式 背景信息:两个或多个参与方进行交易或一起工作,其活动需要以无可争议的方式记录下来。 强制措施:需要实现一个分散的审核日志或一个工作区,在该工作区中,一个恶意用户或几个用户不会对系统产生重大影响。 解决方案:提议的系统记录活动并在区块链中为这些记录创建条目。该条目包含活动记录的哈希,因此,以后不能对记录进行争议。 如果存在大量的活动

字符串哈希

五迷三道 提交于 2020-04-06 03:58:51
字符串哈希 字符串哈希一般可以认为是一种很方便的乱搞算法。 可以很快速的计算两个串是否相等以及一系列问题。 然而弱爆的 \(yyb\) 哈希一直学的不好,所以今天来恶补一下。 几种方法 首先我们要明确哈希在干什么呢? 一般而言,对于一个字符串,我们把所有字符都当成数字来算。 这个可以类比 \(16\) 进制下用 \(ABCDE\) 来代替大数字。 那么,我们的这个串就可以看成是一个巨大的 \(base\) 进制的数, 这个 \(base\) 我们可以任取,稍微取大一点点就好了。 但是,当串很长的时候,我们的 \(int\) 或者 \(longlong\) 或者 \(unsignedlonglong\) 都是存不下这个数本身的。 如果使用高精度,那么其相等的比较就变成逐位比较,就和直接比较字符串没有任何意义。 所以,我们可以找一个方法,使得这个精确的值可以映射到我们能够存下的整数范围内。 这个映射的方法我们一般选择取模。 于是我们找来了洛谷上的模板题。 洛谷3370【模板】字符串哈希 我取 \(base=2333,Mod=19260817\) 一般而言, \(Mod\) 取一个质数比较好,这样子还有很多其它有趣的操作也可以很方便的进行。 代码如下 #include<iostream> #include<cstdio> #include<cstring> using namespace

一致性hash算法释义

时光总嘲笑我的痴心妄想 提交于 2020-04-05 23:17:08
一致性Hash算法背景   一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。   但现在一致性hash算法在分布式系统中也得到了广泛应用,研究过memcached缓存数据库的人都知道,memcached服务器端本身不提供分布式cache的一致性,而是由客户端来提供,具体在计算一致性hash时采用如下步骤: 首先求出memcached服务器(节点)的哈希值,并将其配置到0~2 32 的圆(continuum)上。 然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2 32 仍然找不到服务器,就会保存到第一台memcached服务器上。   从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在园(continuum)上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响,如下图所示: 一致性Hash性质   考虑到分布式系统每个节点都有可能失效

这就是搜索引擎--读书笔记四--索引基础

ぐ巨炮叔叔 提交于 2020-03-31 07:32:19
搜索引擎索引基础 前几天我阅读了搜索引擎索引这一章,发现倒排索引这一方法确实很巧妙和迷人,它包含的原理和设计方法很独到。所以接下来,我想把我学习到的索引方面的知识给大家讲解一下,总共分为三篇: 索引基础 、 索引建立和更新 、 索引查询 。 我们首先认识倒排索引基本概念 文档 : 一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖了更多形式,比如Word、PDF、HTML、XML等不同格式的文件都可以称为文档。 文档集合 :由若干文档构成的集合称为文档集合。 文档编号 :在搜索引擎内部,会为文档集合中每一个文档赋予一个唯一的内部编号,以此编号来作为文档的唯一标识,这样方便内部处理。每个文档的内部编号称为文档编号。 单词编号 :和文档编号类似,单词编号可以作为某个单词的唯一表征。 倒排索引 :倒排索引是实现单词—文档矩阵的一种具体存储形式。通过倒排索引,可以通过单词快速获取包含这个单词的文档列表。倒排索引由两个部分组成:单词词典和倒排文件。 单词词典 :搜索引起通常的索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息及指向倒排列表的指针(还记得链表吗?亲)。 倒排文件 :所有单词的倒排列表往往顺序的存储在磁盘的某个文件里,这个文件即被称为倒排文件

短链接设计与实现

一世执手 提交于 2020-03-26 22:04:54
3 月,跳不动了?>>> 1.什么是短链接 就是把普通网址,转换成比较短的网址。比如: http://t.cn/RlB2PdD 这种,在微博这些限制字数的应用里。好处不言而喻。短、字符少、美观、便于发布、传播。 2.交互流程 a)用户访问短链接: http://t.cn/RtFFvic b)短链接服务器t.cn收到请求,根据URL路径RtFFvic获取到原始的长链接: http://blog.csdn.net/poem_qianmo/article/details/52344732 c)服务器返回302状态码,将响应头中的Location设置为: http://blog.csdn.net/poem_qianmo/article/details/52344732 d)浏览器重新向http://blog.csdn.net/poem_qianmo/article/details/52344732发送请求 e)返回响应 说明:301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的。同时对服务器压力也会有一定减少。 但是如果使用了 301,我们就无法统计到短地址被点击的次数了。而这个点击次数是一个非常有意思的大数据分析数据源。能够分析出的东西非常非常多。所以选择302虽然会增加服务器压力,但是我想是一个更好的选择。 3. 算法实现 a

获取简短的Git版本哈希

冷暖自知 提交于 2020-03-21 19:11:40
3 月,跳不动了?>>> 有没有更简洁的方法从Git获取 HEAD 的短版本哈希? 我希望看到与我相同的输出: git log -n 1 | head -n 1 | sed -e 's/^commit //' | head -c 8 我最初使用上面的命令来生成版本字符串,但这更好: git describe --tags 它将输出字符串,如 0.1.12 (标记提交)或 0.1.11-5-g0c85fbc (标记后的五次提交)。 #1楼 分支短哈希和最后评论: git branch -v develop 717c2f9 [ahead 42] blabla * master 2722bbe [ahead 1] bla #2楼 一个非常简单的方法是: git describe --always #3楼 git log -1 --abbrev-commit 也会这样做。 git log --abbrev-commit 将列出具有缩写SHA-1校验和的日志条目。 #4楼 查看Git提交短版本和Git提交消息的简单方法是: git log --oneline 请注意,这是简写 git log --pretty=oneline --abbrev-commit #5楼 我有Git版本2.7.4,具有以下设置: git config --global log.abbrevcommit yes

Excel表格转Json数据结构

北慕城南 提交于 2020-03-21 03:23:54
Excel表格转Json数据结构 辗转了好几个项目,每个项目的导表工具都巨难用,速度慢,潜规则多,扩展性差,不易于调试。Sqlite,Json,Lua,Xml各种格式都用过。 举个例子: 大多数导表工具不支持文本数组的解析,因为它们对数组的解析算法异常粗暴,无非就是一个Split(value, ","),当你的文本数组没有逗号时,一切都OK,一旦出现逗号,解析结果错误,但程序依旧正常运行,直到游戏中读取错误时,你才能意识到出问题了。 不能类型组合,通常这些导表工具都不支持类型之间的组合,例如整数数组,哈希数组等等。有的支持整数数组,但它并不是把整数和数组两个类型结合,而是单独定义了一个 整数数组 的类型,当需要稍微复杂一点的结构时,则不支持甚至完全不能实现,比如数组嵌套数组。 错误无法定位,输出的错误信息几乎没有看不懂,策划更是束手无策。 没有类型安全,当配置表的某个字段名被修改时,程序可能完全不知道,直到游戏中读取配置错误。 数据结构 在数据结构上我个人最理想的数据格式是Json。 Sqlite 对客户端不友善,大多数客户端对SQL语句并不熟悉。作为配置数据而言,关系数据库的优势并不明显,如果数据查询需要复杂的SQL语句,这个数据结构设计本身就是错误的,如果仅使用简单的SQL语句查询,那为什么不直接用Key-Value数据结构?此外,Sqlite需要用专门的数据库软件浏览

[Redis] 哈希类型与ziplist

房东的猫 提交于 2020-03-20 10:26:00
项目中使用到了redis的哈希结构 , 哈希结构的内部编码类型是 ziplist 和 hashtable 当元素个数小于512 , 并且值的大小小于64个字节时 , 采用ziplist , 大于的时候采用hashtable ziplist最大的优势就是存储的时候是连续的内存 , 可以极大的提升cpu的缓存命中率 使用object encoding 键 来查看所存储数据的内部编码类型 object encoding 键 $7 ziplist 来源: https://www.cnblogs.com/taoshihan/p/12529800.html