redis讨论下string底层数据结构及应用场景

236 阅读1分钟

概述

了解string数据结构,还是非常有必要的.谈到数据结构就必须要谈两个问题,一个是时间复杂度,一个是空间.redis作为缓存,一个涉及访问速度,一个涉及占用内存空间,对于redis来说还是非常敏感的.

数据结构图

redis整体结构图 image.png

entry结构图

image.png

1.从redis整体结构图来看,只要是个全局key,意味着都会占用一个全局hash表元素

2.从entry结构图来看,entry默认就要分配key,value,next24字节的指针本省消耗
  分配数量是2的幂次方,会分配32字节
  
3. 只要是属于全局key,那么就要占用一个entry,就要多分配出32字节(不适合数据数据多场景)

4.不管是string类型,还是hash,set,list,sorted,都是一个RedisObject类型,不同的是
  string类型,在ptr指针指向的数据结构不一样,string数据结构是SDS(simple dynamic string)
  
5.string可以存储整数,小于44短字符串,大于44长度字符串,SDS分别采用int embstr,raw编码方式,
  这样带来的效果也不一样,可以对空间做进一步优化

使用场景

1.string适合于单个或者少数健值对的缓存场景,数据条数多不建议使用string,因为单entry
  每次就要消耗32字节,这种情况可以考虑集合类型

2.计数器场景,可以记录一些博客点赞,评论,阅读数这些

3.限速器场景,短信,邮件发送频率

4.分布式ID生成,在分库分表场景下

5.session共享的场景下,解决单点登录问题