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 ...
随机推荐
- wordpress插件:multiple post thumbnails(可为文章添加多个特色图片)
我们经常会给wordpress的文章加上特色图片来实现日志缩略图的需求,但是很多时候一张图片并不能够完美而又全面的表达我们wordpress文章的内容,这时候您可能就会需要这样一个能让wordpres ...
- 【Canvas真好玩】从黑客帝国开始
前言 笔者之前有一段时间一直在学习Canvas相关的技术知识点,通过参考网上的一些资料文章,学着利用简单的数学和物理知识点实现了一些比较有趣的动画效果,最近刚好翻看到以前的代码,所以这次将这些代码实践 ...
- 浅谈OI中的底层优化!
众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ...
- 『题解』Codeforces9D How many trees?
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description In one very old text file there was wr ...
- sublime3中运行python文件
sublime3中运行python文件 tools->build system->new build stystem 粘贴下面代码{"cmd":["pytho ...
- MySQL原生PHP操作-天龙八步
<?php //1.第一步[建立连接] $conn = mysqli_connect('localhost','root','123456') or die('数据库连接失败!'); //2.第 ...
- lqb 基础练习 杨辉三角形
基础练习 杨辉三角形 时间限制:1.0s 内存限制:256.0MB 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的 ...
- nyoj 63-小猴子下落 (模拟)
63-小猴子下落 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:2 submit:5 题目描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同 ...
- 领扣(LeetCode)两个数组的交集II 个人题解
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...
- 逆向分析objc,所有类的信息都能在动态调试中获取。
因为objc是动态绑定的,程序运行时必须知道如何绑定,依靠的就是类描述.只要知道类描述是如何组织的就可以获取一切有用的信息.不知道是幸运还是不幸,这些信息全部都在运行的程序中.即使没有IDA这样的工具 ...