哈希表

哈希的装填因子

依然范特西╮ 提交于 2019-12-03 12:11:29
装填因子:a=n/m 其中n 为关键字个数,m为表长。加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.冲突的机会越大,则查找的成本越高.反之,查找的成本越小.因而,查找时间就越小.因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷. 装填因子:a=n/m 其中n 为关键字个数,m为表长。加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.冲突的机会越大,则查找的成本越高.反之,查找的成本越小.因而,查找时间就越小.因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷. 来源: https://www.cnblogs.com/gloryhope/p/11795738.html

Redis 入门之 redis 对hash的操作

不打扰是莪最后的温柔 提交于 2019-12-03 09:51:28
/** * { @link #test() test} * jedis 对 hash 进行操作 * @author jackson * @date 2015-12-17 下午2:48:30 * @return void */ @SuppressWarnings("unchecked") @Test public void TestJedisHash(){ // hset hget jedis.hset("hsetkey", "hashKey", "hashValue");//将哈希表key 中的域field 的值设为value 。如果key 不存在,一个新的哈希表被创建并进行HSET 操作。如果域field 已经存在于哈希表中,旧值将被覆盖。 String hash = jedis.hget("hsetkey", "hashKey");//返回哈希表key 中给定域field 的值 System.out.println("测试 hset hget : hsetkey 的返回值:"+hash); //hsetnx 当且仅当域field 不存在。若域field(指第二个参数) 已经存在,该操作无效。 long n = jedis.hsetnx("hsetkeynx", "hashkeynx", "hashvaluenx"); System.out.println(n!=0?"操作成功"

Redis五种数据类型

一世执手 提交于 2019-12-03 08:55:50
Redis简介 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map),列表(list),集合(sets)和 有序集合(sorted sets)等类型。 Redis安装 $ wget http://download.redis.io/releases/redis-5.0.5.tar.gz $ tar xzf redis-5.0.5.tar.gz $ cd redis-5.0.5 $ make 以后台方式启动Redis 修改Redis.conf文件 将daemonize on 修改为 daemonize yes 启动Redis src/redis-server redis.conf 开机启动Redis 执行安装脚本,一直默认就可以 ./utils/install_server.sh mv /etc/init.d/redis_6379 /etc/init.d/redis 设置Redis密码 vim /etc/redis/6379.conf requirepass redispass service redis restart 再次连接发现需要输入密码 Redis命令 全局命令

[转帖]Merkle树

核能气质少年 提交于 2019-12-03 07:00:01
Merkle树 https://www.jianshu.com/p/fc439a8fd0de 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全。一个交易一旦发生那么就是对所有人都公开的,每个交易的历史可以最终追溯到相应的比特币最初被挖出来的那个点。 先简单回顾一下比特币交易过程。 其实比特币并不存在于任何地方。有人如果持有比特币,那么他们其实是拥有特定比特币的地址,但是所谓的币并不是直接就存在于这个地址中的,地址就相当于你的银行账户。 有的只是各个地址之间的转账记录,余额时增时减。所有的交易都存放在一个非常大的账本文件中,这个文件叫做“区块链”。一个比特币地址中的余额,不是直接存放在比特币地址中的,我们需要到区块链中去计算出来。 如果 Alice 给 Bob 发送一些比特币,那么这个交易就有三项信息: § 输入。这里面记录了最初 Alice 拥有的这些币是从哪个地址转给她的,假设她是从她的朋友 Eve 那里得到的币。 § 数目。这个就是 Alice 到底给 Bob 转了多少个比特币。 § 输出。Bob 的比特币地址。 发送交易需要两样东西,比特币地址和对应的私钥。比特币地址跟银行账号不一样,不需要签署一堆文件去申请,它们是随机生成的,就是一串由字母和数字组成的字符串。私钥也是类似的一个字符串,但是这个是要严格保密的。比特币地址就好像一个透明的存钱罐

redis常用命令

江枫思渺然 提交于 2019-12-03 04:02:58
一、redis启动: 本地启动:redis-cli 远程启动:redis-cli -h host -p port -a password Redis 连接命令 AUTH password 验证密码是否正确 ECHO message 打印字符串 PING 查看服务是否运行 QUIT 关闭当前连接 SELECT index 切换到指定的数据库 二、redis keys命令 1、DEL key DUMP key 序列化给定的key并返回序列化的值 2、EXISTS key 检查给定的key是否存在 3、EXPIRE key seconds 为key设置过期时间 4、EXPIRE key timestamp 用时间戳的方式给key设置过期时间 5、PEXPIRE key milliseconds 设置key的过期时间以毫秒计 6、KEYS pattern 查找所有符合给定模式的key 7、MOVE key db 将当前数据库的key移动到数据库db当中 8、PERSIST key 移除key的过期时间,key将持久保存 9、PTTL key 以毫秒为单位返回key的剩余过期时间 10、TTL key 以秒为单位,返回给定key的剩余生存时间 11、RANDOMKEY 从当前数据库中随机返回一个key 12、RENAME key newkey 修改key的名称 13、RENAMENX key

哈希表(散列表)原理详解a

拜拜、爱过 提交于 2019-12-03 03:48:22
先看看定义: “散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 哈希表本质是数组,哈希函数是把key转换成下标用的。 几个问题: 1.不同的key,通过哈希函数计算得到的数组下标一样了怎么办?(散列冲突) 2.数组不够用了怎么办?(动态扩容) 关于问题1,解决方案关键字:开放寻址法和链表法,其中链表法最常用,散列表数组的每个值存的结构体一部分是链表的地址,如果在插入时碰到哈希值(也就是数组下标)一致时,把相同元素插入到链表后边。查找时,如果哈希值相同了,则比较链表里的key,则能找到。其中有个优化,当链表超过8个时, 可以动态调整成红黑树,方便快速查找,而不至于查找时间复杂度为O(n),当链表少于8个时,动态调整成链表,方便查找更快(虽然map查找的时间复杂度是logn,但是当元素个数很少时,反而一个个比较会更快)。 关于问题2,解决方案关键字:渐进式rehash。 来源: https://www.cnblogs.com/workharder/p/11775329.html

Ubuntu16.04安装Redis

断了今生、忘了曾经 提交于 2019-12-03 02:33:08
https://www.cnblogs.com/zongfa/p/7808807.html Ubuntu16.04安装Redis 前言 Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速。用Redis可以很轻松解决高并发的数据访问问题;作为实时监控信号处理也非常不错。 环境 Ubuntu 16.04 安装Redis服务器端 ~ sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,我们检查Redis服务器程序 检查Redis服务器系统进程 ~ ps -aux|grep redis redis 4162 0.1 0.0 10676 1420 ? Ss 23:24 0:00 /usr/bin/redis-server /etc/redis/redis.conf conan 4172 0.0 0.0 11064 924 pts/0 S+ 23:26 0:00 grep --color=auto redis 通过启动命令检查Redis服务器状态 ~ netstat -nlt|grep 6379 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 通过启动命令检查Redis服务器状态 ~$ sudo /etc/init.d/redis-server

哈希表的java实现

孤街浪徒 提交于 2019-12-03 02:06:34
哈希表的java实现 什么是哈希表? 1.哈希表是通过关键码key来直接进行访问的一种数据结构 2.也就是它通过关键码来值映射到表中的一个位置来访问记录,进而加快访问的速度 3.存放记录的数组叫做散列表(哈希表) 哈希表的根据解决冲突方式不同分为的两种样式 1.分离链接法 2.线性探测法 散列函数 1.什么是散列函数? 简单的说,就是已知一个值value,通过将value代入散列函数就可以知道其在散列表中所存放的位置。 2.散列函数的例子 1.一般情况下如果输入的数字是整数,那么合理的方法就是直接返回key mod tablesize,也就是散列函数是f(x)=x%tablesize 2.其中x是数值,而tablesize则是整个表的大小 3.假如x=13,tablesize=4,那么通过将x代入散列函数可以得到13 mod 4=1,那么由此可以得出13应当放在散列表的1这个下标的位置 冲突的问题 为什么会产生冲突? 1.假如同时又两个值13,和17,tablesize=4,那么将这两个值都代入散列函数,分别得到他们的下标分别是1,1。 2.你会发现他们放的位置是一样的,但是table[1]这个位置只能放一个值,咋办?如果硬放的话一个值会把另外一个值覆盖掉,肯定不行 解决冲突的方法 1.分离链接法 这种方法,比较符合直接的思路,既然冲突,我们都将这两个元素放到这个位置

Redis内存模型及应用解读 读后随笔

余生长醉 提交于 2019-12-03 01:57:31
文章出处: Redis内存模型及应用解读 https://dbaplus.cn/news-158-2127-1.html 第一部分:Redis内存统计 随笔:这一部分略显枯燥,是通过redis-cli连接redis后对于info命令的结果字段解读,属于较底层的部分,熟悉redis在操作系统中的实现会更容易理解这部分。 这段对于我的帮助 1、redis进程运行本身会需要内存和内存碎片,同时redis中还存在虚拟内存 2、mem_fragmentation_ratio表示内存碎片比率,mem_fragmentation_ratio<1,说明Redis使用了虚拟内存,应及时排查,如内存不足需及时处理,可以增加Redis节点、增加Redis服务器的内存、优化应用等 3、redis中的内存分配器分为libc 、jemalloc和tcmalloc,默认是jemalloc 这一部分在日常开发中不会经常用到,除非redis出现一些读写问题时可以结合本章排查。 第二部分:Redis内存划分 随笔:本章主要介绍Redis中的内存划分,简明扼要,对于第一部分的理解也有帮助,对于下文的理解应该也很重要 这段对于我的帮助 1、redis的内存分为数据内存、进程本身运行需要的内存、缓冲内存和内存碎片 2、redis是一种数据库,使用键值对这种方式存储数据,类似hashMap,存储的数据类型包括字符串、哈希

Redis相关面试题

匿名 (未验证) 提交于 2019-12-03 00:44:02
1 、 Redis 和 memched 有什么区别?为什么单线程的 Redis 比多线程的 Memched 效率要高? 区别: 数据支持类型: Redis: String(字符串):key-value 类型 Hash(哈希):字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值 List(列表):实现消息队列 Set(集合):利用唯一性 Sorted Set(有序集合):可以进行排序 可以实现数据持久化 Bitmaps(位图) HyperLogLog、Geo(地理信息定位) Memched:简单的key/value数据类型 数据持久性: Redis:Redis通过RDB(Redis DataBase)与AOF(Append Only File)持久化,可以将内存中的数据保存到硬盘中,然后重启之后在读取数据。 这里说明一下RDB和AOF的原理: RDB:是在达到指定的时间或者操作次数后,自动将在内存中的数据写入磁盘(数据恢复时一致性和完整性较差,因为也许最后一次备份前就宕机了,适合数据量较大的数据恢复时候使用) AOF:是日志形式,当数据写入内存中的时候,在日志文件下记录下所有写操作。(数据量较大时,数据的恢复缓慢) 注意:如果不需要持久化的功能,可以关闭。如果想要达到持久化的效果,建议两者都使用(RDB,AOF) Memched