泉州网站建设的步骤,做视频课程的网站有哪些,浙江省工程建设监理管理协会网站,网页快照网站摘要 Redis是一款著名的key-value内存数据库软件#xff0c;同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型#xff0c;同时每种数据结构类型针对不同的应用场景又支持不同的编码方式。这篇文章主要介绍压缩列表编码… 摘要 Redis是一款著名的key-value内存数据库软件同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型同时每种数据结构类型针对不同的应用场景又支持不同的编码方式。这篇文章主要介绍压缩列表编码在理解压缩列表编码原理的基础上介绍Redis对压缩列表的应用最后再对Redis压缩列表应用进行分析。 Redis压缩列表原理与应用 压缩列表是一种数据结构这种数据结构的功能是将一系列数据与其编码信息存储在一块连续的内存区域这块内存物理上是连续的逻辑上被分为多个组成部分其目的是在一定可控的时间复杂读条件下尽可能的减少不必要的内存开销从而达到节省内存的效果这么介绍有点玄乎我们先一起看看它的实现原理吧Redis3.2版本中作者对压缩列表的实现在ziplist.h和ziplist.c中。 压缩列表原理 我认为将数据按照一定规则存储在内存中可以用“编码”这个词描述因此下面会常用“编码”这个词。 总体编码 上面说到压缩列表是一块连续的内存区域这块内存区域布编码示意图大致如下 Redis压缩列表内存编码示意图 常态的压缩列表内存编码如上图所示整个内存块区域内分为五个部分下面分别介绍着五个部分 zlbytes存储一个无符号整数固定四个字节长度用于存储压缩列表所占用的字节当重新分配内存的时候使用不需要遍历整个列表来计算内存大小。 zltail存储一个无符号整数固定四个字节长度代表指向列表尾部的偏移量偏移量是指压缩列表的起始位置到指定列表节点的起始位置的距离。 zllen压缩列表包含的节点个数固定两个字节长度源码中指出当节点个数大于2^16-2个数的时候该值将无效此时需要遍历列表来计算列表节点的个数。 entryX列表节点区域长度不定由列表节点紧挨着组成。 zlend一字节长度固定值为255用于表示列表结束。 列表元素编码 上面介绍了压缩列表的总体内存布局对于初entryX区域以外的四个区域的长度都是固定的下面再看看entryX区域的编码情况。 每个列表节点由三部分组成 压缩列表节点编码示意图 每个压缩列表节点区域头部包含两部分一部分叫做previous length另一部分叫encoding最后是主体内容叫做content下面分别介绍他们 previous length 用于存储上一个节点的长度因此压缩列表可以从尾部向头部遍历即当前节点位置减去上一个节点的长度即得到上一个节点的起始位置。previous length的长度可能是1个字节或者是5个字节如果上一个节点的长度小于254则该节点只需要一个字节就可以表示前一个节点的长度了如果前一个节点的长度大于等于254则previous length的第一个字节为254后面用四个字节表示当前节点前一个节点的长度。这么做很有效地减少了内存的浪费。 encoding 节点的encoding保存的是节点的content的内容类型以及长度encoding类型一共有两种一种字节数组一种是整数encoding区域长度为1字节、2字节或者5字节长。Redis作者巧妙的利用了前两个字节来表示content存储的内容类型和encoding区域的长度我们先看看字节数组类型的encoding内容 content为字节数组的encoding内容 再看看整数编码类型的encoding内容 content为整数的encoding内容 content content区域用于保存节点的内容节点内容类型和长度由encoding决定上面可以看出目前content的内容类型有整数类型和字节数组类型且某些条件下content的长度可能为0。 相信到这里我们都明白了压缩列表的原理压缩列表并不是对数据利用某种算法进行压缩而是将数据按照一定规则编码在一块连续的内存区域目的是节省内存。下面我们看看压缩列表在Redis中的应用领域。 Redis中压缩列表的应用 Redis中不同的数据类型广泛地应用了压缩列表编码整理如下表 Redis中数据结构类型与压缩列表的应用 上表总结了压缩列表编码在Redis不同的数据类型中的应用Redis一共支持五种数据结构类型其中有三种数据结构在一定条件下会应用压缩列表至于什么条件后面会分析值得一提的是Redis当前支持的GEO地理位置对压缩列表也有应用具体此处不做讨论。 4.1.3 LinearSVC实例 from sklearn import datasets import pandas as pd iris datasets.load_iris() print(iris.keys()) print(labels:,iris[target_names]) features,labels iris[data],iris[target] print(features.shape,labels.shape) # 分析数据集 print(-------feature_names:,iris[feature_names]) iris_df pd.DataFrame(features) print(-------info:,iris_df.info()) print(--------descibe:,iris_df.describe()) dict_keys([data, target, target_names, DESCR, feature_names, filename]) labels: [setosa versicolor virginica] (150, 4) (150,) -------feature_names: [www.bdqxylgw.comsepal length (www.baitengpt.com), sepal width (cm), petal length (cm), petal width (cm)] class pandas.core.frame.DataFrame RangeIndex: 150 entries, 0 to 149 Data columns (www.xcdeyiju.com total 4 columns): 0 150 non-null float64 1 150 non-null float64 2 150 non-null float64 3 150 non-null float64 dtypes: float64(4) memory usage: 4.8 KB -------info: None --------descibe: 0 1 2 3 count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.057333 3.758000 1.199333 std 0.828066 0.435866 1.765298 0.762238 min 4.300000 2.000000 1.000000 0.100000 25% 5.100000 2.800000 1.600000 0.300000 50% 5.800000 3.000000 4.350000 1.300000 75% 6.400000 3.300000 5.100000 1.800000 max 7.900000 4.400000 6.900000 2.500000 # 数据进行预处理 from sklearn.preprocessing import StandardScaler,LabelEncoder from sklearn.model_selection import RandomizedSearchCV from sklearn.svm import LinearSVC from scipy.stats import uniform # 对数据进行标准化 scaler StandardScaler(www.yifayuled.cn) X scaler.fit_transform(features) print(X.mean(axiswww.baiyiyuLet.com 0)) print(X.std(axiswww.baiyidLu.com 0)) # 对标签进行编码 encoder LabelEncoder() Y encoder.fit_transform(labels) # 调参 svc LinearSVC(losshinge,dualTrue) param_distributions {C:uniform(0,10)} rscv_clf RandomizedSearchCV(estimatorsvc, param_distributionsparam_distributions,cv3,n_iter20,verbose2) rscv_clf.fit(X,Y) print(rscv_clf.best_params_) Redis压缩列表应用分析 上面部分介绍了Redis压缩列表的原理与应用下面简单分析一下主要从通过试图回答一些问题来分析Redis为什么使用压缩列表使用压缩列表的好处是什么使用压缩列表的好处还有什么压缩列表的应用对与我们使用内存有没有什么启发 Redis对于每种数据结构、无论是列表、哈希表还是有序集合在决定是否应用压缩列表作为当前数据结构类型的底层编码的时候都会依赖一个开关和一个阈值开关用来决定我们是否要启用压缩列表编码阈值总的来说通常指当前结构存储的key数量有没有达到一个数值条件或者是value值长度有没有达到一定的长度条件。任何策略都有其应用场景不同场景应用不同策略。为什么当前结构存储的数据条目达到一定数值使用压缩列表就不好压缩列表的新增、删除的操作平均时间复杂度为O(N)随着N的增大时间必然会增加他不像哈希表可以以O(1)的时间复杂度找到存取位置然而在一定N内的时间复杂度我们可以容忍。然而压缩列表利用巧妙的编码技术除了存储内容尽可能的减少不必要的内存开销将数据存储于连续的内存区域这对于Redis本身来说是有意义的因为Redis是一款内存数据库软件想办法尽可能减少内存的开销是Redis设计者一定要考虑的事情。 另外经过仔细琢磨我认为使用压缩列表的好处除了节约内存之外还有减少内存碎片的作用我把这种行为叫做合并存储也就是将很多小的数据块存储在一个比较大的内存区域试想想如果我们将要存储的数据都是很小的条目我们为每一个数据条目都单独的申请内存结果是这些条目将有可能分散在内存的每一个角落最终导致碎片增加这是一件令人头疼的事情。 总结 这篇文章在介绍Redis压缩列表原理与应用的基础之上对Redis压缩列表的应用进行分析分析部分主要掺杂着个人的理解与认知如果有不同观点或者补充观点欢迎留言讨论。 转载于:https://www.cnblogs.com/qwangxiao/p/11108995.html