redis如何取hash的值

目录
  • redis取hash的值
  • redis中存值是Hash冲突如何解决
  • 总结

redis取hash的值

命令:可以取得对应的hash中的具体值

hmget s_account:208 account accountname

结果:“www”

如图

命令:取得hash中的所有key

hkeys s_account:208

结果:

redis中存值是Hash冲突如何解决

Redis 中的 Hash和 Java的 HashMap 更加相似,都是数组+链表的结构.当发生 hash 碰撞时将会把元素追加到链表上

我们先来了解下 hash 的内部结构.第一维是数组,第二维是链表.组成一个 hashtable.

在 Java 中 HashMap 扩容是个很耗时的操作,需要去申请新的数组,扩容的成本并不低,因为需要遍历一个时间复杂度为O(n)的数组,并且为其中的每个enrty进行hash计算。加入到新数组中

为了追求高性能,Redis 采用了渐进式 rehash 策略.这也是 hash 中最重要的部分.

redis在扩容的时候执行 rehash 策略会保留新旧两个 hashtable 结构,查询时也会同时查询两个 hashtable.Redis会将旧 hashtable 中的内容一点一点的迁移到新的 hashtable 中,当迁移完成时,就会用新的 hashtable 取代之前的.当 hashtable 移除了最后一个元素之后,这个数据结构将会被删除.

数据搬迁的操作放在 hash 的后续指令中,也就是来自客户端对 hash 的指令操作.一旦客户端后续没有指令操作这个 hash.Redis就会使用定时任务对数据主动搬迁.

正常情况下,当 hashtable 中元素的个数等于数组的长度时,就会开始扩容,扩容的新数组是原数组大小的 2 倍.如果 Redis 正在做 bgsave(持久化) 时,可能不会去扩容,因为要减少内存页的过多分离(Copy On Write).但是如果 hashtable 已经非常满了,元素的个数达到了数组长度的 5 倍时,Redis 会强制扩容.

当hashtable 中元素逐渐变少时,Redis 会进行缩容来减少空间占用,并且缩容不会受 bgsave 的影响,缩容条件是元素个数少于数组长度的 10%.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Redis Hash序列化存储的问题及解决方案

    目录 SDR序列化方式有多种 对Redis的存储设置是我自己写的 更改序列化方法 更改序列化方式 继续使用JdkSerializationRedisSerializer 这里说的是Spring Data Redis(一下简称SDR)设置Hash存储的序列化. SDR序列化方式有多种 如: StringRedisSerializer JdkSerializationRedisSerializer Jackson2JsonRedisSerializer OxmSerializer 等等 目前我有个需

  • Redis基本数据类型哈希Hash常用操作

    目录 Redis数据类型Hash常用操作 一.hset 二.hget 三.hmset 四.hmget 五.hgetall 六.hdel 七.hlen 八.hexists 九.hkeys 十.hvals 十一.hincrby 十二.hsetnx Redis数据类型Hash常用操作 redis里的hash是一个string类型的field(字段)和value(值)的映射表.特别适合用于存储对象,每个hash可以存储40多亿键值对. 熟悉python的童鞋可以想象成字典dict.之前的数据类型存储都是

  • RedisTemplate常用操作方法总结(set、hash、list、string等)

    目录 String类型 Hash类型 List类型 Set类型 zSet类型 Redis常用的数据类型: String Hash List Set zSet Sorted set String类型 保存和读取String(最常用的) System.out.println("缓存正在设置........."); redisTemplate.opsForValue().set("key1","value1"); redisTemplate.opsFo

  • redis删除hash的实现方式

    目录 redis删除hash方式 redis之hash类型 redis中存取hash类型 常用命令 hash命令小结 总结 redis删除hash方式 在工作中遇到删除hash类型的缓存时遇到了,怎样也删不掉redis里面的缓存,后来发现,hash类型和string类型的换成删除方式不一样,所以在这里做一下整理,后面再有遇到其他类型的,还会陆续的完善. 详细如下: 针对hash类型的缓存删除,函数: 因为需要删除很多缓存内容,所以在common.php写的公共函数进行调用, function p

  • Redis 存储对象信息用 Hash 和String的区别

    目录 前言 String Hash String 和 Hash 占用内存的比较 网友讨论 总结 前言 Redis 内部使用一个 RedisObject 对象来表示所有的 key 和 value,RedisObject 中的 type,则是代表一个 value 对象具体是何种数据类型,它包含字符串(String).链表(List).哈希结构(Hash).集合(Set).有序集合(Sorted set). 日常工作中我们存储对象信息的时候,一般有两种做法,一种是用 Hash 存储,另一种是 Stri

  • 浅谈Redis存储数据类型及存取值方法

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) String存取值: 是 redis 最基本的类型 一个 key 对应一个 value.value其实不仅是String,也可以是数字.string 类型是二进制安全的.意思是 redis 的 string 可以包含任何数据.比如jpg图片或者序列化的对象.string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512M

  • Redis 哈希Hash底层数据结构详解

    目录 1. Redis 底层数据结构 2. hashtable 3. redisDb 与 redisObject 4. ziplist 5. linkedlist 6. quicklist 1. Redis 底层数据结构 Redis数据库就像是一个哈希表,首先对key进行哈希运算得到哈希值再取模得到一个下标,每个元素是一个节点,节点之间形成链表.这感觉有点像Java中的HashMap. 不同的数据类型的实现方式是不一样的,可以通过object encoding命令查看底层真正的数据存储结构 同一

  • Redis Value过大问题(键值过大)

    Redis Big Key问题 数据量大的 key ,由于其数据大小远大于其他key,导致经过分片之后,某个具体存储这个 big key 的实例内存使用量远大于其他实例,造成内存不足,拖累整个集群的使用.big key 在不同业务上,通常体现为不同的数据,比如: 论坛中的大型持久盖楼活动: 聊天室系统中热门聊天室的消息列表: 带来的问题 bigkey 通常会导致内存空间不平衡,超时阻塞,如果 key 较大,redis 又是单线程,操作 bigkey 比较耗时,那么阻塞 redis 的可能性增大.

  • python与js进行MD5取hash有什么不同

    前言: 做渗透测试发现前端关键字进行了加密,并且对传递的参数进行签名,这导致我不能进行更改参数的值,本来打算使用JSforward进行绕过,结果尝试失败,于是最终还是通过python来写加密方法进行测试.js签名方法已经找到了,是通过MD5进行签名,进行md5时会加入服务器发放的AES秘钥(密码由AES加密),并且秘钥为固定秘钥,因此这里难度不大,但是遇到一个坑,那就python和js对json进行md5取hash,MD5结果值不一致,于是在网上寻找方法,最终还是找到了原因,接下来进行记录. 加

  • .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法

    当TextBox设置了ReadOnly="true" 后,要是在前台为控件添加了值,后台是取不到的,值为"空" 原理没想通,说不清楚微软是出于什么考虑的,不过有时是要我们能通过前台脚本来填充值,并不希望用户修改其控件内容,这时就比较尴尬了. 刚开始是换成Html 里的 <input type="text" readonly="readonly" > ,不过后来发现这个工作量是很大的, 所以网上搜了下,没找出Text

  • 在js文件中写el表达式取不到值的原因及解决方法

    今天在js文件中,写el表达式取不到值(代码如下),百度一翻,现总结如下: 1.javascript是客户端执行,EL是在服务端执行,而服务端比客户端先执行,所以取不到值 2.要想获取"${isLogin}"的值,可以在jsp中,用一个全局变量接收,然后再js中使用 3.注意:在使用时,注意要添加双引号,如var isLogin="${isLogin}"; 复制代码 代码如下: $(function(){ var isLogin="${isLogin}&q

  • asp.net下Request.QueryString取不到值的解决方法

    今天做新的ppc weather服务器的时候竟然碰到QueryString取不到值的问题 查了下网上,应该是编码的问题,tq121用的是utf-8,而我希望用gb2132输入~ 因此,改一下~哈哈 打开web.config把 <!-- <globalization              requestEncoding="utf-8"              responseEncoding="utf-8"     /> 改成 <glob

  • java中Servlet Cookie取不到值原因解决办法

    java中Servlet Cookie取不到值原因解决办法 现象: 在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到值; 但是用request.getCookies()却不行 Cookie mycookies[] = request.getCookies(); 中永远获取不到uid的值:(80端口号除外) 原因: 查了浏览器的具体cookie值,发现 http://localhost:8080/ 访问的时候,cookie值

  • layui 富文本赋值,取值,取纯文本值的实例

    layui 富文本赋值: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>layui</title> <meta name="renderer" content="webkit">

  • 易语言取文件MD5值的方法

    互联网每天都在传输着数以亿计的数据,方便了我们的工作和学习.保持数据或信息的完整性一直是人们关注的话题,我们利用终端设备发送或接受数据是可控的,但数据在传输过程中会受到不可预计的威胁,究竟数据在传输过程是否受到干扰或受到干扰后数据是否会发生变化,我们是不可预知的.那么,如何判断数据或是否完整呢?这就不得不提到一个名词-"MD5值",每一个文件数据的MD5值都是唯一的,这样我们就可以通过判断MD5值来确定数据的完整性.目前,"MD5"的应用已经相当广泛. 1.首先,准

随机推荐