- 浏览: 737132 次
- 性别:
- 来自: 上海
-
最新评论
-
lijunwyf:
cevin15 写道可以看下这个开源软件,https://gi ...
用markdown2html把md转换成html -
cevin15:
可以看下这个开源软件,https://github.com/c ...
用markdown2html把md转换成html -
Raina:
运行不了呢……提示错误无法加载主类Baiduwallpaper ...
用Java更换Windows桌面壁纸 -
苏城细雨沐秋风:
我把解码的jar添加到类路径后,mp3可以播放,但是flac和 ...
java播放mp3/ogg/ape/flac音乐 -
peishuai1987:
请问楼主现在怎么样了,读了很多源码吗,比如mybatis、sp ...
mybatis源码阅读心得
文章列表
1. 发布/订阅
发布/订阅(Publish/subscribe 或pub/sub)是一种消息范式,消息的发送者(发布者)不是计划发送其消息给特定的接收者(订阅者)。而是发布的消息分为不同的类别,而不需要知道什么样的订阅者订阅。订阅者对一个或多个类别表达兴趣,于是只接收感兴趣的消息,而不需要知道什么样的发布者发布的消息。
这种发布者和订阅者的解耦可以允许更好的可扩展性和更为动态的网络拓扑.
如果对redis的发布订阅功能还不了解的话,可以参考官方文档翻译版
Redis 发布/订阅(Pub/Sub)
2. 数据结构
redis里面发布订阅相对来说是独立的一个模块,代码也比较简单。
先看数据结构 ...
1.高层视角
可首先阅读《Redis设计与实现》中的服务器与客户端
原文已经相当详细了,可以代码结合文章细细品读。
2. 服务器启动过程
1)初始化服务器全局状态。 initServerConfig()
2)Sentinel功能初始化 initSentinel()
3)载入配置文件。 loadServerConfig()
4)创建 daemon 进程。 daemonize()
5)初始化服务器功能模块。 initServer()
6)打印 ASCII LOGO。 redisAsciiArt()
6)从AOF文件或者RDB文件中载入数据。 loadDataFromDisk ...
1. Reactor模式
Reactor模式(反应器模式)是一个事件处理模式,用来处理并发的服务请求,将一个或多个客户的服务请求分离(demultiplex),然后分发(dispatch)给处理器(request handler)。
Reactor模式如图所示
实现
如c语言里有libevent,libev,以及redis自己实现的ae
c++语言里有boost的asio
java语言里有mina,netty,http core
javascript语言里的nodejs
另外还有Proactor模式,可以理解成是异步的Reactor模式。
2. Redis的实现
Redis 基于 Rea ...
1. 持久化
Redis提供了两种持久化数据到硬盘的方式。
RDB:数据库里所有记录的一个快照
AOF(append only file):原汁原味地记录了每次操作命令的历史记录,相当于一个log
如果还没了解过持久化功能的话,请先阅读Redis官网上的persistence手册中文翻译版。
RDB以二进制方式存储,每条记录只记一次,文件大小更紧凑,这样恢复起来更快。但是写这个RDB需要时间,这样会造成宕机后数据丢失。
AOF以文本文件方式存储,把每条命令都记下来,会有冗余,但是写aof快,只要往文件末尾追加记录即可,可以使得宕机后可以恢复更多的数据。
接下来可以阅读Redis 设计与实现 ...
1. 高层视角解读
Redis设计与实现中的数据库章节
Redis是一个键值对数据库,所以它的数据库本身也是一个字典(俗称 key space):
字典的键是一个字符串对象。
字典的值则可以是包括字符串、列表、哈希表、集合或有序集在内的任意一种 Redis 类型对象。
数据结构如下图所示
2. 数据库的结构
在redis.h中定义了数据库的结构体
typedef struct redisDb {
// 数据库键空间,保存着数据库中的所有键值对
dict *dict;
// 键的过期时间,字典的键为键,字典的值为过期事件 UNIX 时间戳
...
1. 简介
传统概念下的javascript是运行在前端(浏览器)的,而Node.js可以在后端(脱离浏览器环境)运行javascript代码。
Node.js是一个事件驱动I/O服务端JavaScript环境,使用了Google的V8引擎,来解释和执行JavaScript代码,实现了部分CommonJS规范,可方便地构建快速,可扩展的网络应用程序的平台。Node.js使用事件驱动,非阻塞I/O模型,轻量、高效,可以完美地处理时时数据,运行在不同的设备上。
2. 下载
去官网下载,本文写作时最新版为v0.10.29,Windows32位、64位的都有,选择匹配的下载即可。建议下载Windows ...
本篇我们研究redis里的对象。
1. 概述
redis有5种对象类型
字符串
列表
哈希
集合
有序集合
它们的底层数据结构都是由前面6篇文章提到的所实现的。
请先参考如下文章,并结合源码阅读体会。
http://www.redisbook.com/en/latest/toc.html里的8.对象
http://origin.redisbook.com/en/latest/里的第三部分:Redis 数据类型
2. 一种类型,多种实现
redis使得一种对象类型的实现可以由不同的数据结构来切换,从而同时兼顾性能(CPU)和内存。而且当某个底层数据结构有性能问题时,可以替换掉。当然这种替 ...
1.高层视角解读
压缩列表(ziplist)是为了尽可能地节约内存而设计的特殊编码双端链表,是列表键和哈希键的底层实现之一。
当一个列表键或者哈希键只包含少量项, 并且每个项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做底层实现。
请先看这篇文章
http://www.redisbook.com/en/latest/toc.html 里的第7章——压缩列表
2.底层代码
请看ziplist.h , ziplist.c, 2000多行代码。
3.(题外话)代码调试
和前面5篇文章提到的源代码相比,ziplist是到目前为止最复杂的一个数据结构了。首 ...
1.高层视角解读
整数集合(intset)是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合键的底层实现。Intset 不支持降级操作。
请先看这篇文章
http://www.redisbook.com/en/latest/toc.html 里的第6章——整数集合
redis中的intset的数据结构如图所示
可以看到contents[]里面保存的数字都是从小到大排好的。
2.底层代码
请看intset.h , intset.c,还是比较简单的,800行代码。
Q:intset元素的个数不能超过512?
A:这 ...
0.跳表基础知识
跳表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。
跳跃表支持平均 O(log N) 最坏 O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理 ...
1.高层视角解读
字典, 又称符号表(symbol table)、关联数组(associative array)或者映射(map), 是一种用于保存键值对(key-value pair)的抽象数据结构。
请先看关于字典的一组文章
http://www.redisbook.com/en/latest/toc.html里面的第4章— ...
adlist(A doubly linked list)是Redis里实现的一个双向链表。
1.高层视角解读
请先看这篇文章
链表和链表节点的实现
链表的数据结构如图所示:
2.底层代码
请看adlist.h, adlist.c,很简单的,学过数据结构的看这个一般没问题。
3.疑难点解惑
Q:节点的值定义为void *value;
void *什么意思?
A:void pointer, 或者叫general purpose pointer,可以用来存储任意类型变量的地址。
例子
void *ptr; // ptr is declared as Void pointer
...
最近突然一时兴起,开始看redis的源代码实现。《redis源码阅读笔记》系列将记录下我阅读redis源码的一些笔记和心得。
第一篇我们从最简单的sds(Simple Dynamic String,简单动态字符串)开始啦。
网上已经有一些很好的代码解析的 ...
1.简介
FOP可以用来将xml转换成pdf。
当然他还支持输出成其他格式,输出支持的格式有PDF, PS, PCL, AFP, XML (area tree representation), Print, AWT, PNG, RTF, TXT。
输入的格式是XSL-FO,可以是单独的一个fo文件,或者采用xml+xslt结合的方式。
2.下载
先去官网下载包fop-1.1-bin.zip,目前最新版是1.1。
然后解压,可以看到根目录下有一个fop.bat,等下命令行执行要用到它。
lib目录是依赖的一些jar包。
3.第一个例子
3.1 写一个xml,等下我们要将这个xml用FOP转成p ...
1.简介
IText是一个生成PDF文件的Java类库。支持文本,表格,图形的操作。
2.第一个程序
2.1 如果用maven的话,加入以下依赖即可,目前最新版是5.5.1
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.1</version>
</dependency>
2.2 生成一个简单的pdf文件
import ...