redis 源码片段

 

1. redis的lru的使用

其中:

这个赋值是怎么体现lru的工作机制的?

 

2. 按照下面的调用过程来看redis对每个命令的处理过程:

至于redis协议中的每条指定对应server端的那一个函数,不会看到一个if..else.. 或者 switch结构的, 从 redisCommandTable 中来找就足够了(当然,quit命令找不到,似乎也只有quit命令)

 

3. 今天还了解一下细节

1) key和value都是作为redis的object来存储的,相同的value是重复使用的

2) 过期机制是通过将要过期的key写到一个过期table中来做的,这个是和memcache不同的

4. redis是支持认证机制的,当然,这样会多一次请求,而且认证请求不能和其它请求一起打包执行的

 

5. 关于Redis的LRU:

Redis的LRU是不精确的,不是在allkey中LRU的,而是在allkey中随机选取 maxmemory-samples 来LRU的,这一点要考虑一下是否满足需求。

redis_lru

 

(了解一下概率的计算方法吧)

摘录: http://oldblog.antirez.com/post/redis-as-LRU-cache.html

maxmemory-samples number_of_samples

The last config option is used to tune the algorithms precision. In order to save memory Redis just adds a 22 bits field to every object for LRU. When we need to remove a key we sample N keys, and remove the one that was idle for longer time. For default three keys are sampled, that is a reasonable approximation of LRU in the long run, but you can get more precision at the cost of some more CPU time changing the number of keys to sample.

Redis 2.2 的配置文件关于LRU的相关说明:

 

如何spawn多个外部程序并且accept同一个socket

缘起

学习fastcgi的时候,多个fcgi进程的启动和管理是个无法回避的问题;有一个叫做spawn-fcgi的程序,可以启动多个php-cgi进程,并且同时accept同一个socket,因为spawn-fcgi和php-cgi是两个项目中的程序,那么他们是如何配合的如此默契的呢?

资料: http://redmine.lighttpd.net/projects/spawn-fcgi    其中主要是: http://redmine.lighttpd.net/projects/spawn-fcgi/repository/entry/trunk/src/spawn-fcgi.c

 

分析

从代码来看,spawn-fcgi负责lisent一个socket,然后开始fork指定数量的子进程,每个子进程中先把socket的fd复制到FCGI使用的fd(似乎是约定好的一个fd),然后就把后续的事情通过exec交给外部的进程(如:php-cgi)了

下面看一下PHP中fastcgi的相关逻辑, 文件 sapi/cgi/fastcgi.c 中的 int fcgi_init(void);函数体现了如何识别是否fastcgi的逻辑,大致意思为: 如果标准输入为一个socket(不是fileno),则认为是fastcgi,代码片段如下:

 

注意其中 getpeername(…)的使用,如果 errno == ENOTCONN 才可能认为是fastcgi,那么,如果刚好该socket处于连接状态不就不能视为fastcgi环境了吗?  或许吧

 

通过fcgi-kit来学习fastcgi

工具下载地址: http://www.fastcgi.com/dist/fcgi.tar.gz

工具使用文档:  http://www.fastcgi.com/devkit/doc/fcgi-devel-kit.htm

命令:

 

命令: 连接一个真是存在的fcgi server

这里只写了两个环境变量,不过,也至少要有这两个:

windows 下使用nginx心得

1. 如果使用fastcgi,则没有一个好的fastcgi进程管理程序,lighttpd中有一个Spawn-Fcgi.exe http://en.wlmp-project.net/

2. 当nginx放在windows上,而fastcgi进程在linux上时,需要注意一个问题,root目录可能不对,如下:

如果nginx是在D: 盘的话,则fastcgi看到的$document_root 为: d:/home/phpor/www ,而且会认为是一个相对目录,这样,自然是找不到要执行的文件的,可修改如下:

3. nginx 天生是不支持cgi的,所以想配个cgi也不成的

4. nginx 放在windows上仅仅学习而用

 

再见了msn

如果你再安装msn,安装完毕登录时,会要求你更新,更新后的是skype,skype整合了msn: http://skype.tom.com/

 

微软的outlook配置hotmail邮箱的时候还需要一个单独的OutlookConnector.exe需要安装,下载地址: http://download.microsoft.com/download/0/0/D/00DF5174-E7FB-4F70-B843-83CBDE509491/OutlookConnector.exe

而且,该地址还被墙了,或者说,微软的很多东西都被墙了,晕

 

 

Ubuntu 使用心得

优点:

有一个不错的软件仓库,“不错”说的是很方便安装/更新软件,而不是里面的软件“不错”

 

缺点:

1.  没有一个好使的exchange日历的客户端(可能和exchange的server端的配置也有些关系)

2. 公司的打印机需要专门的客户端软件,而这个专门的软件也只有windows版本的

3. 没有一个好使的截屏-编辑软件,像QQ的ctrl+alt+A

4. 没有一个好使的QQ软件

5. 邮件客户端真的很土,大名鼎鼎的thunderbird也不过如此,体验不是一般的差

6. 没有一个好使的可视化的svn客户端软件

7. 没有一个好使的中文输入法,像sougo那样的

8. ubuntu的字体其实并不好看,图形界面远没有windows看着舒服

9. 没有一个自动更新强制的软件(在线更新的那种),不要让我自己找图片

10.  。。。

 

感悟:

一个好的操作系统,不仅要稳定、高效,更重要的是他需要有很多好用的周边软件

 

svn merge

从主干到分支:

svn merge ^/path/from/root/to/trunk ./branch

等价于:

svn merge https://svn.xxx.xxx/path/from/root/trunk  ./branch

(因为 ./branch 是一个版本控制的目录,可以从中获取到svn的url地址,使用该版本库的根目录替换 ^ 就得到所等价的命令了

从branch到主干:

svn merge –integrate ^/path/to/branch ./trunk