Skip to content

KevinQi1981/irid

Repository files navigation

一.Irid简介
Irid(Iridescent)是本人在CentOS5.3下用纯C写的一个缓存应用程序(类似memcached、redis),不依赖额外第三方库。
她有以下特点:
1)epoll + 多线程支持高并发(使用长连接性能更佳).
2)纯内存操作,速度快.
3)支持memcache通讯协议(add get set delete replace append prepend increment decrement),客户端无需装额外扩展
4)程序内部使用LRU算法实现热点缓存功能(当容量达到上限的时候,优先将少人访问的缓存数据剔除,在内存一定的前提下,提高命中率)
5)支持动态修改配置,修改segment的容量(需执行reload指令)
5)扩展支持存储结构化数据,例如可以存储php的array(serialize),可以单独更新某个array的某个键值

	例子:有个数组如下
	key=user_12345678
	value=array(
		"userId"=>12345678,
		"username"=>"乐园用户",
		"mood"=>"天气真好啊!",
		"friendId"=>array(1,2,3,4,5,6,7,8,9),
		"other"=>array(
			"login_num"=>10,
		)
	)
	情景1:根据用户id获取用户名称
		$username = $mc->get("user_12345678@username");

	情景2:为数组添加多一个key last_login_time
		$mc->set("user_12345678@other.last_login_time",time());

	情景3:修改用户的mood
		$mc->append("user_12345678@mood",",好想去玩啊!!!")

	情景4:增加登录次数
		$mc->increment("user_12345678@other.login_num");

	更多调用例子参考testcase下的php文件

6)增强了部分功能:(原生memcache客户段不支持,需要自己实现)
	1.支持模糊搜索key(list指令)
	2.支持对数组push、pop、shift、unshift操作 
	3.支持统计数组元素个数(count指令)
	4.支持分页获取数据(page指令)

7)提高cli接口,方便管理,cli帮助如下:
	./Irid Usage:
	  start server  ./Irid -c irid.conf 	//启动服务器
	  stop server   ./Irid -s stop			//关闭服务器

	./Irid CLI API:
	  ./Irid add host:port key value		
	  ./Irid append host:port key value		
	  ./Irid count host:port key			//统计数组中有多少个元素
	  ./Irid decrement host:port key num
	  ./Irid delete host:port key
	  ./Irid flush_all host:port			//清除所有数据
	  ./Irid get host:port key1 [key2]
	  ./Irid increment host:port key num
	  ./Irid list host:port [-fm str] [-mm str] [-em str] //模糊查询key,支持3种匹配模式(前缀匹配、中缀匹配、后缀匹配)
	  ./Irid page host:port key offset limit 	//分页显示数据
	  ./Irid prepend host:port key value
	  ./Irid pop host:port key
	  ./Irid push host:port key value
	  ./Irid reload host:port filename		//重新加载配置
	  ./Irid replace host:port key value 
	  ./Irid set host:port key value
	  ./Irid shift host:port key
	  ./Irid stats host:port				//查看当前服务器的运行的状态
	  ./Irid unshift host:port key value
	  ./Irid version host:port

当前v0.9版全部代码大概5500行,95%代码都是本人原创编写的(除了暴雪的hash_code和自己改写过的系统rbtree外),
程序经过内存工具valgrind和自己写的内存小工具测试过,是没有内存泄露的.
程序经过应用层单元测试(php调用),暂时还没有发现很大的问题.
PS:没有bug的就不叫程序,希望大家帮忙找找bug,毕竟这个程序写的很匆忙,加上本人水平很菜,希望在这里抛砖引玉,以后多多交流.

二.应用场景:
1)取代memcached,当缓存系统使用.
2)做热点缓存服务器(基于LRU算法),容量大小可配置,无需再为缓存的实效时间头疼.
3)对缓存中的大数组,可以单独对部分数据进行增删改查
4)对缓存中的列表数据(如好友id列表),可以分页获取(原生memcache客户端不支持)

三.实现要点:
1)使用epoll+多线程实现一个高性能,高并发的Server
主线程负责接收网络新连接,并将recv回来的数据写到一个链表里面去(recv_mlist),而其他子线程就从链表(recv_mlist)获取数据,
并进行业务操作,最后将结果send回给客户端,支持长连接(长连接的性能比短连接性能高很多),当前版本不支持跨平台

2)实现LRU(Least Recently Used)算法
程序中结合业务的特性,使用N个双向链表+哈希表(开放地址法)来实现的。
哈希表用于快速定位key在那个bucket,而链表用于实现对权重(weight)排序,多个链表是用于维护业务的合理性
每一条数据都有一个权重(weight),当操作一次(get set replace increment decrement append prepend)权重就会加1
程序会自动修正哈希桶的状态,避免哈希桶在经过多次删除数据后,查找性能下降的问题.

3)支持结构化数据存储
可以对数据的某个键做操作,支持以下操作:
1.为数组加多一个key
2. unset数组的一个key
3. set/replace数组的一个key
4. append/prepend数组的一个key(该key的值要求是一个字符串)
5. increment/decrement数组的一个key(该key的值要求是一个数字)
6. 可以对数组进行pop/push/shift/unshift操作
7. 可以对数组进行count操作
8. 可以对数组进行分页获取操作

四.已知缺陷
1.尚不支持memcached的cas操作(原子操作).
2.不支持一致性哈希,这是由于我们将@path放到key,影响的一致性哈希的结果.
3.暂不支持数据压缩传送
4.不支持UDP协议
5.在ubuntu下对quit指令处理有误

五.下个版本期望改进点
1.实现内存复用机制,优化内存分配(slab),减少内存占用率
2.提供一个自己的client,支持所有指令,支持一致性哈希
3.支持数据压缩存储
4.支持json格式
5.数据持久化


About

Automatically exported from code.google.com/p/irid

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published