Loading

Redis初探-十个数据结构

Redis初探-十个数据结构

String

键值对。

使用场景

  • 1.session 利用redis做session共享内存
  • 2.记录网站的请求数量、论坛的点赞数、评论数。(自增和自减)

编码

-int :保存 long型64位有符号整数
-embstr:保存长度小于44字节的字符串
-raw:保存长度大于44字节的字符串,这个编码比较消耗空间的开辟

在功能中,出了非必要的情况,尽量不要使用string类型,会浪费大量的内存空间。

Hash

官网推荐使用hash。
所有hash的命令都是 h 开头的 hget 、hset 、 hdel 等。
hash本身是一个对象,一种键值对。

hash最典型的使用场景

储存一个用户对象。

key=1 
values={id:1,name:'张三',address:'中国'}

如果用string去存,当需要修改其中一个值,先把数据拿到代码内存,然后反序列化,然后修改值,然后序列化,再存到redis中。
而如果直接使用hash,则值需要制定修改具体某一个字段的值就可以了。

hash 的两种数据结构

ziplist、hash。

ziplist

压缩版的list 。(动态的数组,数组的每一个元素的空间是一样的)

特点

  • 1.每次插入都有开辟空间,连续的。
  • 2.你要查询的时候,需要从头开始,导致查询的速度变慢。

hash

在hash的数据结构中,它的时间复杂度是O(1);
当快速的查询结果,节省空间。

特点

hash后面链表越来越长的时候,时间复杂度变高变慢。

解决的方式

扩容。举例:假设,有两个hash结构在存储数据,第一次只有一个是有长度,一个是没有长度。数据交替进行迁移。

迁移方式

  • 每一次操作只会迁移一部分。
  • 迁移是后台任务,保证数据的一致。
    由于hash不管是从内存还是性能方面,都是比较优秀,所以官网推荐使用hash。。。扩容是有阈值。不会随便扩的。

List

形式

  • 队列(先进先出)
  • 栈:(先进后出)
  • 普通的集合。

使用场景

插队、队列、分页场景。比如使用消息队列记录日志。对程序错误的文本日志、数据库日志记录等。如果不想用list做消息队列,也可以直接用提供的专门的消息发布来做。

过期设置说明

只能给整个集合设置,不能单独给某一个元素设置,没有给单独元素设置过期时间的策略。

Set

也是一个集合,只不过是一个去重的集合。

使用场景

  • 投票-- 根据ip地址来投票,每一个ip只投一票,系统自动会去重。 取交集和去并集。
    a:{1,2,3,4,5}
    b:{2,3,4,5,6}
    a和b的交集= {2,3,4,5}
    a和b的并集=
  • qq好友推荐里面用的比较多

Zset

也是去重的集合,具有set的功能,比set多了一个分数。

使用场景

做服务注册与发现,抽奖、限流、排行榜。

特点

  • 自动排序
  • 跳跃表。

BitMaps

节省内存的数据结构,本质是一个二进制数组。

使用场景

日活跃用户。

HyperLogLog

基准统计数据结构类型。

使用场景

投票。网页浏览统计,访问量等等这些不是特别需要准确的数据。

特点

  • 使用少量的内存,存放大量的数据。
  • 统计的结果有误差,可以忽略不计
  • 能节省大量内存

Streams

本质上是在Redis内核上实现的一个消息发布订阅功能组件。

使用场景

发布订阅,类似kafak的生产者和消费者的模型。

特点

业务用的上,内部组件,用的比较多。

Geo

主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
不同key存储的就是一个经度和纬度。可以计算俩个key之间的距离。。

Bloom Filter

布隆过滤器,空间效率的概率型数据结构,用来判断一个元素是否在集合中。

特点

  • 1.存储数据,牺牲了一定的准确率换取空间效率,但是会带来假阳性(False positive)的错误。
  • 2.在判断一个元素在集合中的时候,会出现一定的错误率,这个错误率称为False positive的。通常缩写为fpp.
  • 3.数组长度和误判的关系:
    bit数组越长,hash的方法越多,则占用内存越多,但是误判的概率就小。
    bit数组越短,hash方法越少,则占用的内存越少,但是误判的概率就大。。。
posted @ 2021-05-24 17:03  ChrisLeon  阅读(73)  评论(0)    收藏  举报