使用 Go 编写 Redis Loadable Modules

什么是redis loadable modules

可加载模块是redis最新加入的功能,目前需要在unstable分支才可以使用。简单说模块系统是redis的C代码暴露出一些API,定义在头文件redismodule.h中,外部模块引用该头文件即可调用所有API函数,这些API提供了包括访问redis的字典空间、调用redis命令、向客户端返回数据等诸多功能。外部模块是以动态库的形式被redis server加载并使用,可以在redis server启动时加载,也可以在启动后动态加载。更多的细节可以参考文档redis module INTRO

在此之前想对redis扩展有两种方案:一是利用lua脚本;另一种则需要修改redis源码,类似于Kit of Redis Module Tools提供的方案。lua脚本的扩展性有限,并且lua是通过redis的上层API来调用redis命令的,无法直接访问底层的存储数据,调用redis更底层的API;修改源码的方案就更加hack,是没有办法不断与上游分支合并的。

显然新的模块系统明显优于以上两种方案,优点包括:

  • 直接访问redis存储的各种数据结构;
  • 直接对存储数据的内存进行操作;
  • 模块仅依赖redismodule.h暴露的接口函数,而不依赖redis本身的实现,因此可以兼容redis的版本升级。
Read on →

RQ (Redis Queue) 使用的一些思考

最近使用了 rq 这个简单的队列处理库,其中有一些任务需要使用MySQL的连接或者redis的连接,对此有一些思考。

MySQL/redis的连接复用

rq 提供了两种 worker 模型:基于 fork 的 worker 模型和直接在主线程执行任务的 worker 模型。基于 fork 的 worker 在执行任务之前先 fork 一个子进程,在子进程中执行具体的任务,父进程等待子进程执行返回。在基于 fork 的 worker 模型下,如果在父进程有一个 MySQL/redis 连接,由于子进程会继承父进程的地址空间,具有相同的打开文件、socket、管道等,所以子进程中也有同样的 MySQL/redis 连接,那么在这种情况下这个连接可以直接使用么?通过以下代码简单测试一下,连接 MySQL 使用 torndb ,连接 redis 使用 redis-py

Read on →

SSH Through Different Kinds of Proxy

有时候因为网络、安全等原因,我们不能通过 ssh 直接连接到目标主机,而是需要通过代理服务器或跳板机实现连接。本文总结通过代理或跳板机使用 ssh 的各种方法,并且分析这些方法的基本原理。

我们设定本地主机的地址为 homepc,绑定有公网 ip;运行有各类代理的代理服务器或跳板机地址为 proxy-server,proxy-server 上绑定一个公网 ip,同时绑定一个内网 ip(假定为10.0.10.252);需要连接的目标主机 target-server,绑定内网 ip(假定为 10.0.10.25)。所有的用户名、登录用户名使用 apple。

Read on →

Python 拾遗2

本文是上一篇文章 python 拾遗 的延续,继续整理 python 的一些使用技巧,以及一些可能被忽略的细节

注意: 以下讨论主要为 Python2.7 版本, Python 3 的内容有待跟进

Read on →

Python 拾遗

整理 python 使用的一些技巧,以及一些可能被忽略的细节,很多在文档可以查找到的内容将不会过多的描述,更多以外链的形式存在。

注意: 以下讨论主要为 Python2.7 版本, Python 3 的内容有待跟进

Read on →

Making Ebooks of Pro Git

Pro Git 是一本用来学习 git 使用很不错的书,从 progit 这个开源项目可以获得这本书的全部内容,下边介绍在 Ubuntu Server 12.04 环境下制作电子书的过程。

安装依赖

1. ruby, rubygems

参考 Ruby-China 的 wiki

2. rdiscount

markdown 使用的模板,通过 rubygems 安装

1
$ gem install rdiscount

3. calibre

calibre 是一款开源的电子书管理软件,生成 epub 或 mobi 格式需要安装。

1
$ sudo apt-get install calibre
Read on →