本期任务的目的是让你们了解POSIX (Unix) 的网络API。网络是一个庞大的分布式系统,它使得不同计算机之间可以相互通信,是个十分神奇 (玄学) 的东西。
实现一个内存数据库(即是把数据文件保存在内存中的数据库,Redis就是一个内存数据库)。
实现语言最好是C、C++、Go等,不建议使用python这样的脚本语言。
程序要能够在Unix(Linux)环境下运行。
要求参照Redis的接口,实现对string类型的SET,DEL,EXIST,GET操作
请以Client/Server模型实现,即是要有一个客户端和服务器端。服务器端应该是稳定可靠,可长期运行的,要求能够同时接受多个客户端的连接。客户端通过网络与服务器端建立通信,接受用户的输入并向服务器发送请求以完成相关操作。客户端可以不实现,但是要实现与服务器连接的接口(像hiredis一样)。
实现MULTI,EXEC以支持原子操作。参考资料建议自行Google,这里放出一个Wikipedia。
实现分布式数据库。即是由多个服务器端一起共同组成一个分布式系统,来提供数据库服务。分布式数据库应该有一定的容错性,也就是要处理宕机、数据冲突之类的情况。还可以实现负载均衡之类的功能。接口参照hiredis-vip。
支持更多数据结构和其相关操作。HASH,LIST,SET,ORDERED SET等。
如果实现了客户端,可以想办法提高系统的安全性,譬如说防止SQL注入。
实现多客户端、分布式系统的时候,注意保证操作的正确性,注意race condition等等。
使用日志、快照等实现数据的持久化,也就是把内存里的数据存到硬盘中。要注意持久化不应该大幅度的影响数据库的读写速度,也就是持久化开启前后数据库IO性能应该基本不变。
服务器编译方法:make 客户端编译方法: cd hiredis gcc -lhiredis test.cpp -o test
服务器运行方法:./server 客户端运行方法:./test
12.3 初始版本未完成...客户端可以发送到服务器...但是服务器不能发送到客户端...debuging
1.24 太懒了 实现功能: SET xxx xxx(字符串长度都不超过9 GET xxx EXIST xxx(只支持一个串的查询 DEL xxx(只支持一个串的删除 不想写其他的了...咕咕咕
依旧存在的bug: 服务器运行后,客户端第一次可以连接,但是第二次就select不到了,至今未找到bug
1.25 基本debug结束,但是手段非常...奇怪? 没有找到bug的根源,暴力修改了,十分丑陋(
1.28 发现了某小错误,关于字符串的正确使用姿势++ sizeof("$")==2 不听课的后果23333 网络一点都不好玩