Redis 简解

来源:互联网 发布:高新区行知小学好不好 编辑:程序博客网 时间:2024/06/06 08:27

redis是key-value内存数据库

数据类型

string(字符串)、list(双向链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型);

存储原理

在Redis中,并不是所有的数据都一直存储在内存中的,当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。同时由于Redis将内存中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个操作,直到子线程完成swap操作后才可以进行修改。当从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。 这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。

2、Redis使用单线程的IO复用模型,将速度优势发挥到最大,而Memcached可以使用多核,所以在比较上,Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis;

3、Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached应用场景和数据特性有关。

4、对数据持久化和数据主从同步,更适合作为存储;

5、Redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据

6、数据的一致性方面:Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断

7、Redis可以实现主从复制,实现故障恢复;

8、redis使用了两种文件格式:全量数据和增量请求。
全量数据格式:把内存中的数据写入磁盘,便于下次读取文件进行加载;
增量请求文件:把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。

9、redis的存储分为内存存储、磁盘存储和log文件三部分

10、Redis支持数据的备份,即master-slave模式的数据备份。
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方

11、Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储。