/*
* Redis应用之Hash数据类型
* 问题1:操作命令
* 问题2:存储实现原理和数据结构
* 问题3:应用场景
* */
先了解下什么是hash,什么是hash碰撞:
hash:是包含键值对的kv的数据结构,是一个无序的散列表。
碰撞:任意一个字符串经过hash算法之后都会输出一个固定长度的字符串,当发现输出的固定长度字符串的值一样的时候我们称之为hash碰撞(发生的概率很小)
1、操作命令:
存:
hset h1 f 6
hset h1 e 5
hmset h1 a 1 b 2 c 3 d 4
取:
hget h1 a
hmget h1 a b c d
hkeys h1
hvals h1
hgetall h1
key操作:
hget exists h1
hdel h1
hlen h1 2、存储原理:Redis的Hash是一个KV的结构,类似java中的hashMap,外层的hash只用到了hashtable。当存储hash数据类型的时候我们称之为内层hash,
内层hash由两种数据结构来实现:ziplist(压缩列表)和hashtable(hash表)。
ziplist:特殊编码实现的双向链表(时间换空间的方式节约内存,也就是牺牲部分读写性能来换取高效的内存空间利用率)只用在字段个数少,字段值小的场景中。
hash表:被称之为字典dict。 下面是hash数据结构图:


2、存储结构:KV的数据结构=数组+链表的结构。看一下hash的存储结构图:

文字说明:
在redis中把hash放到了一个dict字典中,字典里面又有两个dictht(hash表),两个hash表中分别有两个数组存取dictEntry,每个数组都是以链表的形式来存储的,为什么要用链表呢?
是因为数据存储的时候可能会发生了hash碰撞他是用链表的拉链法来解决的,当hash碰撞达到5次的时候,这个时候他就失去了hash本身的效率他就变成了一个链表了,所以他有两个hash表来存储,只不过第二个hash表
他是空的,当他发现hash碰撞达到5次的时候就会自动将数据放到第二个hash表中,也就是常说的rehash,第二个hahs表的作用就是为了进行rehash来实现自动扩容,防止dictEntry[*]中挂载的dictEntry多的时候失去hash本身的性能。
说明一下dictE[*]中每一个数组挂载的节点数为一个的时候性能最高。(链地址法:每一个及节点下面只有一个dictEntry的时候效率最高。)
3、应用场景:
string可以做的东西,hash基本上都可以,除了bit(位)操作。
购物车(增加、删除、全选商品,以及商品数)
课题之外总结:
根据上节的String来比对一下hash,分析两者的区别:
1)、String和hash都是用字符串存储的,那么他们俩有什么区别呢?
当存储一张表的数据的时候String存储是使用mset student:1:sno:aaa将多个列放在key中存储的,key是通过SDS来存储的,如果表的数据字段比较多的时候那么他的key就会比较长,这样是很占用内存空间的。
hash优势:hash会把key聚合起来这样key就很短节省内存空间,并且会减少key的冲突,批量取值的时候可以充分利用cpu并且减少io的操作。
hash的弊端:不支持单个列的过期时间,value过大不支持分布式存取(不支持分片)


redis数据类型--hash的更多相关文章

  1. redis 数据类型 Hash

    Redis 数据类型Hash:hash数据类型存储的数据和mysql数据库中存储的一条记录很类似. hash的一些操作: 比如数据库是user表,有id,name,age ,sex,可以建立与之对应的 ...

  2. redis 数据类型Hash

    redis的Hash数据类型: hash数据类型 Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. 创建map: hmset map c & ...

  3. Redis数据类型Hash

    Redis的Hash有点像一个对象(object),一个Hash里面可以存多个Key-Value对作为它的field,所以它通常可以用来表示对象.Hash里面能存放的值也能作为String类型来存储, ...

  4. Linux+Redis实战教程_day02_3、redis数据类型_4、String命令_5、hash命令_6、java操作redis数据库技术

    3. redis数据类型[重点] redis 使用的是键值对保存数据.(map) key:全部都是字符串 value:有五种数据类型 Key名:自定义,key名不要过长,否则影响使用效率 Key名不要 ...

  5. Redis数据类型之散列类型hash

    在redis中用的最多的就是hash和string类型. 问题 假设有User对象以JSON序列化的形式存储到redis中, User对象有id.username.password.age.name等 ...

  6. Redis数据类型之Hash(二)

    前言: Redis hash是一个String类型的field和value的映射表.添加.删除操作复杂度平均为O(1),为什么是平均呢?因为Hash的内部结构包含zipmap和hash两种.hash特 ...

  7. 缓存数据库-redis数据类型和操作(hash)

    一:Redis 哈希(Hash) Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 ...

  8. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  9. redis数据类型及使用场景

    Redis数据类型  String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令:  set,get,decr,incr,mge ...

随机推荐

  1. JavaScript权威指南----一个JavaScript贷款计算器

    废话不多说上例子代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  2. 七月月赛T1

    题目背景 借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了! 题目描述 现有 2^n\times 2^n (n\le10)2n×2n(n≤10) 名作弊者站成一个正方形方阵等候 kkksc03 ...

  3. Elasticsearch生产环境遇到的问题以及解决方案

    Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务.它是基于Apache Lucene搜索引擎的类库创建的,提供了全文搜索能力.多语言支持.专门的查询语言.支持地理位置服务.基 ...

  4. LocalDate类

    LocalDate类与Date类不同.Date类是距离一个固定时间点的毫秒数(UTC 1970.1.1 00:00:00) Date类表示时间点,LocalDate类用来表示日历表示法. import ...

  5. XML解析之Jsoup

    操作xml文件 解析(读取):将文档中的数据解读到内存中 写入:将内存中的数据保存到XML文档中.持久化的存储 解析xml的方式 DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树 优点 ...

  6. Kubernetes Horizontal Pod Autoscaling

    HPA介绍 Horizo​​ntal Pod Autoscaler基于观察到的CPU利用率(或借助自定义指标 支持,基于其他一些应用程序提供的指标)自动缩放复制控制器,部署或副本集中的Pod数量 .请 ...

  7. (二十一)golang--字符串中的函数

    golang中ascii对应的字符占一个字节,而汉字占三个字节. (1)统计字符串的长度len (2)字符串遍历,同时处理有中文的问题r:=[]rune(str) (3)字符串转整数:n,err:= ...

  8. 打包上传被拒 Guideline 2.5.1 - Performance - Software Requirements

    打包上传被拒 Guideline 2.5.1 - Performance - Software Requirements 在项目中全部搜索:prefs:root 找到后,把这个私有的 NSURL *u ...

  9. 力扣(LeetCode)猜数字大小 个人题解

    我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字.每次你猜错了,我会告诉你这个数字是大了还是小了.你调用一个预先定义好的接口 guess(int n ...

  10. CentOs虚拟机配置

    1.打开“VMware”,点击“主页”,点“创建新的虚拟机”: 2.会弹出一个“新建虚拟机向导”,类型选择“典型”,点击“下一步”: 3.选择“稍后安装操作系统”,点击“下一步”: 4.我们用的是Li ...