che-max-memory可以应对临时峰值写入。但是diskstore写入瓶颈最终还是在IO。
3) rdb 和新 diskstore 格式关系
rdb是传统Redis内存方式的存储格式,diskstore是另外一种格式,那两者关系如何?
·通过BGSAVE可以随时将diskstore格式另存为rdb格式,而且rdb格式还用于Redis复制以及不同存储方式之间的中间格式;
· 通过工具可以将rdb格式转换成diskstore格式;
当然,diskstore原 理很美好,但是目前还处于alpha版本,也只是一个简单demo,diskstore.c加上注释只有300行,实现的方法就是将每个value 作为一 个独立文件保存,文件名是key的hash值。因此diskstore需要将来有一个更高效稳定的实现才能用于生产环境。但由于有清晰的接口设 计, diskstore.c也很容易换成一种B-Tree的实现。很多开发者也在积极探讨使用bdb或者innodb来替换默认diskstore.c的 可行性。
下面介绍一下Diskstore的算法。
其实DiskStore类 似于Hash算法,首先通过SHA1算法把Key转化成一个40个字符的Hash值,然后把Hash值的前两位作为一级目录,然后把Hash 值的三四位作 为二级目录,最后把Hash值作为文件名,类似于“/0b/ee/0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33” 形式。算法如下:
dsKeyToPath(key):
char path[1024];
char *hashKey = sha1(key);
path[0] = hashKey[0];
path[1] = hashKey[1];
path[2] = '/';
path[3] = hashKey[2];
path[4] = hashKey[3];
path[5] = '/';
memcpy(path + 6, hashKey, 40);
return path;
存储算法(如key == apple):
dsSet(key, value, expireTime):
// d0be2dc421be4fcd0172e5afceea3970e2f3d940
char *hashKey = sha1(key);
// d0/be/d0be2dc421be4fcd0172e5afceea3970e2f3d940
char *path = dsKeyToPath(hashKey);
FILE *fp = fopen(path, "w");
rdbSaveKeyValuePair(fp, key, value, expireTime);
fclose(fp)
获取算法:
dsGet(key):
char *hashKey = sha1(key);
char *path = dsKeyToPath(hashKey);
FILE *fp = fopen(path, "r");
robj *val = rdbLoadObject(fp);
return val;
3》Redis安装:
1>软件安装:
# cd /data/soft/
# tar xf redis-2.4.15.tar.gz -C tmp/
# cd tmp/redis-2.4.15/
#make PREFIX=/usr/local/services/redis-2.4.15 >/dev/null
#make PREFIX=/usr/local/services/redis-2.4.15 install >/dev/null
#ln -s /usr/local/services/redis-2.4.15/bin/ /usr/local/services/redis/
会在当前目录下生成可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下:
· redis-server:Redis服务器的daemon启动程序
· redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
· redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
· redis-stat:Redis状态检测工具,可以检测