哈希表

认识Redis与Redis的数据类型

我的未来我决定 提交于 2019-12-07 00:16:05
本文作为Redis的入门教程,旨在让大家对Redis有一个概念性和整体性的认识,并且可以快速上手,为深入Redis打下基础。 文章概要: Redis的介绍 Redis与其他数据库的对比 Redis与其他缓存实现对比 Redis的数据结构类型 Redis命令操作几种数据类型 Spring Data Redis操作几种数据类型 ZSET(有序集合)保证顺序 SET(集合)随机获取元素 目录 Redis的介绍 Redis与其他数据的对比 Redis与其他缓存实现对比 Redis的数据类型 Redis 5种数据类型概览 Redis命令操作5种数据类型 STRING命令 字符串操作 SETEX与SETNX 数字操作 批量操作 BIT操作 LIST命令 SET命令 HASH命令 ZSET命令 总结 相关链接 作者资源 参考资源 相关资源 charts books Redis的介绍 Redis是一种非关系型数据库(non-relational database, 简称nosql)。 Redis是一个远程内存数据库,Redis客户端可以通过TCP协议请求服务端。 Redis性能强劲,且支持持久化和复制,可以方便地存储和读取海量数据。 那么Redis到底有多快? Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求,你可以使用 redis

Redis的5种数据类型及常用命令

爷,独闯天下 提交于 2019-12-07 00:14:31
redis的数据类型 String String类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M 常用String类型命令 命令 说明 set 设置String类型的value值,直接符合我们对key-value的认知 get 根据key的值获取之前设置的value值 append 对指定key值的value进行追加内容,相当于字符串的拼接 strlen 返回字符串字符的个数,若key不存在则显示为0 del 删除key对应的value值 incr 对key的value值进行count的加运算,前提是对应的value必须是数值类型 decr 对key的value值进行count的减运算,前提是对应的value必须是数值类型 setex 设置String类型value值,并指定存活时间单位(秒) setnx 设置给String类型的value值了,如果key对应的value值,则返回0,否则返回1,常用于分布式锁 getrange 指定索引区间,获取key上对应的value值 setrange 指定索引区间,覆盖key上对应value值 String实例演示 // 设置值 127.0.0.1:6379 > set haha 1 OK //

Oracle 从表到索引追踪

可紊 提交于 2019-12-06 21:11:58
select dbms_metadata.get_ddl('TABLE','TABLE_NAME') from dual; 返回包括索引信息: CONSTRAINT "XXX_PK" PRIMARY KEY ("F1", "F2") DISABLE 关于所以的具体数据结构介绍:https://blog.csdn.net/xiaoxin0630/article/details/88786873 二叉 B- B+ Hash 1、哈希索引就是采用一定的哈希算法把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。 2、B+树索引和哈希索引有如下四点明显区别: a、如果是等值查询,那么哈希索引明显有优势,因为只需要经过一次算法即可找到相应的键值; b、如果是范围查询检索,这时候哈希索引没有优势了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索; 同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);------------------- 这里HBASE 分布式数据库就能做到Row Key order. 不理解为什么做不到。看来是存储方式不灵活 c、哈希索引也不支持多列联合索引的最左匹配规则

java 查找算法

*爱你&永不变心* 提交于 2019-12-06 20:46:31
1、顺序查找 public class OrderSearch { /**顺序查找平均时间复杂度 O(n) * @param searchKey 要查找的值 * @param array 数组(从这个数组中查找) * @return 查找结果(数组的下标位置) */ public static int orderSearch(int searchKey,int... array){ for(int i=0;i<array.length;i++){ if(array[i]==searchKey){ return i; } } return -1; } /**测试查找结果 * @param args */ public static void main(String[] args) { int[] test=new int[]{1,2,29,3,95,3,5,6,7,9,12};//升序序列 int index=OrderSearch.orderSearch(95, test); System.out.println("查找到的位置 :"+ index); } } 二分查找 算法思想:又叫折半查找, 要求待查找的序列有序 。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程

常用查找算法及实现

被刻印的时光 ゝ 提交于 2019-12-06 20:46:11
一、顺序查找 线性查找是在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是 让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺 点是效率低下。 1、算法原理 1)从表中的最后一个记录开始,逐个进行记录的关键字与给定值进行比较,若某个记录的关 键字与给定值相等,则查找成功,找到所查的记录; 2)反之,若直到第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查的记 录,查找失败。 2、算法分析 顺序查找的平均查找长度(Average Search Length,ASL)为(n+1)/2,当查找 不成功 时,需 要n+1次比较,时间复杂度为O(n); 3、算法实现 /* 顺序查找。 */ #include <iostream> #include <stdio.h> int SequenceSearch( int *array, int n, int key ) { if( array == NULL || n < 0 ) { printf( "invalid input.\n" ); return -1; } int i ; array[ 0 ] = key; for( i = n; array[ i ] != array[ 0 ]; i-- ) { if( array[ i ] == key ) break; } if(

redis六种基本数据结构

天大地大妈咪最大 提交于 2019-12-06 15:18:43
1.sds(simple dynamic string)简单动态字符串 12345 struct sdshdr { int len; //buf中已占用空间的长度 int free; //buf中剩余可用空间的长度 char buf[]; //初始化sds分配的数据空间,而且是柔性数组(Flexible array member)} 定义: sds.h定义了字符串的已使用的长度,剩余空间,已经初始化分配的空间大小 sds.c定义了内存申请、回收策略 预分配策略,字符串修改后。如果表头len小于1M,则扩容len相同的空间。free和len大小相同。否则扩容固定大小为1M的空间。 回收策略,惰性空间释放,当要缩短字符串时并不是立即释放全部空间,而是修改头文档len的长度,待之后使用。 优点: 时间复杂度为O(1) 因为表头存放字符串len,可以根据长度直接获取整个字符串 杜绝缓冲区溢出 C语言中使用strcat进行字符串拼接,如果没分配足够的空间就会导致缓冲区溢出。Redis会先判断len长度,自动扩容满足空间需要。 兼容C部分函数 使用字符串/0结尾与C语言相同 二进制安全性 支持存放图片,视频二进制文档。传统字符串当遇到/0就结束了,所以不能存放图片视频二进制文档 2.链表 12345678 typedef struct listNode{ //前置节点 struct

(机考)哈希表的生成与查找(二次探测再散列)

独自空忆成欢 提交于 2019-12-06 15:00:20
问题 描述 从 空表开始,将 输入 元素 按照 输入顺序 逐个插入 一 个哈希表 , 以 生成哈希表。之后 查找 元素 , 输出 探测 序列 , 即 输出查找 过程中经过的结点 中 的数据 。表长为 m ,哈希函数为 Hash(key)= key mod P (P<=m), 用二次 探测 再散列法处理冲突,即 探测 序列为 Hi=(Hash(key)+di) mod m, 其中 增量 序列为 di = 1 2 , -1 2 , 2 2 , -2 2 ,3 2 ,-3 2 … , k 2 , -k 2 (k ≤ m/2) 。 输入 说明 第一行 为 三个 整数 n 、 m 、 P , n 为 输入元素的个数, m 为哈希表 的表长, P 为哈希函数 Hash(key)= key mod P 中 的 P 。 第二行 为 n 个整数 ,为输入数据 。 后面 每一行 是一个要查找的整数 , 以 -1 结束。最后 的 -1 不查找 。 输出 说明 对于 每个要查找的 数字 , 在 一行上输出 探测 序列 , 即 输出查找 过程中经过的结点 中 的数据 , 中间以 空格隔开。 对于 哈希表 中不存在的 数字 ,探测到最后一个空位置时,要输出 字符串“NULL”。 每个数字的 探测 序列后面 要 换行 。 输入 样例 11 14 13 62 42 53 69 100 26 87 74 56 61

几种算法的实际应用

微笑、不失礼 提交于 2019-12-06 14:40:13
bitmap算法 最典型的例子就是用户标签,根据标签来存储用户 java中已有bitset实现 我还有一点不太明白,使用哈希表也同样能实现用户的去重和统计操作,为什么一定要使用Bitmap呢? 傻孩子,如果使用哈希表的话,每一个用户ID都要存成int或long类型,少则占用4字节(32bit),多则占用8字节(64bit)。 而一个用户ID在Bitmap中只占1bit,内存是使用哈希表所占用内存的1/32,甚至更少 LRU算法 最近最少被访问的数据从内存中移除,保证内存不会一直增长。 Java中已有LinkedHashMap实现 Redis数据库 rides数据库应用了多种算法 来源: https://www.cnblogs.com/zhaoqingqing/p/11865120.html

开放定址法构造哈希表

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 13:15:55
#define NULLKEY -1 #define DELKEY -2 typedef int KeyType; typedef struct { KeyType key; int count;//探测次数域 }HashTable;    void InsertHT(HashTable HT[], KeyType k, int& n, int m, int p) { //n哈希表中总元素的个数,m表长 int i, adr; adr = k % p; if (HT[adr].key == NULLKEY || HT[adr].key == DELKEY) { HT[adr].key = k; HT[adr].count = 1; } else { i = 1; do { adr = (adr + 1) % m;//是m不是p i++; } while (HT[adr].key != NULLKEY && HT[adr].key != DELKEY); HT[adr].key = k; HT[adr].count = i; } n++; }    void CreateHT(HashTable HT[], KeyType keys[], int& n, int m, int p,int n1) { //n1为keys数组长度 int i; for ( i = 0; i < m; i

性能调优8:分组聚合 - group by

旧城冷巷雨未停 提交于 2019-12-06 11:41:06
原文: 性能调优8:分组聚合 - group by 聚合实际上对数据做分组统计,SQL Server使用两种操作符来实现聚合,流聚合(Stream Aggregation)和哈希聚合(Hash aggration)。流聚合是非阻塞性的,具有流的特性,流聚合操作符;边处理数据,边输出聚合的结果。而哈希聚合是阻塞性的,只要处理完所有的数据,才会输出聚合的结果。 一,流聚合 流聚合要求输入的数据集在group by 即分组列上是有序的,也就是说,流聚合需要排序。分组列的位置和顺序不会影响聚合的结果,因此分组列的排序是任意的。对于索引上的流聚合,由于数据是已经排序的,使用流聚合算法没有排序操作的开销。 流聚合算法是:第一个被读取的数据会创建第一个分组,后续读入的数据都会先和当前的分组匹配,如果匹配,把该行放入到当前的分组中;如果不匹配,创建新的分组,直到所有数据行都处理完成为止,最终对各个分组计算聚合值。 二,哈希聚合 在执行计划中,哈希聚合使用的物理操作符是:Hash Match(Aggregate),实际上,Hash Join也是使用Hash Match作为物理操作符。哈希聚合不需要排序,但是需要授予内存来创建Hash表。优化器倾向于使用哈希聚合来对无序的大表进行聚合操作,哈希聚合的算法: 对于每一个输入行,在group by列上计算哈希值, 检查该行是否映射到hash表中