Redis专题(四) ——Redis排序、消息队列、优化存储 (原创内容,转载请注明来源,谢谢) 一、排序 1、命令 SORTkey [ALPHA] [DESC] [LIMIT start...end],对列表、集合和有序集合进行排序,当加上alpha参数后,则可以按照字典顺序排序,加上desc则倒序排序,加上limit则支持分页。...另外redis会在排序前用一个空间为n的容器进行存储排序期间的临时数据。...二、消息队列 redis消息队列可以分为两类,生产者和消费者,当生产者产生的数据会放入消息队列中,消费者监测到消息队列内有数据的时候,可以进行后续的处理。...2)message 表示收到的订阅消息,也是此模式的核心,其第二个值是频道的名称,第三个值是消息的内容。
个人主页: 才疏学浅的木子 ♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 ♂️ 本文来自专栏: 算法 算法类型:排序算法 排序算法 冒泡排序 冒泡排序的优化 选择排序 插入排序...快速排序 归并排序 堆排序 冒泡排序 平均时间复杂度: o(n^2) 最好时间: o(n) 最坏时间: o(n^2) 空间复杂度: o(1) 是否稳定: 稳定 简单的冒泡排序...[3,2,1,4,5,6] 如果按照普通冒泡排序下次需要遍历的下标范围为[0,4] 但是[3,4]是已经有序的,所以可以减少比较,保存上次交换的结束位置 public int[] bubbleSort...平均时间复杂度: o(n^2) 最好时间: o(n) 最坏时间: o(n^2) 空间复杂度: o(1) 是否稳定: 稳定 插入排序 public int[] insertSort...平均时间复杂度: o(nlogn) 最好时间: o(nlogn) 最坏时间: o(n^2) 空间复杂度: o(logn) 是否稳定: 不稳定 快速排序 public void
文章涉及具体代码gitee: 登录 - Gitee.com 1.插入排序 具体分析过程见我的博客插入排序: [数据结构]——排序——插入排序-CSDN博客 1.直接插入排序 void InsertSort...5.总的分析总结 插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素逐个插入到已排序序列中的适当位置,直到全部元都插入完毕。插入排序包直接插入排序和希尔排序。...直接插入排序: 算法思想:将待排序序列分为已排序和未排序两部分,初始时已排序部分只有一个元素。然后从未排序部分依次取出元素,与已排序部分的元素进行比较并插入到合适的位置。...选择排序是一种简单直观的排序算法,它的基本思想是每次从待排序序列中选择最小(或最大)的元素放到已排序序列的末尾。选择排序包括选择排序和堆排序。...选择排序: 算法思想:将待排序序列分为已排序和未排序两部分,初始时已排序部分为空。每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。
至此选择排序完毕。 举例:选择排序:56 12 80 91 20 第一次:遍历这5个数。找到最小值12。...位置在5,交换2和5位置的数字,12 20 80 91 56 依次类推 2、堆排序 是对选择排序的改进 基本思想: 1、将初始待排序keyword序列(R1,R2...则整个排序过程完毕。...这样的排序方法成为二路归并排序。...递归高速排序。将其它n-1个元素也调整到排序后的正确位置。最后每一个元素都是在排序后的正 确位置。排序完毕。 怎样选基准??
项目地址:https://github.com/windwant/windwant-service/tree/master/algorithm 冒泡排序:两两比较,大数冒泡 升序: public static...选择排序:选择剩余元素中最小(最大)的元素放置到初始选择集合中(空) public static void SelectionSortAsc(int[] arr){ int min = 0;...:设定一个初始已排序的集合(一般选择一个元素),从剩余的集合中将各个元素以此插入到初始集合中的正确位置 public static void insertionSort(int [] array){...左边的元素值都小于anchor值,右边的值都大于anchor值,递归排序左右两侧排序 //左边元素。...值索引+1---high if (end < high) { quikeSort(arr, end + 1, high); } } 归并排序
1.插入排序插入排序的思路是将数组分成已排序区间和未排序区间。初始已排序区间只有一个元素,然后一次插入未排序区间的元素到已排序区间中,直到全部元素插入已排序区间。...插入排序适用于 already sorted 或几乎已经排序的数据。2.希尔排序 希尔排序通过交换不相邻元素来实现排序,其目的是让数组中任意间隔为h的元素都是有序的。此时数组的性能接近O(n)。...Shell排序适用于大规模数据的排序。3.选择排序选择排序的思路是找出数组中的最小值,将其与数组的第一个元素交换位置。然后在剩余元素中找出最小值,将其与数组的第二个元素交换位置。...选择排序的优点在于数据移动是最少的,但是如果数据量较大,排序速度较慢。4.冒泡排序冒泡排序的思路是比较相邻的元素,如果顺序错误就把元素交换过来。...冒泡排序不是很高效,但简单易理解,可以在非常短时间内完成排序。5.堆排序堆排序使用二叉堆数据结构来实现。
冒泡排序 依次比较相邻的两个元素,将比较小的数放在前面,比较大的数放在后面,直到所有元素排列完。 最容易理解的版本 对一个数组的n个整型数据进行n趟排序,每趟排序都尝试将较大值放到数组右侧。...剩余元素均小于5,后续排序无需再与5进行比较。 在第二趟排序结束后,数组最右侧是4,5,剩余元素均小于4,5,后续排序无需再对4,5进行比较。...选择排序 分别从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。...选择排序是不稳定的排序算法,即对于值相同的数据元素,彼此的前后顺序可能会发生改变。 对比冒泡排序 与冒泡排序不同: 冒泡排序是逐趟选出未排序序列中的最大值,置于右侧。...不同于冒泡排序,选择排序每趟排序最多只会改变两个元素的位置。不能设置flag检查是否排序完成,也无法通过flag检查。 选择排序需要遍历剩余所有元素,内层循环不能同冒泡循环一样修改右边界。
选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。...首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。...选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 ? !...这就是堆排序的由来 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。...原地堆排序 基于以上堆相关的操作,我们可以很容易的定义堆排序。
上一篇:归并排序 将长度为N的无重复数组排序,快速排序平均需要~2*NlgN次比较(以及1/6的交换)。 快速排序最多需要N^2/2次比较,但随机打乱数组能预防这种情况。...归并排序和希尔排序一般都比快速排序慢,其原因就在它们还在内循环中移动数据;快速排序的另一个速度优势在于它的比较次数很少。...快速排序的特点: 原地排序(只需要一个很小的辅助栈) 将长度为N的数组排序所系时间和NlgN成正比。 快排的内循环比大多数排序算法都要短小,这意味着无论在理论上还是实际中都要更快。...sort(a,j+1,hi); //递归右半部分排序 } 算法改进 切换到插入排序 三取样切分 熵最优排序 含有大量重复元素的数组,快速排序还有巨大的改进空间。...下一篇:堆排序
排序算法之【冒泡排序】 在写代码之前我们需要对冒泡排序有一个逻辑上的理解:即什么是冒泡排序呢?...冒泡排序是排序算法的其中一种,该排序的逻辑理解起来较为容易,理解上可以有两种方式,一种中正向的思维,一种是逆向的思维,什么意思呢?所谓的正向思维就是从前往后,从左往右,从上到下。...下面来说一正向思维下的冒泡排序: 例如给你一组数据:{1, 34, 56, 8, -32, 7, -9, 0, 235 }在正向思维下的排序方式就是从左到右的进行排序,其排序的是按照第一个数和第二个数比较大小...总结的来说就是进行一次完整的排序之后就会出现一个现象就是排在最后的数最大。...: /** * @author yxm * 正向思维下的冒泡排序 * */ public class MaoPaoSort { public static void main(String[]
思路:堆排序执行过程描述如下:(大顶堆) 1)从无序序列所确定的完全二叉树的第一个非叶子结点开始,从右到左,从下到上,对每个结点进行调整,最终将得到一个大顶堆。...此时只有结点b不满足堆的定义,对其进行调整; 3)重复2)中过程,直到无序序列中剩下1个元素时排序结束。...时间复杂度:最好O(nlogn) 最差O(nlogn) 平均O(nlogn) 空间复杂度:O(1) 是否稳定:不稳定 /** * 堆排序 * * @param a * @param
上一篇:快速排序 数据结构--堆的构造和实现 堆排序可以分为两个阶段: 构造堆。将原始数组重新组织安排进一个堆中 下沉排序。...从堆中按递减顺序取出所有元素并得到排序结果 用下沉操作由N个元素构造堆只需少于2N次比较以及少于N次交换。 将N个元素排序,堆排序只需少于(2NlgN+2N)次比较以及一半次数的交换。...堆排序的特点: 唯一的能够同时最优地利用空间和时间的方法。 无法利用缓存。数组元素很少和相邻的元素直接比较,因此缓存未命中的次数远远高于其他排序算法。...堆排序实现要点: 代码中堆是用数组实现的,数组a[0]弃之不用,堆顶元素存在a[1]中。...下面代码是堆排序主要算法,具体堆的实现可以参考数据结构----堆。
冒泡排序 思想 冒泡排序,又被称为气泡排序或泡沫排序。...它会遍历若干次要排序的数列,每次遍历时,会从前往后一次比较相邻两个数的大小,如果前者比后者大,则交换它们的位置,如果后者比前者大,则继续遍历。这样,一次遍历之后,数组中最大的元素就会处于数组的末尾。...bubble_sort(int* arr,int sz) { int i = 0; int flag = 1; for (i = 0; i < sz-1; i++) { int j = 0; //一趟冒泡排序之后...if (flag == 1)//如果已经有序,提前跳出循环 break; } } 算法分析 时间复杂度:最坏O(N^2),最好O(N),平均时间复杂度O(N^2) 空间复杂度:O(1) 选择排序...思想 首先在未排序的数组中找到最大或者最小的元素,然后将其放在起始位置,同理,在未排序的数组中继续寻找最大或最小的数,将其放在已排序(每次找到的元素构成的数列)的数列的末尾。
◆ 概述 在上文中,我们讨论了消费者对于消息拉取的实现,对于 这个黑盒的心脏部分,我们顺着消息的发送流程已经将其剖析了大半部分。本章我们不妨乘胜追击,接着讨论各种不同的消息的原理与实现。...◆ 事务消息 ◆ 概念 RocketMQ 中的事务消息功能,实际上是 分布式事务中的本地事务表 的实现,只不过,在这里用消息中间件来代替了数据库,同时也帮我们做好了回查的操作。...◆ 事务流程 客户端发送 half 消息 吐槽一下为什么要叫半消息(half message),叫 prepare 消息不是更直观吗 Broker 将 half 消息持久化 客户端根据事务执行结果,发送...,来标记可以被移除的 half 消息(op 消息的存在代表对应事务的结束) /** * 读取op消息,解析op消息,填充removeMap * * @param removeMap 要删除的半消息,key...◆ 批量消息 ◆ 概念 在消息队列中,批量消息也是一个重要的部分,将消息压缩在一起发送不仅可以减少带宽的消耗,还能节省头部占用的空间。
] ①归并排序、快速排序 、堆排序、计数排序 归并排序 ⚪步骤 ⚪实现 ⚪复杂度 快速排序 ⚪步骤 ⚪实现 ⚪复杂度 堆排序 ⚪步骤 ⚪实现 ⚪复杂度 912....排序数组 315. 计算右侧小于当前元素的个数 561. 数组拆分 1122. 数组的相对排序(计数排序) 268. 丢失的数字(计数排序) 215. 数组中的第K个最大元素 347....交易逆序对的总数 ①归并排序、快速排序 、堆排序、计数排序 归并排序 ⚪步骤 归并排序: 归并排序是一种分治法(Divide and Conquer)的经典排序算法,它的基本思想是将原始数组划分成较小的数组...快速排序 ⚪步骤 快速排序: 快速排序(Quick Sort)是一种常用的基于分治思想的排序算法。...堆排序 ⚪步骤 堆排序: 堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法,它利用堆的性质进行排序。堆是一个完全二叉树,可以分为最大堆和最小堆两种类型。
交换排序 所谓交换,是指根据序列中两个关键字的比较结果来对换这两个记录在排序中的位置。...冒泡排序 概念 冒泡排序的基本思想是:从前往后(或从后往前)两两比较相邻元素的值,若为逆序(即A[I-1]>A[I]),则交换它们,直到序列比较完。...我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置(或将最大的元素交换到待排序列的最后一个位置),关键字最小的元素如气泡一样逐渐向上“漂浮”。最终一个一个排好了位置。...概念 快速排序的基本思想是基于分治法的:在待排序表L【1.。。...n】中任取一个元素pivot作为枢轴(通常取首元素),通过一趟排序将待排序表划分为独立的两部分,使其中一个表L【1.。。k-1】中的元素都大于枢轴pivot,另一个表L【k+1.。。。
一、如何确保消息不丢失? 1、检测消息丢失的方法 可以利用消息队列的有序性来验证是否有消息丢失。...如果没有消息丢失,Consumer收到消息的序号必然是连续递增的,如果检测到序号不连续,那就是丢消息了。...,消息队列的客户端会把消息发送到Broker,Broker收到消息后,会给客户端返回一个确认响应,表明消息已经收到了。...也就是说,消息队列很难保证消息不重复 2、用幂等性解决重复消息问题 一般解决重复消息的办法是,在消费端,让我们消费消息的操作具备幂等性 一个幂等操作的特点是,其任意多次执行所产生的影响均与一次执行的影响相同...然后订单系统给消息服务器发送一个半消息,这个半消息包含的内容是完整的消息内容,和普通消息的唯一区别是,在事务提交之前,对于消费者来说,这个消息是不可见的 半消息发送成功后,订单系统就可以执行本地事务了,
min])) min = j; exch(a,i,min); } } //less()、exch()、isSorted()、main()方法见“排序算法模板...” } 长度为N的数组,选择排序需要大约N^2/2次比较和N次交换。...下一篇:插入排序
/** * 快速排序 * @param a * @param low * @param high */ public static void quickSort(int...high) { int l = low; int h = high; if (l >= h) { return; } int temp = a[l]; // 此循环完成了一趟排序...从左往右扫描找到第一个大于temp的元素 l++; } if(l<h){ a[h] = a[l]; // 放在temp右边 h--; // h左移一位 } }// end 一趟排序...a[l] = temp; // 将temp放在最终位置 quickSort(a, low, l-1); // 递归对temp左边元素进行排序 quickSort(a, l+1, high...); // 递归对temp右边的元素进行排序 } public static void main(String[] args) { int[] a = { 5, 4, 3, 2, 1 };
消息队列具有高性能,高可用性,高并发的特点,是后端程序员必备的技能,本文叙述常见的使用消息队列的问题和最佳实践应用场景:消息队列最常被使用的三种场景:异步处理、流量控制和服务解耦一手资料地址:RabbitMQ...G0 消费了哪些消息,G1 是不知道的,也不用知道。G0 消费过的消息,G1 还可以消费。即使 G0 积压了很多消息,对 G1 来说也没有任何影响。...为了保证消息可靠,Broker和消费者都会存在重复消息,并且按着MQTT消息的质量标准要求,我们大部分的消息队列中间件采用At least once语义,Broker无法去除重复消息,只能依靠消费者在业务层进行幂等处理从对系统的影响结果来说...比如说,对于同一条消息:“全局 ID 为 8,操作为:给 ID 为 666 账户增加 100 元”,有可能出现这样的情况:t0 时刻:Consumer A 收到条消息,检查消息执行状态,发现消息未处理过...,开始执行“账户增加 100 元”;t1 时刻:Consumer B 收到条消息,检查消息执行状态,发现消息未处理过,因为这个时刻,Consumer A 还未来得及更新消息执行状态。
领取专属 10元无门槛券
手把手带您无忧上云