Redis介绍及多路复用IO模型

Redis介绍

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

Redis与Memcached
在Redis之前Memcached是一个非常流行的缓存数据库,而在redis出现之后,越来越多的人转向了Redis的怀抱,Redis的作者曾经对这两种基于内存的数据存储系统进行过比较:

  • Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。
  • 内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
  • 性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

就大部分的人而言都是因为Redis丰富的数据结构和数据操作而放弃Memcached的。

redis多路复用的IO模型

Redis介绍及多路复用IO模型_第1张图片
很多的机器会连redis,请求到达内核后会形成fd(文件描述符)。
redis是一个进程可以调用epoll来遍历fd观察数据到达的情况进行消费。
redis只有一个线程用于处理用户请求,其他的模块还是有另外的线程

单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性)。
即一个线程处理所有网络请求,其他模块仍用了多个线程。

单线程就表明redis在处理数据时是有“顺序性”的。但是这个顺序性只保证每个连接内的命令是顺序执行的。

比如连接中:先发出创建A的请求,再发出删除A的请求。redis就能保证先执行创建A,再执行删除A。但如果连接本身就是多线程的,自己内部逻辑处理的时候线程不安全,导致了先发出删除A的请求,在发出创建A的请求,那自然redis也只能按照这个顺序进行执行。
当client1和client2都发出了操作A的请求,就很难判断谁先执行谁后执行。
所以说这个顺序性只保证每个连接内的命令是顺序执行的。

你可能感兴趣的:(Redis,redis)