redis数据类型--hash
/*
* 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的更多相关文章
- redis 数据类型 Hash
Redis 数据类型Hash:hash数据类型存储的数据和mysql数据库中存储的一条记录很类似. hash的一些操作: 比如数据库是user表,有id,name,age ,sex,可以建立与之对应的 ...
- redis 数据类型Hash
redis的Hash数据类型: hash数据类型 Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. 创建map: hmset map c & ...
- Redis数据类型Hash
Redis的Hash有点像一个对象(object),一个Hash里面可以存多个Key-Value对作为它的field,所以它通常可以用来表示对象.Hash里面能存放的值也能作为String类型来存储, ...
- Linux+Redis实战教程_day02_3、redis数据类型_4、String命令_5、hash命令_6、java操作redis数据库技术
3. redis数据类型[重点] redis 使用的是键值对保存数据.(map) key:全部都是字符串 value:有五种数据类型 Key名:自定义,key名不要过长,否则影响使用效率 Key名不要 ...
- Redis数据类型之散列类型hash
在redis中用的最多的就是hash和string类型. 问题 假设有User对象以JSON序列化的形式存储到redis中, User对象有id.username.password.age.name等 ...
- Redis数据类型之Hash(二)
前言: Redis hash是一个String类型的field和value的映射表.添加.删除操作复杂度平均为O(1),为什么是平均呢?因为Hash的内部结构包含zipmap和hash两种.hash特 ...
- 缓存数据库-redis数据类型和操作(hash)
一:Redis 哈希(Hash) Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
- redis数据类型及使用场景
Redis数据类型 String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mge ...
随机推荐
- 《JS高程》-教你如何写出可维护的代码
1.前言 在平时工作开发中,大部分开发人员都花费大量的时间在维护其他人员的代码.很难从头开始开发新代码,很多情况下都是以他人成果为基础的,或者新增修改需求,自己写的代码也会被其他开发人员调用,所以 ...
- 用python实现对元素的长截图
一.目标 浏览网页的时候,看见哪个元素,就能截取哪个元素当图片,不管那个元素有多长 二.所用工具和第三方库 python ,PIL,selenium pycharm 三.代码部分 长截图整体思路: 1 ...
- go中的数据结构切片-slice
1.部分基本类型 go中的类型与c的相似,常用类型有一个特例:byte类型,即字节类型,长度为,默认值是0: bytes = []btye{'h', 'e', 'l', 'l', 'o'} 变量byt ...
- SysTick系统定时器
1.SysTick定时器介绍 SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个 外设,被嵌入在 NVIC 中.它是一个24 位向下递减的定时器,每计数一 次所需时间为 ...
- python经典面试算法题4.1:如何找出数组中唯一的重复元素
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [百度面试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐ 题目描述 ...
- python面试题2.1:如何实现栈
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 2.1 如何实现栈 [阿里巴巴面试题] 难度系数:⭐⭐⭐ 考察 ...
- pandas处理excel的常用方法技巧(上)
1. 导库 import pandas as pd 2. 读取excel文件 这里要注意的就是第二个参数header如果不设置,pandas会默认把excel的第一行当作columns,header= ...
- springcloud微服务基于redis集群的单点登录
springcloud微服务基于redis集群的单点登录 yls 2019-9-23 简介 本文介绍微服务架构中如何实现单点登录功能 创建三个服务: 操作redis集群的服务,用于多个服务之间共享数据 ...
- 通过 position:fixed 实现底部导航
通过 position:fixed 实现底部导航 HTML <div id="footer">页脚</div> CSS #footer { clear: b ...
- Test Complete 的自动化测试 --- 三角形
Test Complete 的自动化测试 --- 三角形 PS:工具:Test Complete , OS:win 10 这里做三角形的测试与上一篇博客做计算器的测试大致一样,都是对.exe的执行文件 ...