哈希表

redis hash

北城以北 提交于 2020-02-12 03:21:50
常用操作: HSET key field value //存储一个哈希表key的键值 HSETNX key field value //存储一个不存在的哈希表key的键值 HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对 HGET key field //获取哈希表key对应的field键值 HMGET key field [field ...] // 批量获取哈希表key中多个field键值 HDEL key field [field...] //删除哈希表中的field键值 HLEN key //返回哈希表key中field的数量 HGETALL key //返回哈希表key中所有的键值 HINCRBY key field increment //为哈希表key中field键的值加上增量increment 来源: https://www.cnblogs.com/lfhphp/p/12297659.html

MySQL--索引

廉价感情. 提交于 2020-02-12 01:27:56
索引 索引是为了提高数据查询的效率,就类似与书的目录。 索引的常见模型 哈希表 ,也就是KV类型的结构,输入K即可得到相应的值,思路就是把值放到数组里,用一个哈希函数把K换成一个位置,然后在这个位置上找寻value。当不同的K经过换算有相同的结果是,采用拉链法。如下图: 在这个图中,倘若K换算后的值得到的N,那么目标就是N位置后面的链表的某一个。采用顺序查找。用哈希表查询等值很快,但是缺点是不能进行范围查询。 有序数组 ,相比于哈希表,有序数组的好处就是可以进行范围查询,同时,用二分的话,等值查询的性能也可以很好的保证。但是,有序数组的缺点就是只适合静态存储引擎。 二叉搜索树 ,根据二叉树的特点(左孩子小于父节点,右孩子大于父节点),可以很容易来搜索树中的某个值,但是二叉搜索树在一些情况下会出现左右高度不平衡,所以需要保持一颗二叉平衡树,这样查询的复杂度是O(logN),更新一个结点也是O(logN)。 但是实际上二叉树是很少使用的,原因无他,结点数量过多的情况下,二叉树的高度也增加,访问磁盘的次数也会增加,从而查询变慢,所以引入了N叉树,N的值取决于数据块点大小。 InnoDB的索引模型 InnoDB中,表都是根据主键顺序以索引的形式来存放的,使用B+树来存储。 每一个索引都对应有一个B+树,比如建立一个表并设置一个索引, CREATE table t6( id int

redis安装

隐身守侯 提交于 2020-02-11 02:57:18
安装过程如下 性能测试结果: SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下: Linux 2.6, Xeon X3320 2.5Ghz. stackoverflow 网站使用 Redis 做为缓存服务器。 安装过程: Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。 Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。 一、下载最新版 wget http://redis.googlecode.com / files/redis-2.0.0-rc4.tar.gz 二、解压缩 tar redis-2.0.0-rc4.tar.gz 三、安装C/C++的编译组件(非必须) apt-get install build-essential 四、编译 cd redis-2.0.0-rc4 make make命令执行完成后,会在当前目录下生成本个可执行文件

比特币之七交易的验证

南楼画角 提交于 2020-02-11 01:32:16
正在学习区块链,如果我哪里有错误希望大家指出,如果有任何想法也欢迎留言。这些笔记本身是在typora上写的,如果有显示不正确的敬请谅解。笔记本身也是给我自己写的,所以如果有侵权的请通知我,我立即删除。 7.交易的验证 7.1 前戏 下面讲的这些交易的验证其实都是在block body中,就是一次次的交易,之前的那些都是在block header中的数据。 图片最上面左侧的BTC-Output是指UTXO中的前一个比特币的输出,右侧unspent就是剩下的钱,spent就是花掉的钱,这个交易已经收到了23个交易,这都是之前讲过的。 “下面是这个交易的具体内容”,肖老师是这么说的, 我的理解是这就是merkle tree中的一个节点。一个确定的交易内容。VIN和VOUT是数组,太长了,放在下面单独说。我觉得下面这种格式不太正确,因为对于一次交易来说,vin和vout不是下面这种存放方法的。 **txid:**交易的id,transaction id **hash:**交易的哈希值,不是nonce的那个,那是什么呢?不知道 **version:**使用的比特币协议的版本号 **size:**这个交易的大小 **locktime:**交易的生效时间,一般来说都是0,立即生效。有的特殊的交易会用到这个值,比如有的交易会在10个区块后生效 **block hash:**这个区块所在的哈希值

Redis Hash

蓝咒 提交于 2020-02-10 20:14:48
Redis Hash Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。 redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redis 127.0.0.1:6379> HGETALL w3ckey 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000" 在以上实例中,我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 w3ckey 中。 序号 命令及描述 1 HDEL key field2 [field2] 删除一个或多个哈希表字段 2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。 3 HGET key field

【转】MySql索引

与世无争的帅哥 提交于 2020-02-10 15:21:32
https://segmentfault.com/a/1190000010991930 索引(key)是存储引擎用于快速找到记录的一种数据结构。它和一本书中目录的工作方式类似——当要查找一行记录时,先在索引中快速找到行所在的位置信息,然后再直接获取到那行记录。 在MySql中,索引是在存储引擎层而不是服务器层实现的,所以不同的存储引擎对索引的实现和支持都不相同。 B-TREE索引 B-TREE索引是使用最多的索引。很多存储引擎采用的都是B-TREE数据结构的变体实现该索引,例如InnoDB使用的是B+TREE,即每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点范围遍历。 不同存储引擎使用B-TREE索引的方式也不同。例如MyISAM使用前缀压缩技术使索引更小,而InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。 B-TREE中的所有值都是按顺序存储的,每个叶子页到根的距离相同。下图展示了InnoDB中的B-TREE索引是如何工作的: 当查找一行记录时,存储引擎会先在索引中搜索。从索引的根节点开始,通过比较节点页的值和要查找的值逐层进入下层节点,最底层叶子节点的指针指向的是被索引的数据。这样的查找方式避免了全表扫描,加快访问数据的速度。此外因为B-Tree对索引列是顺序存储的

二叉树和哈希表的优缺点对比与选择

佐手、 提交于 2020-02-10 09:12:03
二叉树(binary tree)和哈希表(hash table)都是很基本的数据结构,但是我们要怎么从两者之间进行选择呢?他们的不同是什么?优缺点分别是什么? 回答这个问题不是一两句话可以说清楚的,原因是在不同的情况下,选择的依据肯定也不同。首先来回顾一下这两个数据结构: 哈希表使用hash function来对输入的数据分配index到哈希表对应的槽中。假设有一个哈希表的size是100,而我们输入的数据是从0~99,我们要把输入数据储存到哈希表中。理论上来说,该哈希表插入和查找操作的时间复杂度都是O(1)。 二叉树遵循右子树大于根节点,左子树小于根节点的原则进行数据的插入和保存。如果这个树的 平衡 的,那么,对于每个元素的插入和查找操作的时间复杂度是O(log(n)),n是树的节点个数,log(n)通常是树的深度。当然,对于不平衡的情况,那就需要更复杂的数据结构的树(红黑树等)进行处理。 上文似乎得出结论哈希表要好于二叉树,但是it is not always the case。哈希表有以下几个突出的缺点: 当更多的数插入时,哈希表冲突的可能性就更大。对于冲突,哈希表通常有两种解决方案:第一种是线性探索,相当于在冲突的槽后建立一个单链表,这种情况下,插入和查找以及删除操作消耗的时间会达到O(n),且该哈希表需要更多的空间进行储存。第二种方法是开放寻址,他不需要更多的空间

数据库的索引和锁

荒凉一梦 提交于 2020-02-09 20:10:34
一、索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度 表经常进行 INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。 -索引需要占物理和数据空间。 了解过索引的最左匹配原则 知道索引的分类:聚集索引和非聚集索引 Mysql支持Hash索引和B+树索引两种 看起来好像啥都知道,但面试让你说的时候可能就GG了: 使用索引为什么可以加快数据库的检索速度啊? 为什么说索引会降低插入、删除、修改等维护任务的速度。 索引的最左匹配原则指的是什么? Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗? 聚集索引和非聚集索引有什么区别? … 1.1聊聊索引的基础知识 首先Mysql的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表 而每个数据页中的记录又可以组成一个单向链表 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。 所以说,如果我们写 select*fromuserwhereusername='Java3y’这样没有进行任何优化的sql语句

[LeetCode] 219、存在重复元素 II

天涯浪子 提交于 2020-02-09 18:14:31
题目描述 给定一个整数数组和一个整数 k ,判断数组中是否存在两个不同的索引 i 和 j ,使得 nums [i] = nums [j] ,并且 i 和 j 的差的绝对值最大为 k 。 输入: nums = [1,2,3,1], k = 3 输出: true 解题思路 用哈希表即可,简单题。 更简单的实现方式请见 题解 : 维护一个哈希表,里面始终最多包含 k 个元素,当出现重复值时则说明在 k 距离内存在重复元素。 每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于 k ,则移除最先进入哈希表的数字。 参考代码 我的实现 class Solution { public : bool containsNearbyDuplicate ( vector < int > & nums , int k ) { int length = nums . size ( ) ; if ( length <= 1 ) return false ; unordered_map < int , unordered_set < int >> umap ; for ( int i = 0 ; i < length ; i ++ ) { if ( umap . count ( nums [ i ] ) > 0 ) { unordered_set < int > uset = umap [ nums [

哈希表

Deadly 提交于 2020-02-09 12:52:56
哈希表(散列表)根据关键码值(Key)直接访问,加快查找的速度。 简单来说就是把数据分组,在进行查找的时候直接在对应的组里进行查找,以此减少查找数据时对不必要查找数据时所浪费的时间 package hashtab; import java.util.Scanner; public class HashTabDemo { public static void main(String[] args) { HashTab hashTab = new HashTab(7); String key = ""; Scanner scanner = new Scanner(System.in); while (true) { System.out.println("add"); System.out.println("list"); System.out.println("find"); System.out.println("del"); System.out.println("exit"); key = scanner.next(); switch (key) { case "a": int id = scanner.nextInt(); String name = scanner.next(); Emp emp = new Emp(id, name); hashTab.add(emp);