复述,中哈希类型有什么用

介绍

这篇文章将为大家详细讲解有关复述,中哈希类型有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

散列类型是字符串类型的字段和值映射表,或者说是一个字符串集合,它特别适合存储对象,相比较而言,将一个对象类型存储在散列类型里要比存储在字符串类型类,占用更小的内存空间,并方便存取整个对象。

在复述中,哈希类型是指键值本身又是一个键值对结构,形如:value=https://www.yisu.com/zixun/{{field1, value1}, {field2, value2}, {fieldN,家}},

常用命令:

hget, hset, hgetall等。

应用场景:

我们简单举个实例来描述下哈希的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:

用户ID为查找的钥匙,

存储的价值用户对象包含姓名名称、年龄年龄,生日生日等信息。

如果用普通的键/值结构来存储,主要有以下2种存储方式:

第一种方式将用户身份证作为查找钥匙,把其他信息封装成一个对象以序列化的方式存储,

如:设置u001“李三,18,20010101,

这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入中科院等复杂问题。

第二种方法是这个用户信息对象有多少成员就存成多少个键-值对,用用户身份证+对应属性的名称作为唯一标识来取得对应属性的值,如:mset用户:001:名字“李三“用户:001:age18用户:001:生日,20010101,

虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

那么复述,提供的哈希很好的解决了这个问题,复述的哈希实际是内部存储的值为一个HashMap,并提供了直接存取这个映射成员的接口。

如:hmset用户:001名“李三”;18岁的生日,20010101,

也就是说,关键仍然是用户ID,价值是一个地图,这个映射的键是成员的属性名,值是属性值,这样对数据的修改和存取都可以直接通过其内部映射的键(复述里称内部映射的键为字段),也就是通过关键(用户ID) +字段(属性标签)操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。这里同时需要注意,复述,提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部地图的成员很多,那么涉及到遍历整个内部地图的操作,由于复述,单线程模型的缘,故这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。

实现方式:上面已经说到复述,哈希对应的价值内部实际就是一个HashMap,实际这里会有2种不同实现,这个散列的成员比较少时复述,为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的价值redisObject的编码为zipmap,当成员数量增大时会自动转成真正的HashMap,此时编码为ht。

关于复述,中哈希类型有什么用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

复述,中哈希类型有什么用