redis有哪些存储模式

redis有哪些存储模式,第1张

Redis支持多种数据结构和存储模式,其中包括:

字符串(String):字符串类型是Redis最基本的数据类型,它可以包含任何数据,比如文本、整数或二进制数据等。

哈希(Hash):哈希类型存储的是键值对集合,这些键值对可以是字符串类型的,也可以是数字类型的。

列表(List):列表类型是一个有序的字符串列表,可以添加、删除和插入元素。

集合(Set):集合类型存储的是一组唯一的无序元素,支持添加、删除和查询 *** 作。

有序集合(Sorted Set):有序集合类型存储的是一组有序的元素,每个元素都有一个分数(score),可以根据分数进行排序。

此外,Redis还支持多种不同的持久化模式,包括:

RDB持久化模式:在指定时间间隔内将内存中的数据保存到磁盘中。

AOF持久化模式:将所有对Redis数据库的写 *** 作记录下来,可以通过回放这些日志文件来恢复数据库。

混合持久化模式:同时使用RDB和AOF两种持久化模式,以保证数据的可靠性和恢复速度。

xx的模型分计算,由于客户对响应要求比较高,要求在20ms内就需要返回, 同时QPS要求为60W .

所以存储这一块的选则就是使用的Redis的集群(无主从,更多资源用来存储,同时高可用要求不高)

一开始使用最直接使用了String的Key-Value入库 结果,才入了八亿的数据,内存就去到了140g .对单点分析之后得出对象数量3000w, 数据内存消耗:2.72g,大约一条记录数据大小是97字节,但实际节点占用内存:5.13g . 运维给出来的答复是 :

数据量: 50亿+

数据格式: MD5(imei) :Score1(double),Score2(double)

单条纯数据量: 32字节

首先ZipList是作为Redis的一种底层数据结构, 在一定条件下可作用于HashTable,List,Set的底层实现,

由于其设定是使用一整块的连续内存 (可看似数组结构) ,减少了内存碎片的产生,同时在提供了较高的效率 .

由于ZipList的初始是申请一个连续的长度为zlbytes的内存 , 所以正常情况下对ZipList的修改都会触发内存的重分配, 同时有可能发生数据的复制开销比较大.

这也是ZipList不适合用于存放过大量数据.

以下是HashTable底层使用ZipList的相关配置:

要使用ZipList作为存储结构,所以使用HashTable的时候要将entry的数量控制在ZipList的hash-max-ziplist-entries阈值内 ( 极光这里配置的是256 先不做修改,按这个条件来 )

根据上面的需要将entry数量控制再256以内 , 所以按照50亿的总数量计算的话那么, Redis Key 的KeyNum应该是:

这里的KeyNum根据实际情况可以预估大一点以备数据量增加

通过上一步我们确定了KeyNum的范围 ,那么这一步就要考虑如何将要做的就是找到一个确定的数量使得我们50亿的数据可以均匀的分布再这 KeyNum 个HashTable里

如下图所示,我们的Key是32位的MD5(imei), 为了达到更好的内存合理使用,所以这里考虑将这32位的十六进制拆分成两部分, 一部分作为Redis的Key,一部分作为HashTable的field.

如果 使用六位的 十六进制作为Redis Key那么他的KeyNum为:

2^24 = 16,777,216

同理 七位 :

2^28 = 268,435,456

同理 八位 :

2^32 = 4,294,967,296

与上面 计算出来的 19,531,250比较, 使用七位的十六进制作为Key 的话,那么理论上他的每个HashTable的Entries数量就是大概20个左右. 所以直接选择了7位的十六进制

这里六位的十六进制也可以选择的,只需要将上述的hash-max-ziplist-entries 配置的稍微大一点,但是带来的就是hget的时候会比七位十六进制的慢. 由于没有做过hget差异实验 ,所以就保险的先选择7位.

如下图所示,进行拆分,由于七位的十六进制 只有3.5个字节,所以这里需要补一个十六进制的 '0' 凑整4个字节.

为了使切分七位十六进制后的数据更均匀分布,应该对选择的目标七位十六进制进行groupBy,然后看看,数据分布的是不是足够的均匀. 假设,如果有大量MD5(imei) 的前七位都是零,那么就会造成 key为00000000的这个HashTable 过于庞大,而没法使用ZipList . 经过对玖富的数据进行分析,最终选取后七位

1.可以通过减少RedisKey的数量, 达到增加每个HashTable的Entry的数量,达到内存缩减

1、首先找到redis的安装目录,如下图测试环境目录,进入到/opt/install/redis-2.8.19/src,如下图所示。

2、需要注意,一般情况下是在redis的安装目录下,有时也会在bin目录下,如下图所示。

3、进入到该目录后,执行linux命令启动redis,命令为:./redis-cli -h 127.0.0.1 -p 6379。

4、查看当前key值:依次get这两个值:get key值。

5、ttl查询过期时间,如图通过ttl的方法加key值,就可以快速查询到过期时间。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11721350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存