- 博客(137)
- 收藏
- 关注
转载 用redis实现分布式锁
在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。其次Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。使用到的Redis命令SETNX命令(SET if Not eXists) 语法: SE
2017-09-23 20:46:38 715
原创 字符串解码讨论
01背包和完全背包使用一维数组的版本: 01背包:int main() { int n,m; while(cin>>n>>m) { vector<int> weight(n+1,0);//物品的重量 vector<int> value(n+1,0);//物品的价值 vector<int> dp(m+1,0);//一维数组,存放用n个产
2017-09-10 17:24:14 580
转载 C++知识点(4)
GCC常用参数-ansi:关闭 gnu c 中与 ansi c 不兼容的特性 , 激活 ansi c 的专有特性 ( 包括禁止一些 asm inline typeof 关键字 , 以及 UNIX,vax 等预处理宏-lxx:表示动态加载libxx.so库-Lxx:表示增加目录xx,让编译器可以在xx下寻找库文件-Ixx:表示增加目录xx,让编译器可以在xx下寻找头文件-shared:生成共享目标文件
2017-08-11 17:40:22 781
转载 Web网站架构的高并发实现
Web前端性能优化浏览器访问优化减少http请求http是无状态的应用层协议,意味着每次http请求都需要建立通信链路、进行数据传输,而在服务器端,每个http都需要启动独立的线程去处理。 减少http的主要手段是合并CSS、合并JavaScript、合并图片等,这样浏览器就只需要一次请求。使用浏览器缓存CSS、JavaScript、Logo等静态资源更新频率都比较低,而这些文件又几乎是每次htt
2017-08-11 17:09:52 1090
转载 时序数据库
时序数据的概念时序数据简单的说, 就是随着时间流而不断产生的数据, 比如一台服务器的cpu负载, 或者一个应用的log文件等。 对于这种时序数据, 有一些常用的操作, 比如统计每分钟的平均值, 中位数等。 所谓时序数据库, 就是针对这类场景做了优化的一类数据存储查询系统。 又如百度无人车在运行时需要监控各种状态,包括坐标,速度,方向,温度,湿度等等,并且需要把每时每刻监控的数据记录下来,用来做大
2017-08-10 21:39:06 713
转载 简单的平面几何问题
已知直线上两点坐标,求直线方程已知两点(x1,y1) ,(x2,y2),代入两点公式: (x-x1)/(x2-x1)=(y-y1)/(y2-y1) 于是有:ax+by+c=0;//a=y2-y1//b=x1-x2//c=x2*y1-x1*y2判断两点是否在直线的同一侧方法1:如果已知直线方程为:a*x+b*y+c=0则直接把两点(x1,y1) ,(x2,y2)代入方程,判断(a*x1+b*
2017-06-09 15:26:56 1469
转载 B树、B+树和R树
前言动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。 但是咱们有面对这样一个实际
2017-06-06 11:35:54 1791
原创 递归调用中使用全局变量或者函数参数
在编写递归函数时,我们可以选择使用全局变量,也可以选择使用函数参数。这两者的差别在于: 全局变量的形式,递归结束后必须对该变量修改,恢复原值;函数参数的形式,因为递归调用函数时,实际上,从内存分布上看,每一层调用都保存了该层函数的参数,因此递归返回上层时,不会影响原参数值。拿一道题举例,求二叉树中和为某一值的路径: 全局变量的写法:int currentSum = 0; vector<N
2017-06-03 11:00:33 13570 1
原创 C++知识点(3)
内联函数内联函数相当于自动地用函数的形式添加进代码,可以提高效率。编译器会对内联函数的参数做安全检查或自动类型转换,而宏定义不会。 内联函数可以访问类的私有成员变量,而宏定义则不能,在类中声明同时定义的成员函数,自动转化为内联函数。继承机制中对象之间的转换从派生类向基类的类型转换只对指针和引用类型有效。基类向派生类不存在隐式类型转换,使用dynamic_cast。虚函数、虚函数表的内存分配对于无虚
2017-06-03 10:17:49 615
转载 Linux命令行之文本处理
cat贴出一个文件的内容,从文件中获取输入,并将该文件内容输出到标准输出。 cat指令功能虽然简单,但是配合重定向,它就可以将一个文件内容送给任何可以从标准输入获取数据的工具来进行处理。head用于显示一个文件的前几行。指令格式:$ head [OPTION]... [FILE]...head指令用于从文件头开始显示几行,它比cat多出了可以按行选择文件中需要输出的部分。同cat一样,它默认从文件
2017-05-17 20:32:30 475
转载 搜索引擎:倒排索引
搜索引擎通常检索的场景是:给定几个关键词,找出包含关键词的文档。那么如何快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词-文档矩阵模型,通过这个模型我们可以很方便知道某篇文档包含哪些关键词,某个关键词被哪些文档所包含。 单词-文档矩阵的具体数据结构可以是倒排索引、签名文件、后缀树等。单词-文档矩阵单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,下图展示了其含义。下图的每列
2017-05-15 19:22:15 706
转载 Memcached和Redis缓存技术
Redis与其他key-value存储有什么不同?Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。 Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂
2017-05-09 19:20:10 980
转载 Linux(2)
fork和exec函数fork( )用来创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;函数族exec( )用来启动另外的进程以取代当前运行的进程。Linux的进程控制和传统的Unix进程控制基本一致,只在一些细节的地方有些区别,例如在Linux系统中调用vfork和fork完全相同,而在有些版本的Unix系统中,vfork调用有不同的功能。由于这些差别几乎不影响我们大多数的编程,在这里我们不
2017-05-05 11:29:12 695
转载 线程池和内存池的实现
为什么需要线程池?大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的。在传统的多线程服务器模型中是这样实现的:一旦有个请求到达,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出。这就是”即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数
2017-04-26 13:29:31 2944
转载 Linux中线程同步:互斥锁/信号量/条件变量+无锁队列
基本概念互斥锁,条件变量,信号量 应用互斥锁POSIX线程锁机制的Linux实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待。值得注意的是,如果线程在加锁后解锁前被取消,锁将永远保持锁定状态,因此如果在关键区段内有取消点存在,或者设置了异步取消类型,则必须在退出回调函数中解锁。 这个锁机制同时也不是异步信号安全的,也就是说,不应该在信号处理过程中使用互斥锁,否则容易造成
2017-04-25 14:33:43 1579
转载 select和epoll的区别
select原理概述调用select时,会发生以下事情:从用户空间拷贝fd_set到内核空间;注册回调函数__pollwait; 遍历所有fd,对全部指定设备做一次poll(这里的poll是一个文件操作,它有两个参数,一个是文件fd本身,一个是当设备尚未就绪时调用的回调函数__pollwait,这个函数把设备自己特有的等待队列传给内核,让内核把当前的进程挂载到其中); 当设备就绪时,设备就会
2017-04-23 12:00:17 447
转载 C++知识点(2)
尽量用const,emum,inline替换#define换句话说,“宁可用编译器替换预处理器”,因为或许define不被视为语言的一部分。
2017-04-18 21:48:13 405 1
转载 分布式存储和一致性哈希
关于分布式存储如果单台机子的hashmap存储已经不能满足我们的key-value需求,我们就需要把存储内容分布到不同的实体机上。这时需要一种把key映射到不同机器的方法,我们想起了hash,可以把实体机当做是桶,采用和hashmap实现一样的思路,通过和实体机的数量取模,自然映射到不同的机器。 但现在问题来了,如果其中一台机子挂了,或者又加了一台机子怎么办,这时出现两种情况:不做任何改变,那么
2017-04-18 18:49:12 859
转载 TCP/IP网络协议
3次握手和4次挥手3次握手 首先,Client端发送连接请求报文,Server端接受报文后回复ACK报文,并为这次连接分配资源。 Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。4次挥手 其中,中断连接端可以是Client端,也可以是Server端。 假设Client端发起中断连接请求,发送FIN报文。 这时候,虽然Client端没有数
2017-04-04 14:17:17 2431
转载 Linux系统
最常用的20条命令cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。如:cd /root/Docements # 切换到目录/root/Docementscd ./path # 切换到当前目录下的path目录中,“.”表示当前目录 cd ../path # 切换到上层目
2017-04-04 14:03:38 1479
转载 C++知识点
智能指针概念void remodel(std::string & str){ std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; return;}当出现异常时(weird_t
2017-04-04 12:39:11 2285 1
转载 面试题:随机数生成、蓄水池抽样、海量数据、设计秒杀系统
等概率生成rand5生成rand3现在有一个Rand5函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使用任何能产生随机数的函数或数据源),生成等概率的[0, 3)范围内的随机整数。 思路是: 生成0-4的概率是相同的,进一步,生成0-2的概率也是相同的,这就满足了等概率的条件了。int Rand3() { int x; d
2017-04-04 11:47:58 3165 2
转载 网络安全
暴力破解攻击定义暴力破解攻击是指攻击者通过系统地组合所有可能性(例如登录时用到的账户名、密码),尝试所有的可能性破解用户的账户名、密码等敏感信息。攻击者会经常使用自动化脚本组合出正确的用户名和密码。 对防御者而言,给攻击者留的时间越长,其组合出正确的用户名和密码的可能性就越大。如何检测
2017-04-04 10:53:06 755
转载 设计模式
设计模式的分类总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型
2017-02-24 23:53:19 558
原创 补充:剑指offer等
包含min函数的栈题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 思路: 仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈,用来存放每次栈操作时(包括入栈和出栈)栈中最小元素。每次push一个新元素的时候,同时将最小元素push到辅助栈中(如果最小元素没有变化,就把它本身push
2017-02-18 21:13:24 466
原创 如何写出高质量的代码
从3方面确保代码的完整性在写代码之前,要考虑单元测试。如果能够设计全面的单元测试用例并在代码中体现出来,那么写出的代码自然也就是完整正确的了。通常我们从功能测试、边界测试和负面测试三方面来设计测试用例。 负面测试是指当输入不符合要求的时候,程序还能做出合理的错误处理。3种错误处理的方法函数返回值函数用返回值来告知调用者是否出错,如很多Windows的API。其缺点是使用不便。全局变量设置一个全局变
2017-02-18 16:52:59 3070
转载 深入理解计算机系统:链接
链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(拷贝)到存储器中并执行。链接可以执行于编译时,也就是源代码翻译成机器码时,也可以执行于加载时,也就是程序被加载到存储器并执行时,甚至执行于运行时,由应用程序来执行。链接是由叫做链接器的程序自动执行的。 链接器的出现,使得分离编译成为可能,我们不用将一个大型的应用程序组织为一个巨大的源文件,而是把它分解成更小、更好管
2016-12-13 21:24:17 1091
转载 Shell:函数、输入输出重定向、文件包含
用户可以定义函数,然后在Shell脚本中进行调用。 shell中函数的定义格式如下:funcname() { action; [return int;]}其中: 1. 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。 2. 参数返回,可以显示地加return 返回,后跟数值n(0-255)。如果不加return,将以最后一条命令的运行结果作
2016-12-12 10:08:13 2802
转载 Shell:流程控制
Shell的流程控制不可为空,如果else分支没有语句执行,就不要写这个else。 if elseif 语句语法格式:if conditionthen command1 command2 ... commandN fi写成一行(适用于终端命令提示符): if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true
2016-12-11 16:15:09 249
转载 Shell:基本运算符、echo、printf、test
Shell 和其他编程语言一样,支持多种运算符。原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,其中expr 最为常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ‘):!/bin/bashval=`expr 2 + 2`echo "两数之和为 : $val"执行脚本,输出结果为:两
2016-12-11 15:03:48 2604
转载 Shell:环境、变量、字符串、数组
Shell和Shell脚本Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell 脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和
2016-12-08 13:42:23 1939
转载 深入理解计算机系统:存储器层次结构
存储技术随机访问存储器(RAM)RAM分为两类:静态的和动态的。静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多。一个系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆字节。SRAMSRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的。这个电路有这样一个属性:它可以无限期地保持在两个不同的电压状态之一。其他任何状态都是不稳定的,电路会迅速转移到
2016-12-06 21:44:47 7159
转载 计算机网络:数据链路层:有线和无线网络
有线网络介绍结点和链路应用层、传输层和网络层的通信是端到端的,而数据链路层的通信是结点到结点的。在网络中,将端主机和路由器视为节点,将它们之间的网络视为链路。 两类链路有点对点链路和广播链路,在点对点链路中,链路专供给两个设备使用;在广播链路中,链路在几对设备之间共享。 例如,当两个朋友通过家用电话聊天时,他们使用的是点对点链路。当它们使用蜂窝电话时,他们使用的是广播链路,因为空气由很多蜂窝电话
2016-12-04 21:14:38 8154
转载 计算机网络:传输层和网络层
介绍传输层是客户程序和服务器程序之间的联络人,是一个进程之间的连接。传输层服务首先了解一下传输层所提供的服务。进程到进程通信TCP/IP协议簇的5层模型: 其中,网络层负责计算机层次的通信(主机到主机通信),网络层协议只把报文传递到目的计算机。然而,报文仍然需要递交给正确的进程,传输层协议即负责进程到进程的通信。 寻址:端口号在客户-服务器模式中,客户进程和服务器进程有相同的名字,例如,如果要从
2016-11-26 19:43:02 11246 1
转载 计算机网络:应用层
应用层介绍应用层为用户提供服务,通信是由逻辑连接提供的,这意味着两个应用层假设存在一个假想的直接连接。标准与非标准由于应用层是唯一向因特网用户提供服务的层次,所以新的应用协议能够轻松地加入因特网。应用层协议既可以标准化,也可以非标准化。 每个标准协议是一对程序,他们与用户和传输层进行交互。 一个私人公司可以创建一种新的定制非标准应用协议,来和遍布全球的办公室进行通信,公司使用TCP/IP协议簇前
2016-11-21 16:11:47 7108
原创 leetcode:图
207. 课程表排序给定一些课程,以及两两课程的前后顺序,判断能否修完所有的课。 思路: 很经典的拓扑排序问题。直接上代码:public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int edge=prerequisites.length;
2016-11-19 21:23:16 383
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人