- 博客(43)
- 资源 (8)
- 收藏
- 关注
原创 应用 9:大海捞针 —— Scan
1.keys在Redis维护工作中,有时需要从Redis实例成千上万个key值找出特定前缀的key列表,如何在海量的key值中找到满足特定前缀的key列表?keys用来列出满足特定正则字符串规则的key值(1)缺点a.没有offset、limit参数,一次性输出所有满足条件的key值,这样对于满足条件较多的情况会造成很大的困扰。b.且使用遍历算法,复杂度O(n),如果满足条件的key较多,这个指令就会造成Redis服务卡顿,所有其他读写指令都会被延后甚至超时报错,因为Redis是单线..
2021-09-05 14:47:05
298
原创 应用 8:近水楼台 —— GeoHash
1.Redis在3.2 版本以后增加了地理位置GEO 模块实现“附近的人”这样的功能2.假如你用数据库来算附近的人地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90,90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。对于“附近的人”的功能,元素距离不会很大,使用勾股定理就可以算出距离。首先,你不能通过遍历计算所有目标的元素和目标元素的距离然后进行排序,这样计算量太大。一般是通过矩形区域来限
2021-09-05 14:39:47
210
原创 用 7:一毛不拔 ——漏斗限流
1.对于漏斗限流,漏洞的容量是有限的,如果将漏嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去。如果将漏嘴放开,水就会往下流,流走一部分之后,就又可以继续往里面灌水。如果漏嘴流水的速率大于灌水的速率,那么漏斗永远都装不满。如果漏嘴流水速率小于灌水的速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾空。所以,漏斗的剩余空间就代表着当前行为可以持续进行的数量,漏嘴的流水速率代表着系统允许该行为的最大频率。下面我们使用代码来描述单机漏斗算法。# coding: utf8import time
2021-09-05 14:35:19
238
原创 应用6:断尾求生 —— 简单限流
1.当系统的处理能力有限时,如何阻止计划外的请求继续对系统施压。除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求。2.redis如何实现简单限流策略系统要限定用户的某个行为在指定的时间里只能允许发生 N 次,如何使用Redis的数据结构来实现这个限流的功能?先定义这个接口,理解了这个接口的定义#指定用户user_id的某个行为action_key在特定的时间内period只允许发生一定的次数max_countdefis_action_a...
2021-08-10 00:23:59
159
原创 应用5:层峦叠嶂 ——布隆过滤器
1.场景:在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。新闻客户端推荐系统如何实现推送去重?想法:(1)在服务器中记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。问题是当用户量很大,每个用户看过的新闻又很多的情况下,这种方式,推荐系统的去重工作在性能上跟的上么?如果历史记录存储在关系数据库里,去重就需要频繁地对数据库进行exists查询,当系统并发量很高时,数据库是很难扛住压力的。
2021-08-09 00:14:38
158
原创 应用4:四两拨千斤 —— HyperLogLog
1.场景:需要统计一个网页的一天的访问量,同一个用户一天之内的多次访问请求只能计数一次解决办法:为每一个页面一个独立的 set 集合来存储所有当天访问过此页面的用户 ID缺陷:页面访问量非常大,使用一个很大的 set 集合来统计,这就非常浪费空间。如果这样的页面很多,那所需要的存储空间是惊人的引入:Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81...
2021-08-08 23:12:17
158
原创 应用 3:节衣缩食 ——位图
1.位图用于用户一年的签到记录场景,可以减少存储空间2.位图指令(1)set,get,(前两个指令获取整个位图)setbit,getbit(2)位图统计指令bitcount,用来统计指定范围内1的个数,位图查找指令bitpos,用来查找指定范围内出现的第一个0或1比如我们可以通过 bitcount 统计用户一共签到了多少天,通过 bitpos 指令查找用户从哪一天开始第一次签到。如果指定了范围参数[start, end],就可以统计在某个时间范围内用户签到了多少天,用户自某天以后的哪天...
2021-08-01 23:57:01
166
原创 应用 2:缓兵之计 ——延时队列
1.redis做消息队列使用list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用 lpop 和 rpop来出队列2.队列空了怎么办客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop,又没有数据。这就是浪费生命的空轮询。空轮询不但拉高了客户端的 CPU,redis 的 QPS 也会被拉高,如.
2021-07-31 13:10:24
335
原创 应用 1:千帆竞发 ——分布式锁
1.分布式应用进行逻辑处理时经常会遇到并发问题比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个操作不是原子的。(Wiki 解释:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。)这个时候就要使用到分布式锁来限制程序的并发执行。2.分布式锁(1)分布式锁本质上要实现的.
2021-07-30 14:51:36
213
原创 六、启动后杂项基础知识
一、单进程1.单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率2.epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。二、默认16个数据库,类似数组下表从零开始,初始默认使用零号库三、select命令切换数据库四、dbsize查看当前数据库的key
2020-07-19 20:58:44
159
原创 五、redis入门概述
一、是什么1.Redis:REmote DIctionary Server(远程字典服务器)2.是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器3.Redis 与其他 key - value 缓存产品相比有以下三个特点(1)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用(2)Re
2020-07-11 14:12:12
198
原创 四、分布式数据库中CAP原理(CAP+BASE)
一、分布式数据库中CAP1.强一致性(Consistency)2.可用性(Availability)3.分区容错性(Partition tolerance)CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性和分区容错性三个需求(nosql三个有且只能满足两个)4.因此,CAP原理将NOSQL数据库分成了满足以下原则的三大类:(1)CA -单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。 注:传统Oracle数据库(2)CP -满足一致性、
2020-07-10 23:43:24
554
原创 三、NoSQL四大分类
一、四大分类1.KV键值:典型介绍(1)新浪:BerkeleyDB+redis(2)美团:redis+tair(3)阿里、百度:memcache+redis2.文档型数据库(bson格式比较多):典型介绍(1)CouchDB(2)MongoDBMongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据
2020-07-10 22:18:53
319
原创 二、NoSQL数据模型简介
一、以一个电商客户、订单、订购、地址模型来对比下关系型数据库和非关系型数据库?1.传统关系型数据库:ER图(1:1/1:N/N:N,主外键等常见) 用户对应多个订单多个地址 每个订单对应每个商品、价格、地址 每个商品对应产品 2.非关系型数据库:使用BSON(1)什么是BSONBSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象用BSon画出构建的数据模型{ "cus...
2020-07-10 21:46:47
371
原创 七、不用加减乘除做加法
一、题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。二、解析1.按位与运算符(&)运算规则:0&0=0;0&1=0;1&0=0;1&1=1;2.按位或运算符(|)运算规则:0|0=0;0|1=1;1|0=1;1|1=1;3.异或运算符(^)运算规则:0^0=0;0^1=1;1^0=1; 1^1=0;4.//相加各位 + 计算进位...
2020-07-10 16:31:19
147
原创 六、构建乘积数组
一、题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)二、解析...
2020-07-10 16:23:10
89
原创 五、二叉搜索树的第k个结点
一、题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。二、解析1.二叉搜索树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。2.知道什么是二叉搜索树,结...
2020-07-10 15:15:26
225
原创 四、滑动窗口的最大值
一、题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4
2020-07-10 02:28:04
101
原创 三、矩阵中的路径
一、题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子二、解析这是我看过一个人的解析思路,我觉得是不错的。首先分析一下这是一道dfs的题目,.
2020-07-10 01:54:30
202
原创 一、为什么使用NoSql
一、单机Mysql早期一个网站的访问量不大,更多是静态页面,动态交互类的网站不多,单个数据库完全可以应付。上述架构下,数据库存储的瓶颈是什么?1) 数据量的总大小,一个机器放不下2) 数据的索引(B+Tree)一个机器的内存放不下3) 访问量(读写混合)一个实例不能承受二、Memcached(缓存)+Mysql+垂直拆分随着访问量的上升,几乎大部分使用MySql架构的网站在数据库上都出现性能问题。程序员开始大量地使用缓存技术来缓解数据库的压力,优...
2020-07-08 17:43:32
859
原创 二、机器人的运动范围
一、题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?二、解析1.直接使用遍历,遍历m*n次,每次判断行,列的数位之和是否大于k即可三、代码实现class Solution {publi
2020-07-02 17:46:22
122
原创 一、剪绳子
一、题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。二、解析1.首先明确这是动态规划问题2.假设f(n)为长度为n的绳子的最大乘积,绳子被砍成两段,第一段长度为i,第二段为n-i,那么有f(n)=max(f(i)*f(n-i).
2020-07-02 00:01:05
144
原创 七、关于c++的复合类型(五)
指针、数组和指针算术1.指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式2.C++将数组名解释为地址,而第六时候说过指针变量也是一个地址在前面讲过int *a = new int [10];,指针指向new分配的内存地址,而数组不是new出来,它有自己的标识(数组名),数组名也被解释为第一个元素的地址。所以可以这样使用指针和数组int a[3] = {0,1,2};...
2020-03-26 20:46:46
85
原创 五、关于c++的复合类型(三)
string类1.string类型的变量代替字符数组存储字符串2.使用string类,必须包含头文件string,string类位于名称空间std中。3.string str1;string str2 = "Hello";cin>>str1;cout<<str1<<""<<str2<<endl;cout<&...
2020-03-25 19:29:02
130
原创 四、关于c++的复合类型(二)
字符串1.什么是字符串?字符串是存储在内存的连续字节中的一系列字符,C++处理字符串有两种方式:一种来自C语言,称为C-风格字符串,另一种是基于string类库的方法2.存储在内存的连续字节中的一系列字符意味着可以存储在char数组当中,而对于C-风格字符串具有一种特质:以空字符串'\0'结尾 如: char a[5] = {'a','b','c','d','e'}; ...
2020-03-25 18:58:56
127
原创 三、关于c++的复合类型(一)
数组1.什么是数组?数组是一种数据格式,存储多个同类型的值。2.数组的声明 格式:类型 数组名称[元素个数]; 如:int a[10];3.C++中使用带索引的方括号表示法来指定数组元素,如a[0],a[1]...表示a数组的第一个,第二个元素4.初始化4.1如果只声明不对数组进行初始化的话,数组元素的值是不确定的值4.2初始化(使用列表) in...
2020-03-25 16:30:44
169
原创 二、unix了解
1.ls -a 显示所有文件(包括隐藏文件) ls -F 给文件打标记 *表示可执行文件,/表示目录,@表示软连接,没带表示普通文件 ls -l 看最后一列的颜色判断文件还是目录2.mkdir 创建目录 -p 多层创建目录3.cat 查看文件内容4.>重定向 把左边命令的输出写进右边文件 命令>文件名5.>>追加把左边命令的...
2020-03-20 17:11:54
165
原创 一、Unix操作系统了解
一、操作系统1.1.操作系统是连接用户和硬件的软件(系统软件)1.2.操作系统内核(kernel):与软件打交道 操作系统外壳(shell):与用户打交道二、Unix2.1."/"表示根目录 "home"或"~"表示主目录 "."表示当前目录 ".."表示上级目录 例子:cd ../.. 切换目录到上级目录的上级...
2020-03-18 22:59:30
379
转载 重排序
一、数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量之...
2019-08-04 10:22:14
86
转载 java内存模型
一、并发编程中需要考虑的两个问题:线程之间的通信和同步二、并发模型:共享内存,消息传递在共享内存的并发模型中,线程之间通过写-读内存中的公共状态进行隐式通信,而对于同步,是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行;在消息传递的并发模型中,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,而对于同步,由于消息的发送必须在消息的接收之前,因此...
2019-08-01 15:50:10
87
原创 装饰器(可先了解闭包一章再阅读此章)
一、什么是装饰器装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。二、怎么在不改变函数的代码下为函数添加额外功能在这个例子中,我们在不改动函数text代码的情况下对函数进行添加额外功能,用了闭包的知识,把函数和添加的功能放在内部定义的函数,并且把该函数返回,并且赋值给一个叫innerfunc的变量,而...
2019-02-26 13:51:57
131
原创 闭包
一、了解函数的执行def hello(): print("hello")hello()看一下上面的代码的执行过程,代码在解释器中是按照顺序的,一开始从上往下执行时,在执行第一行语句时并不会跳入函数体,因为此时的一二行代码只是对函数进行了定义,只有当执行到hello()时,它才往后进入函数体进行执行。二、了解函数的定义,调用,函数名,函数引用1.函数定义,上面的一二行就...
2019-02-25 22:28:12
110
原创 迭代对象和迭代器
一、可迭代对象(Iterable)1.可以直接作用于for循环的对象就是可迭代对象。2.可直接作用于for循环的数据类型有两类:<1>集合数据类型list、tuple、dict、set、str等<2>generator生成器和带yield的generator function(这两个在生成器那一文章中进行解释了)3.用isinstance()判断...
2019-02-23 17:43:48
490
原创 生成器
一、什么是生成器接触了列表生成式,我们可以用列表生成式创建一个列表。但受内存限制,列表的容量不可能无限大,而且如果一个包含很多元素的列表而我们只访问其中几个,这样就会白白浪费很多空间。所以我们有这样一个想法,我们只保存得出列表的算法,再根据需要去计算需要的元素,在python中,这种一边循环一边计算的机制我们就称为生成器(generator)二、创建生成器的方法1.只需要把列表生成式的...
2019-02-23 01:13:42
187
原创 Linux文件和目录
一、与window系统的比较对于window来说以盘符开头,即我们常说的c盘,d盘等,而Linux以根目录(/)开头,没有盘符概念,所用的文件都在它下面。二.目录/:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。 /bin、/usr/bin: ...
2019-02-22 20:28:28
129
原创 Linux版本以及应用领域
一、关于版本1.Linux内核版本:内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。Linux内核版本又分为稳定版和开发版:稳定版:具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些bug或加入一些新的驱动程序。 开发版:由于要试验各种解决方案,所以变化很快2.Linux发行版本:...
2019-02-22 19:47:21
490
原创 python爬取网易云歌单
一、实现效果实现一个这样的界面,输入歌单URL下载歌单到本地文件夹。二、思路1.搭建界面2.爬取音乐三、搭建界面导入tkinter标准库,tkinter作为python的标准图形库,不需下载from tkinter import *1.创建窗口对象root=Tk()2.窗口标题root.title("网易云音乐")3.窗口大小与位置大小:ro...
2018-12-12 17:31:13
1345
1
原创 列表操作
一、使用for循环遍历整个列表语法: for 变量名 in 列表名: #注意需要冒号 print(变量名) #注意缩进mas = ['a','x','c','aa']for ma in mas: print(ma)二、创建数值列表1.函数range(a,b):从a开始到b前一个数结束。for value ...
2018-09-15 16:33:13
439
原创 列表
一、什么是列表列表是由一系列按特定顺序排序的元素组成。鉴于列表包含多个元素,所以给列表指定一个表示复数的名字。二、列表表示用方括号表示列表,逗号隔开。例如:bicycles = ['trek','cannondale','redline','specialized']输出列表各元素:print(bicycles)打印包括[],'',,都进行打印。三、访问列表元素...
2018-09-09 18:38:16
200
php视频(php基础,PHP核心函数库还有HTML,框架,京东商城项目,Linux,MySQL,javaScript)
2019-04-11
java视频(包括基础,数据库,框架,毕业设计)
2019-04-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人