技术开发 频道

闲聊Redis:Redis 是一个有趣的项目

  【IT168 评论】Redis 是一个有趣的项目,与其把它说成键值存储、键值缓存还不如把它说成是一个远程的数据结构。

  Redis的项目名是Remote Dictionary Server的缩写,我觉得还不如叫Remote Data Structure Server – Redss。很多人把它和memcached比较,把它和tt比较,我觉得Redis在提供了诸多功能的同时又保证了代码的简洁和实现的简洁,这个很好。

  Redis中的很多功能是memcached/tt没有的,当然对于mongodb来说可能可以实现Redis的大多数功能但是又显得过于重量级了。

  所谓程序就是数据结构加上算法,没错,但如果对于大多数应用级别的程序来说,就变成了逻辑加上关系型数据库(MSSQL/MYSQL)了。

  关系型数据库是普适的,因此也就非常重,其实有的时候我们并不需要这么完备的数据库,那么有人会想到在内存中维护一个自己的数据结构,直接在内存中进行快速操作。

  而Redis正是这么一种提供了多种value数据结构(现在有字符串/列表/集合/有序集合/哈希,或许将来还会有更多的数据结构)的远程键值存储。

  集合和列表的好处不仅仅是可以在服务端进行直接操作,另一个好处也是节约了key占据的空间。

  PS:Redis支持key的expire,但是不能为list/set中的一个item设置过期,如果需要的话貌似只能平板化成一级key,这样就丧失了很多特性,这点比较郁闷。

  别小看这些丰富的数据结构,如果memcached只能用来做缓存的话,Redis就可以深深地和业务逻辑结合在一起,以高效的方式实现缓存或存储。

  比如对于普通的键值存储,我们如果需要为值增加一项需要取出修改保存三个过程,但是现在只需要提交一次追加在头部/添加在尾部操作。

  除此之外,Redis还提供其它一些很有用的特性:

  1) 事务:允许让一组命令进入队列一次性执行,在执行的过程中不穿插其它命令(Redis的单线程保证)。但是要注意的是,并不能保证队列中操作的key没有变化(并发环境),可以使用WATCH来监视并在并发时回滚(乐观并发)。当然,Redis中也提供了很多组合型的原子命令(比如检查并添加,删除后添加,这些组合特别有用)。

  2) 管道:一次性提交多个命令(如果只是进行一些设置,命令之间不需要依赖前置命令结果的话,可以提高不少效率)。当然,Redis还提供了很多Multi-的命令,允许一次性进行多个值的添加,获取等等。

  3) 持久:有快照和日志两种方式。对于(后台)快照就是在保存的时候开启子进程(当然也可以前台方式)将整个(32G内存的dump过程想想真恐怖?)内存快照写入临时文件(在此过程中的修改操作为父进程的内存页创建副本,那么最坏的情况可能要多用一倍内存),之后再替换原来的dump文件。所谓日志就是每一次写操作生成日志(日志的持久化也有每秒/每次和依赖于OS三种方式),适用于不太适合丢失的数据的保存,当然效率也会差。

  4) 复制:支持多层次的主从订阅。那么我们就有很多配置方式了,可以让主作为写,从作为运算,可以让主作为内存数据库,从作为持久化的备份。在建立订阅关系之后,主会把内存映像在后台保存下来然后发动给各个从,并且保存后续的写操作命令,从收到文件后恢复文件中的快照再接受主保存的后续操作命令。

  5) VM:操作系统的页过大,Redis默认使用32字节的页。把所有的键保存在内存中,把所有的值压缩(很厉害,保存10G的数据才占用2G不到的存储,我都怀疑我看错了)保存在swap中。也可以配置选择使用同步或异步方式进行换入换出。

0
相关文章