redis使用基础(四) ——Redis排序与消息通知

redis使用基础(四)redis

——Redis排序与消息通知微信

 

(转载请附上本文连接——linhxx)网络

 

1、排序机器学习

一、命令tcp

         SORT key [ALPHA] [DESC] [LIMIT start end],对列表、集合和有序集合进行排序,当加上alpha参数后,则能够按照字典顺序排序,加上desc则倒序排序,加上limit则支持分页。性能

二、关键参数学习

         by参数:by key:*->val,能够指定排序的标准,能够本身传入一个list,也能够指定某个列进行排序。优化

         get参数:get key:*->val,能够指定sort排序的返回结果,而不是将整个集合进行返回,要多个参数时采用多个get,另外get#会返回元素自己的键值。ui

         store参数:store key2,能够将前面排序的结果保存在另一个key里面。编码

三、性能问题

         sort的时间复杂度O(n+mlog m),n是待排序的基数,m是排序后的值。另外redis会在排序前用一个空间为n的容器进行存储排序期间的临时数据。

         所以,须要注意几个问题:

         1)尽量减小待排序的集合数量,以减小n

         2)若是不须要所有结果,则用limit,以减小m

         3)若是要排序的结果大,则用store进行存储。

 

2、消息队列

         redis消息队列能够分为两类,生产者和消费者,当生产者产生的数据会放入消息队列中,消费者监测到消息队列内有数据的时候,能够进行后续的处理。

一、命令

         redis提供一个命令叫BRPOP,与RPOP的区别在于,当使用命令对key进行操做时,若是key没有值,则会阻塞等待,直到等到有值后取出进行操做。另外,和brpop类似的,也有BLPOP命令。

二、优先级

         因为brpop命令能够支持多个键,而且当每一个键都有未处理的数据时,会从最左边的键开始处理。例若有两个邮件提醒业务,一个是开通帐号的验证,一个是新消息提醒。则若是太多的不采用优先级,新消息提醒的业务会让开通帐号的业务阻塞。由于开通帐号的时效性要求更高,所以须要将其放在左边。

三、发布订阅模式

         发布订阅模式有特殊的命令,发布的命令是PUBLISH channel message,订阅的命令是SUBSCRIBE channel message,不过因为redis的发布命令不会对消息进行持久化,即后面订阅的没法查看到发布者以前发布的消息。

         subscribe命令后,会让客户端进入订阅状态,此后只能输入四种命令:subscribe、unsubscribe、psubscribe、punsubscribe,其余命令会报错。

处于订阅状态后,客户端会收到3种类型的回复,每一个回复有三个值,第一个值是回复的类型,根据类型不一样,二三两个值也不一样。消息类型以下:

1)subscribe 表示订阅成功的反馈,此时第二个返回值是订阅的频道名称,第三个值是当前客户端订阅的频道数量。

2)message 表示收到的订阅消息,也是此模式的核心,其第二个值是频道的名称,第三个值是消息的内容。

3)unsubscribe 表示成功取消订阅某个频道,第二个值是取消的频道名称,第三个是剩余的订阅频道数量,若是是0,则此时会取消订阅模式,后面就能够继续输入其余非订阅的命令。

四、批量订阅模式

         命令psubscribe,支持blob模式,即相似正则的模式,如psubscribe channel.*,则订阅全部channel开头的频道。

         与此相应的,punsubscribe命令支持批量取消订阅。

 

3、管道

         redis和客户端是用tcp进行的链接,所以来回传送消息都要通过网络,来回的总耗时称为消息时延。当执行多个命令时,每条命令须要执行完毕有返回的时候,下一条才会执行。

         当须要一块儿执行时,redis底层的通讯对管道提供了支持,当一组命令中每条命令都不依赖于前一条时,能够一块儿发送请求,一块儿返回,以减小网络通讯的次数。

 

4、空间消耗

一、复杂度

         redis为每种数据类型都提供两种编码方式,例如hash,当元素不少的时候会使用散列表的方式进行存储,时间复杂度仅O(1);可是当元素不多时,O(n)和O(1)差距不大,为了节约内存,redis会采用内部编码方法,用时间换空间。

         redis可使用OBJECT ENCODING key的方式,查看每一个键的内部编码类型。

二、编码

         redis在内部编码采用结构体类型,以下:

         typedef struct redisObject{

         unsigned type:4;

         unsigned notuse:2;

         unsigned encoding:4;

         unsigned lru:22;

         int refcount;

         void *ptr;

}

type表明类型,用数字0-4表示五种类型;notuse是预留空间,未使用;ptr指针指向具体存储的数据;encoding有9种,0-8,包括原生编码、整型、哈希表、zipmap、双向链表、ziplist、skiplist、字符串。针对redis的五种数据类型,分别有不一样的encoding方式,以下图所示:(来自网络)

 

三、字符串优化

         字符串存储在一个结构体,包括字符串长度、具体内容、剩余空间。当执行set命令,要占用30字节,而当键值是64位的整数,则ptr指针会直接指向值,而不是指向结构体,能够节约到16字节。

         当存储的是0-9999时,redis因为会默认存储这些数字,则ptr指针直接指向引用,占用0字节的空间。

四、散列优化

         在配置文件中设置hash-max-ziplist-entries和hash-max-ziplist-value,当散列的键的个数少于entiries值,且每一个键值都小于value值,则会使用ziplist的方式编码,不然用哈希表来编码。ziplist牺牲时间换空间,哈希表牺牲空间换时间,所以数据少用ziplist,多的时候用哈希表。

         所以,两个参数不宜设置的太大。

五、列表优化

         列表和散列类似,有list-max-ziplist-entries和list-max-ziplist-value来配置。编码方式包括ziplist、双向链表、quicklist,quicklist结合ziplist和双向链表的有点,达到减小空间的同时适当减小时间。

六、集合优化

         配置文件配置set-max-intset-entries,小于时采用intset编码,不然用哈希表。intset使得集合内部有序排列,便于用二分法进行查找,可是添加和删除则须要进行排序,元素多的时候速度慢。

七、有序集合优化

         配置文件配置zset-max-ziplist-entries和zset-max-ziplist-value。包括ziplist和skiplist编码方式,skiplist是使用哈希表和跳跃列表两种结构来存储,哈希表用来存储分数的映射,跳跃列表用来存储分数和元素值的映射。

 

 

——written by linhxx

 

更多最新文章,欢迎关注微信公众号“决胜机器学习”,或扫描右边二维码。

相关文章
相关标签/搜索