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方法越少,则占用的内存越少,但是误判的概率就大。。。

浙公网安备 33010602011771号