- 博客(102)
- 资源 (4)
- 收藏
- 关注
原创 基于RABC权限管理的后台管理项目新权限的设计思想
说到权限很多人都会想到RBAC,ACL等等,这些方案都是十分成熟的权限管理方案,最早写PHP用yii2框架的时候,就自带了rbac权限管理,也对rbac比较熟悉,但今天想说的不仅仅局限于路由权限。RBAC权限管理关于rbac权限管理gg可以出一堆文章,基于角色的访问控制,把一堆路由分配给一个角色,然后把一堆角色分配给项目中的某个人,此人即拥有这些路由的访问权限。这里只对rbac做出简单的说明,此处不
2017-10-20 17:39:12 2815
原创 高并发读与高并发写的项目总结和mongodb使用中遇到的坑
最近开发了一个既要高并发写又要高并发读的项目,写的QPS比读还要高,这个需求几乎是变态的,任何缓存的工具都没法使用,数据在一秒内可能变化的几十遍,只能每次请求都实时从数据库读取。下面分如下几点介绍我们是如何技术选型的。一、选择通信协议之前写的项目并发量很小,http+keepalive完全可以搞定了,此项目http完全架不住,因为使用http协议传递数据,那么数据最友好的格式就是json,但是亲测过
2017-09-11 16:12:21 2561 4
原创 高并发读与高并发写的项目总结和mongodb使用中遇到的坑
最近开发了一个既要高并发写又要高并发读的项目,写的QPS比读还要高,这个需求几乎是变态的,任何缓存的工具都没法使用,数据在一秒内可能变化的几十遍,只能每次请求都实时从数据库读取。下面分如下几点介绍我们是如何技术选型的。一、选择通信协议之前写的项目并发量很小,http+keepalive完全可以搞定了,此项目http完全架不住,因为使用http协议传递数据,那么数据最友好的格式就是json,
2017-01-04 11:06:46 25617 5
原创 LeetCode中几道链表反转相关题目(Reorder List、Rotate List、Reverse Nodes in k-Group)
三道很常见的面试题,reorderList
2014-08-31 12:48:51 3800
原创 实习面试总结
3月初从武汉回到帝都,休息了一个周末,开始拿出各类书籍开始复习,目的就是为了能在3月份找份不错的互联网公司的实习,复习了一周的基础数据结构与算法之后,开始给在各大互联网公司的同学、学弟、学长送简历,帮忙内推,同时自己也在大街网上广投简历,过了几天也陆陆续续收到了一些公司的面试通知。面试的第一家是创新工场的“秘密”团队,这个是大街上投的唯一邀请面试的公司,过去就聊了聊之前在中科院空间所做
2014-03-26 14:59:57 5929 5
原创 Redis数据持久化机制AOF原理分析二
本文所引用的源码全部来自Redis2.8.2版本。Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c在阅读本文之前请先阅读Redis数据持久化机制AOF原理分析之配置详解文章,了解AOF相关参数的解析,文章链接http://blog.csdn.net/acceptedxukai/ar
2014-01-12 15:36:08 7695 1
原创 Redis数据持久化机制AOF原理分析一
本文所引用的源码全部来自Redis2.8.2版本。Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c在阅读本文之前请先阅读Redis数据持久化机制AOF原理分析之配置详解文章,了解AOF相关参数的解析,文章链接http://blog.csdn.net/acceptedxukai/article/
2014-01-11 14:19:15 5361
原创 Redis2.8.2源码注解github资源下载与本周吐槽
之前一直没有使用过Git,折腾了半天,乱整一通,终于把当前注释的Redis-2.8.2的源码放到Gitbub上了,https://github.com/xkeyideal/annotated-redis-2.8.2,对于代码中出现的错误注释等,本人概不负责,只提供参考。注册Github,下载Windows客户端,使用Gitshell乱整一通搞定RSA验证,上传注释代码。
2014-01-10 23:49:47 4479
原创 Redis数据类型与指令详解之集合(t_set)
本文所引用的源码全部来自Redis2.8.2版本。REDIS_SET集合数据类型与指令相关文件是t_set.h, redis.h, object.c转载请注明,文章出自:http://blog.csdn.net/acceptedxukai/article/details/17883153集合编码方式Redis 集合(set)使用REDIS_ENCONDING_I
2014-01-05 15:52:25 7181 1
原创 Redis源码整体运行流程详解
本文所引用的源码全部来自Redis2.8.2版本。Redis源码整体运行流程的相关文件是:redis.h, redis.c, networking.c, ae.h, ae.c。转载请注明,本文出自:http://blog.csdn.net/acceptedxukai/article/details/17842119Redis Server端处理Client请求的流程图
2014-01-04 16:35:39 11611
原创 Redis内部数据结构详解之字典(dict)
本文所引用的源码全部来自Redis2.8.2版本。Redis中字典dict数据结构与API相关文件是:dict.h, dict.c。本文讲解的不是很详细,可以同时参考Redis实现与设计一书中字典部分,本文关于字典的核心代码的注释可以参考。字典,简单说就是存储key-value键值数据,当然value=NULL那么就是集合了。字典通俗来说就是C++ STL中的m
2013-12-22 16:44:09 9602 4
原创 Redis内部数据结构详解之简单动态字符串(sds)
本文所引用的源码全部来自Redis2.8.2版本。Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c。转载请注明,本文出自:http://blog.csdn.net/acceptedxukai/article/details/17482611预备知识下面介绍有关sizeof计算参数所占字节数的部分实例
2013-12-22 13:54:25 10390 4
原创 Redis内部数据结构详解之整数集合(intset)
本文所引用的源码全部来自Redis2.8.2版本。Redis中intset数据结构与API相关文件是intset.c, intset.h。整数集合简介整数集合intset用于有序、无重复地保存多个整数值,根据集合中元素的值自动选择使用整数类型来保存元素,例如:如果intset中绝对值最大的整数可以用int32_t来保存,那么整个intset中所有元素都使
2013-12-21 22:32:14 7579
原创 Redis内部数据结构详解之双向链表(linkedlist)
本文所引用的源码全部来自Redis2.8.2版本。Redis中linkedlist数据结构与API相关文件是adlist.c, adlist.h。本文主要讲解Redis中对双向链表的详细实现,以及相关API的分析,对于双向链表本身可以从任意一本数据结构书本中得到详解。一、双向链表简介双向链表作为一种常见的数据结构,在严蔚敏数据结构书里有详细的讲解,双向链表的每个数据节点都有
2013-12-21 15:52:17 6724 1
原创 Redis内部数据结构详解之压缩链表(ziplist)
本文所引用的源码全部来自Redis2.8.2版本。Redis中ziplist数据结构与API相关文件是:ziplist.h, ziplist.c, t_zset.c。一、ziplist的构成是一个4字节无符号整数,用来存储整个ziplist占用的字节数;是一个4字节无符号整数,用来存储ziplist最后一个节点的相对于ziplist首地址偏移量;是一个2字节
2013-12-20 22:36:21 12431 1
原创 Redis内部数据结构详解之跳跃表(skiplist)
一、跳跃表简介跳跃表是一种随机化数据结构,基于并联的链表,其效率可以比拟平衡二叉树,查找、删除、插入等操作都可以在对数期望时间内完成,对比平衡树,跳跃表的实现要简单直观很多。以下是一个跳跃表的例图(来自维基百科):从图中可以看出跳跃表主要有以下几个部分构成:1、 表头head:负责维护跳跃表的节点指针2、 节点node:实际保存元素值,每个节点有一层或多层3
2013-12-15 14:09:56 28624 5
原创 堆排序与第K小数最大顶堆
#include #include using namespace std;int a[100];void swap(int &x ,int &y){ int temp; temp = x; x = y; y = temp;}void heap_adjust(int root,int n){//max heap int j = root <
2013-06-24 00:34:26 2903 2
原创 bitmap与2bitmap实现
Bitmap就是用一个bit位来标记某个元素是否存在,而2Bitmap就是用两个bit为来标记某个元素的个数,00,01,10,11(分别表示0,1,2,3,0表示不存在,1表示存在1次,后面依次)。Bitmap能用来处理下面的两个问题:(1)、在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数(2)、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序
2013-06-04 21:06:28 6124 1
原创 Splay Tree源码
注:此代码非本人所写,实现方式为自底向上,在做ACM题目时比教科书上的自顶向下在数据处理上要好操作。由于个人现在比较钟爱指针,所以从网上找了个指针实现的源码,只是添加了点个人的理解注释和一些其他操作。http://dongxicheng.org/structure/splay-tree/此博客对Splay Treee分析比较透彻,需要注意的是,Splay Tree的旋转操作与其他平衡树如R
2013-05-30 20:58:38 2012
原创 Skip List跳跃表代码实现
Skip List相关知识介绍:http://blog.nosqlfan.com/html/3041.html http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html#include #include #include #include using namespace std;#define MAX_
2013-05-13 23:15:16 3780 4
原创 经典排序——归并、快排递归与非递归实现与冒泡排序
#include #include #include #include #include using namespace std;void merge(int a[],int b[],int l,int mid,int r){ int i = l, j = mid + 1; int k = 0; while(i <= mid && j <= r){
2013-05-05 10:52:23 1213
原创 RabbitMQ Python——Asynchronous publisher example
# -*- coding: utf-8 -*-import loggingimport pikaimport jsonLOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' '-35s %(lineno) -5d: %(message)s')LOGGER = loggin
2013-04-27 23:07:18 3350 2
原创 Python 几个常用的内建函数
#build-in functions'''1 list(iter) 将iter转换为list2 tuple(iter) 将iter转换为tuple3 enumerate(iter,start=0) 4 len(seq) 获取seq的长度5 max(iter,key=None) or max(arg0,arg1,arg2..,key = None) 6 min(iter,key=No
2013-04-20 17:27:44 1493
原创 Python urlparse总结
res = urlparse.urlparse(url,scheme,allow_fragments)返回一个6-tuple,类型是ParseResult(scheme, netloc, path, params, query, fragment)ParseResult类还有几个常用方法:res.usernameres.passwordres.hostnameres.por
2013-04-15 22:09:53 11155
原创 APUE学习笔记——socket通信 阻塞IO
服务器端:#include #include #include #include #include #include #include #include #include #define BACKLOG 10int main(){ struct sockaddr_in server_sockaddr,client_sockaddr; int sockfd
2013-04-14 17:48:29 1471
原创 APUE学习笔记——第十六章 网络IPC:套接字
1、套接字描述符套接字是通信端点的抽象,与应用程序要使用文件描述符访问文件一样,访问套接字也需要用套接字描述符,套接字描述符在UNIX系统是用文件描述符实现的,许多文件描述符函数(如read write)都可以处理套接字描述符。创建一个套接字,调用socket函数#include int socket(int domain,int type,int protocol)//若成功返回
2013-04-14 15:25:11 1265
原创 Python Twisted学习总结
最近几天丢下了之前学习的UNIX环境高级编程(APUE),开始重新学习Twisted,之前在中科院空间所参与的项目使用的是Twisted异步编程框架,当时对Twisted的理解不是很深刻,因此又重新学习一遍。异步编程简单的理解就是使用Unix中的复用I/O,使得CPU的效率使用更高,总体来说现在的编程有个趋势:单进程-->多线程-->异步编程-->协程(可能不准确),异步编程其实只使用一个CP
2013-04-13 16:36:36 2030
原创 XSI IPC——System V消息队列
System V消息队列1、key_t键和ftok函数三种类型的System V IPC使用key_t值作为它们的名字,头文件把key_t这个数据类型定义为一个整数。函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键。#include key_t ftok(const char* pathname, int id);该函数把从pathnam
2013-04-05 15:46:58 1812
原创 APUE学习笔记——第十五章 进程间通信
进程间通信IPC(InterProcess Communication)是指能在两个进程间进行数据交换的机制。1、管道管道是UNIX系统IPC的最古老形式,并且所有UNIX系统都提供此通信机制。管道有下面两种局限性:(1)历史上,它们是半双工的,现在某些系统提供全双工管道(2)它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父子进程之
2013-04-02 23:58:14 1252
原创 APUE学习笔记——第十四章 高级IO
1、非阻塞IO低速系统调用是可能会使进程永远阻塞的一类系统调用,包括:(1)如果某些文件类型(管道、终端设备)的数据并不存在,则读操作可能会使调用者永远阻塞(2)如果数据不能立即被上述同样类型的文件接受,则写操作也会使调用者永远阻塞(3)在某种条件发生之前,打开某些类型的文件会被阻塞(4)对已经加上强制性记录锁的文件进行读、写(5)某些ioctl操作(6)某些进程间通信
2013-04-01 21:38:41 1426
原创 APUE学习笔记——第十三章 守护进程
1、编程规则(1)首先调用umask将文件模式创建屏蔽字设置为0.由继承得来的文件模式创建屏蔽字可能会拒绝设置某些权限。例如:若守护进程要创建一个组可读、写的文件,而继承的文件模式创建屏蔽字可能屏蔽了这两种权限,于是所要求的组可读、写就不能起作用。(2)调用fork,然后使父进程退出(exit)。这样做实现了下面几点:第一,如果该守护进程是作为一条简单shell命令启动的,那么父进程终止使
2013-03-31 18:28:21 1899
原创 APUE学习笔记——第十二章 线程控制
本章学习控制线程行为方面的详细内容,在上章中对线程属性和同步原语属性都取其默认行为,接下来将介绍同一进程中的多个线程之间如何保持数据的私有性,最后讨论基于进程的系统调用如何与线程进行交互。1、线程限制: Single Unix Specification定义了与线程操作有关的一些限制,和其他的限制一样,可以通过sysconf来查询。和其它的限制使用目的一样,为了应用程序的在不同操作 系
2013-03-29 22:14:29 1535
原创 APUE学习笔记——第十一章 线程
典型的UNIX进程可以看成只有一个控制线程:一个进程在同一时刻只能做一件事情。有了多个控制线程之后,在程序设计时可以把进程设计成在同一时刻能够做不止一件事,每个线程处理各自独立的任务。使用线程有很多好处:(1)、通过为每种事件类型的处理分配单独的线程,能够简化处理异步事件的代码。(2)、多个线程自动地可以访问相同的存储地址空间和文件描述符(3)、将一个问题分解为多个程序,改善整个程序的
2013-03-28 16:27:51 1226
原创 APUE学习笔记—— 信号实现系统sleep和system函数,解决进程竞争实例
1、实现系统sleep函数此函数使调用进程被挂起,直到满足下列条件之一:(1)已经经过seconds所指定的墙上时钟时间(2)调用进程捕捉到一个信号并从信号处理程序返回。以下的可靠实现并没有考虑到两个alarm交互作用的情况可靠实现如下:#include #include #include #include void sig_alarm(){}int slee
2013-03-26 17:06:19 1767
原创 APUE学习笔记——第十章 信号
1、信号信号是软件中断,很多比较重要的应用程序都需要处理信号,信号提供了一种处理异步事件的方法,例如:终端用户键入中断键,则会通过信号机制停止一个程序。每个信号都有一个名字,这些名字都是以SIG开头,在头文件中,信号都被定义为正整数。很多条件可以产生信号:(1)当用户按某些终端键时,引发终端产生的信号。按Ctrl+C键,通常产生SIGINT中断信号(2)硬件异常产生信号。例
2013-03-26 16:06:23 1182
原创 APUE学习笔记——第八章 进程控制
本章的重点内容比较多,fork函数,wait和waitpid函数,exec函数,system函数等。1、进程标识符#include pid_t getpid(void); //调用进程的进程IDpid_t getppid(void); //调用进程的父进程IDgid_t getgid(void); //调用进程的实际组IDgid_t getegid(v
2013-03-24 19:11:42 1502
原创 APUE学习笔记——第七章 进程环境
1、main函数原型:int main(int argc, char *argv[]) 其中argc是命令行参数的数目,argv是指向参数的各个指针构成的数组。main函数的命令行参数代码如下:#include #include int main(int argc,char *argv[]){ int i; for(i = 0 ; i < argc ; i ++
2013-03-24 14:18:32 1032
Spring JDBC实现代码
2012-07-27
分酒问题 三个酒杯A B C分别可装8升、5升、3升酒,开始B C装满了酒,在没有其它工具的情况下,将酒平分
2009-12-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人