2.软文推荐
3.软文推荐
目录: 1、redis 中sort实现原理 2、热搜排序实现——Redis有序集合zset 3、Redis | 第9章 Lua 脚本与排序《Redis设计与实现》 4、Java项目中有按时间排序(可正序,可倒叙),热度排序(可正序,可倒叙)该怎么做? 5、关于redis中的zset(sorted set) redis 中sort实现原理redis客户端发送sort 操作时调用函数为sortCommand,sortCommand函数对参数进行解析,之后调用pqsort函数,pqsort函数在pqsort.c文件中,此文件提供给外部只有一个函数qsort(),内部调用_pqsort()实现的,文件中一些其他的静态函数和宏也是辅助作用的。
void pqsort(void *a, size_t n, size_t es, int (*cmp) (const void *, const void *), size_t lrange, size_t rrange)
参数a:待排序数组的首地址。n:待排序元素的个数 。es:element size 每个元素的字节大小 。cmp:回调函数,定义了比较的规则 。lrange:待排序的左边界。rrange:待排序的右边界。
内部调用 _pqsort,二者差别是psort()的参数中左右边界值含义是下标;_pqsort()参数中的左右边界值,其含义是指针。
该宏的目的在于给swaptype赋值,swaptype = 2,数组a中元素的大小不是sizeof(long)的倍数;swaptype = 0 ,每个元素大小是sizeof(long);swaptype=1,是sizeof(long)的倍数但是不等于sizeof(long)。
根据回调函数cmp指定的比较规则,求出变量a,b,c中处于中间大小的变量,也就是求出中位数。
排序的元素个数小于7的时候,采用了冒泡排序。
pm指向数组中间位置索引,pl指向数组首位置索引,pn执向数组末位置索引,然后求出三个数中的中位数。
元素个数大于40的时候,将元素分为8个子区间,pl左边三个区间首部中的中位数索引,pm中间三个区间首部中的中位数索引。pr右边三个区间首部中的中位数索引。
pm理解为快排中所选择的基准(key),每次排序后保证基准左边小于它,基准右边大于它,并且左右区间长度大致相同,接下来排序效率就会更高。
把基准(key)放在第一元素中,从前面位置(pa,pb)开始向后遍历,找到比基准的的数字,从后向前找到比基准小的数字,然后交换。
新排序开始使用循环(goto loop),而不是使用递归,文中给出的注释是节省栈空间。
热搜排序实现——Redis有序集合zset这里主要涉及存储和查询方案。不涉及前端搜索的分词解析。完整方案,需要包括前端分词,排除停止词,挖掘相关的词后再进行热搜词的入库和搜索。
Redis Zincrby 命令对有序集合中指定成员的分数加上增量 increment
当 key 不存在,或分数不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
如:对key为2019-11-25,成员为keywords,增加5分
Redis Zrange 返回有序集中,结果由小到大;Zrevrange 命令返回结果由大到小。
如:查出key为2019-11-25,top3的成员
利用有序集合zset的特性,即可达到按权重排序的效果。
Java实现:
Redis | 第9章 Lua 脚本与排序《Redis设计与实现》参考资料 :《Redis设计与实现 第二版》;
第三部分为独立功能的实现,主要由以下模块组成: 发布订阅 、 事务 、 Lua 脚本 、 排序 、 二进制位数组 、 慢查询日志 、 监视器 ;
本篇将介绍 Redis 的 Lua 脚本 与 排序 。Redis 从 2.6 版本开始可以使用一些命令操作 Lua 脚本,引入相关支持;Redis 的 SORT 命令可以对列表键、集合键或者有序集合键的值进行排序,SORT 命令的一些可选性能让我们得到想要的排序;
与本章相关的 Redis 命令总结在下篇文章,欢迎点击收藏,本篇将不再重复:
《Redis常用命令及示例总结(API)》 :
Java项目中有按时间排序(可正序,可倒叙),热度排序(可正序,可倒叙)该怎么做?数据是存在数据库中,可以通过sql查询实现数据的排序
数据存储在redis中,通过zset实现排序
关于redis中的zset(sorted set)zset相关的问题,算是面试中的高频问题了。那么zset到底是什么?底层的实现原理是什么?相关的使用场景有哪些?
1. zset是什么?
在redis官网( )上,我们可以看到set, sorted set。其实zset就是sorted set。为了避免sorted set简写sset导致命令冲突,所以改为zset。同理例如class--clazz
sorted set从字面意思上,很容易就可以理解,是个有序且不可重复的数据集合。类似set和hash的混合体,但是相比于set,zset内部由score进行排序.
2. zset中的score排序规则
升序排列,分值越大越靠后
分值相同,则按照value的字典顺序排序
3. zset的用法
zset的命令可在这里( )看到,有兴趣的同学可以直接去看。
ZADD key score1 value1 score2 value2........
即表示增加是的score和value 组,可同时增加多个
4. zset实现
在redis.conf中,有如下两个参数:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
这两个条件均不满足,使用ziplist压缩表来实现sorted set
满足这两个条件之一,sorted set的内部实现会由ziplist转换为zset
zset-max-ziplist-entries 128,即sorted set中的元素对超过128时(存储的是score和value的元素对,所以数据项是256),内部实现会由ziplist转换为zset。
zset-max-ziplist-value 64,即任意一个value的长度超过了64字节,内部实现会由ziplist转换为zset.
zset由dict、skiplist实现。
5. ziplist,即压缩列表
压缩列表是由连续性内存组成的顺序性数据结构,一个压缩列表可以包含任意多的entry,每个entry可以保存一个字节数组或者一个整数。
压缩列表在表头有三个字段:zlbytes,zltail,zllen分别表示列表长度(整个列表占用的字节数),列表尾的偏移量(尾节点距离起始地址的字节数)和列表中entry的个数。
列表表尾还有一个zlend,表示列表结束了。
6.skiplist
由上图压缩列表可知,如果我们查找第一个元素或者最后一个元素,直接通过表头三个字段的长度可定位。复杂度是O(1),而如果查找其他元素,只能顺序查找,复杂度是O(n)。 为了解决这个问题,可以使用跳表。
在新增节点之前,也会先经过查询,确定插入位置,再完成插入操作,同时也实现了Sorted Set的排序。
跳表中新增加节点不会影响其他节点的索引位置。因此插入操作只需要修改插入节点前后的指针,不需要修改所有节点,降低了插入的复杂度,所以跳表在插入性能上明显优于平衡树。
7. zset的使用场景
需要排序的场景,比如top10的热点文章,或者排行榜
消息的延迟发送,用score存储发送时间戳,定时任务扫描sorted set,判断时间进行发送。
1
目录:1、我想建个外贸网站(opencart),求资深建站细教2、什么是独立站?独立站怎么建站?3、代问下外贸是做什么的?大家觉得做独立站...