Redis数据类型

Redis数据类型简介:

  Redis支持字符串、哈希表、列表、集合、有序集合、位图、地理位置和HyperLogLog这八种数据类型。Redis的所有数据结构都以唯一的key字符串作为名称,然后通过这个唯一的key值获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。

1、字符串(string)

  Redis的字符串时动态字符串,是可以修改的字符串,内部结构类似于Java的ArrayList。它采用预分配冗余空间的方式来减少内存的频繁分配,内部为当前字符串分配的实际空间capacity一般要高于实际字符串长度len。当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB的空间。需要注意的是字符串最大长度为512MB。
  常见用途:
  存储用户信息。存储对象时,将用户对象使用JSON序列化成字符串,然后塞进Redis来缓存。取出对象时,将JSON字符串反序列化用户对象。

2、列表(list)

  Redis的列表相当于Java的LinkedList,注意它时链表而不是数组。这意味着list的插入与删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。列表中的每个元素之间都使用双向指针顺序连接,同时支持前后向遍历。当列表弹出最后一个元素时,该数据结构被自动删除,内存被回收。
  常见用途:
  充当异步队列。一个线程将需要延后处理的任务结构体序列化成字符串,塞进Redis的列表,另一个线程从这个列表中轮询数据进行处理。

3、字典(hash)

  Redis的字典相当于Java语言里面的HashMap,如下图所示,它是无序字典,内部存储了很多键值对。实现结构上与HashMap也是一样的,都是 “数组 + 链表” 形式的二维结构,第一维hash的数组位置碰撞时,就会将碰撞的元素使用链表串联起来。
  不同的是,Redis的字典的值只能是字符串,另外它们的rehash的方式也不一样。因为Java的HashMap在字典很大时,rehash是个耗时的操作,需要一次性全部rehash。Redis为了追求高性能,不能堵塞服务,所以采用渐进式的rehash策略。
  渐进式的rehash会在rehash的同时,保留新旧两个hash结构,查询会同时查询两个hash结构,然后在后续的定时任务或者hash操作指令 (hset、hdel) 中,循环渐进地将旧hash的内容一点点地迁移到新的hash结构中。当搬迁完成后,就会使用新的hash结构取而代之。当hash移除了最后一个元素之后,该数据结构被自动删除,内存被回收。

  常见用途:
  存储用户信息,可以对用户结构中每个字段单独操作。

4、集合(set)

  Redis集合相当于Java中的HashSet,它内部存储的值是无序的、唯一的。它的内部相当于一个特殊的字典,只不过字典中的所有的value都是一个值NULL。当集合中最后一个元素被移出之后,数据结构被自动删除,内存被回收。
  常见用途:
  存储活动中中奖的用户ID,因为自带去重功能,可以保证同一个用户不会中奖两次。

5、有序集合(zset)

  Redis有序集合,如下图所示,类似于Java的SortedSet和HashMap的结合体。一方面它是一个set,保证了内部value的唯一性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重。它内部实现用的是一种叫作 “跳跃列表” 的数据结构。zset中最后一个value被移除后,数据结构被自动删除,内存被回收。

  常见用途:
  1、zset可以用来存储粉丝列表,value值是粉丝的用户ID,score是关注时间。实现对粉丝列表按关注时间进行排序。
  1、zset可以用来存储学生成绩,value值是学生的ID,score是学生的成绩。对成绩进行排序得到其名次。

6、位图(bitmap)

  Redis在2.2.0版本添加了对位图bitmap的支持。bitmap是一串连续的二进制数字 (0或1),每一位所在的位置为偏移 (offset),在bitmap上可执行AND,OR和XOR以及其它位操作。
  常见用途:
  统计日活跃用户或者网站页面访问量。

7、地理位置

  Redis在3.2.0版本添加了对地理位置 (GEO) 的支持。它使用geohash保存地理位置的坐标,使用有序集合 (zset) 保存地理位置的集合。
  常见用途:
  1、根据经纬度查找地理位置;
  2、根据地理位置计算经纬度;
  3、根据地理位置,计算两地距离。

8、HyperLogLog

  Redis在2.8.9版本添加了HyperLogLog数据结构。HyperLogLog是用来做基数统计的算法。它的优点是,在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。
  在Redis里面,每个HyperLogLog键只需要占12KB的存储空间。在计数比较小时,它的存储空间才用稀疏矩阵存储,空用占用很小,仅仅在计数慢慢变大,稀疏矩阵占用空间渐渐超过阈值时,才会一次性转变成稠密矩阵,才会占用12KB的内存。HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身。它提供不精确的去重计数方案,标准误差是0.81%。
  常见用途:
  统计网站页面访问量。

Redis支持多种数据类型,包括string、hash、list、set和sorted set等。其中,string是最基本、最简单的数据类型,用于存储字符串。 Hash是用于存储键值对的数据结构,其中的value只能存储字符串,不允许存储其他数据类型,也不存在嵌套现象。每个hash可以存储232 - 1个键值对,并可以灵活添加或删除对象属性。但需要注意的是,hash类型并不适合存储大量对象,也不应该将hash作为对象列表使用,因为遍历整体数据的效率可能会较低。 除了string和hash类型,Redis还支持list、set和sorted set等数据类型。List是一个有序的字符串列表,可以进行插入、删除和查找等操作。Set是一个无序的字符串集合,可以进行元素的添加、删除和查找操作,并且不允许重复元素的存在。Sorted Set是一个有序的字符串集合,每个元素都有一个对应的score,可以根据score进行排序和范围查找。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis 数据类型](https://blog.csdn.net/weixin_52851967/article/details/122670564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值