目录redis
redis全称:Remote Dictionary Server。算法
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库通通加载在内存当中进行操做,按期经过异步操做把数据库数据flush到硬盘上进行保存。数据库
由于是纯内存操做,Redis的性能很是出色,每秒能够处理超过10万次读写操做,是已知性能最快的Key-Value数据库。读的速度是110000次/s,写的速度是81000次/s缓存
Redis的出色之处不只仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是512MB,不像memcached只能保存1MB的数据.安全
所以Redis能够用来实现不少有用的功能,比方说用他的List来作FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set能够作高性能的tag系统等等。另外Redis也能够对存入的Key-Value设置expire时间,所以也能够被看成一 个功能增强版的memcached来用。服务器
Redis是线程安全的(由于只有一个线程),其全部操做都是原子的,不会因并发产生数据异常网络
Redis的速度很是快(由于使用非阻塞式IO,且大部分命令的算法时间复杂度都是O(1))数据结构
使用高耗时的Redis命令是很危险的,会占用惟一的一个线程的大量处理时间,致使全部的请求都被拖慢。(例如时间复杂度为O(N)的KEYS命令,严格禁止在生产环境中使用)多线程
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,由于是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就能够直接从缓存中获取了。操做缓存就是直接操做内存,因此速度至关快。若是数据库中的对应数据改变以后,同步改变缓存中相应的数据便可!架构
直接操做缓存可以承受的请求是远远大于直接访问数据库的,因此咱们能够考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用通过数据库。
缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特色是轻量以及快速,生命周期随着 jvm 的销毁而结束,而且在多实例的状况下,每一个实例都须要各自保存一份缓存,缓存不具备一致性。
使用 redis 或 memcached之类的称为分布式缓存,在多实例的状况下,各实例共用一份缓存数据,缓存具备一致性。缺点是须要保持redis或memcached服务的高可用,整个程序架构上较为复杂。
一、Redis是纯内存操做,须要的时候须要咱们手动持久化到硬盘中。
二、Redis是单线程,从而避开了多线程中上下文频繁切换的操做。(单线程也会有它的缺点,也是Redis的噩梦:阻塞。若是执行一个命令过长,那么会形成其余命令的阻塞,对于Redis是十分致命的)
三、Redis数据结构简单、对数据的操做也比较简单。
四、使用底层模型不一样,它们之间底层实现方式以及与客户端之间通讯的应用协议不同,Redis直接本身构建了VM机制,由于通常的系统调用系统函数的话,会浪费必定的时间去移动和请求.
五、使用非阻塞I/O多路复用模型
Redis是用”单线程-多路复用IO模型”来实现高性能的内存数据服务的,这种机制避免了使用锁,可是同时这种机制在进行sunion之类的比较耗时的命令时会使redis的并发降低。由于是单一线程,因此同一时刻只有一个操做在进行,因此,耗时的命令会致使并发的降低,不仅是读并发,写并发也会降低。而单一线程也只能用到一个CPU核心,因此能够在同一个多核的服务器中,能够启动多个实例,组成master-master或者master-slave的形式,耗时的读命令能够彻底在slave进行。
官方FAQ表示,由于Redis是基于内存的操做,CPU不是Redis的瓶颈,Redis的瓶颈最有多是机器内存的大小或者网络带宽。既然单线程容易实现,并且CPU不会成为瓶颈,那就瓜熟蒂落地采用单线程的方案了(毕竟采用多线程会有不少麻烦!)。
这里咱们一直在强调的单线程,只是在处理咱们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候确定是不止一个线程的,这里须要你们明确的注意一下!例如Redis进行持久化的时候会以子进程或者子线程的方式执行.
redis为了达到最快的读写速度,将数据都读到内存中,并经过异步的方式将数据写入磁盘。若是不将数据放在内存中,磁盘IO速度会严重影响redis的性能。