redis能解决什么问题
1 从零开始 最初的需求非常简单,我们有一个提供热点新闻列表的api:/hot-news,api的消费者抱怨说每次请求都要2秒左右才能返回结果。
随后我们就着手于如何提升一下api消费者感知的性能,很快最简单粗暴的第一个方案就出来了:为API的响应加上基于HTTP的缓存控制 cache-control:max-age=600 ,即让消费者可以缓存这个响应十分钟。
如果api消费者如果有效的利用了响应中的缓存控制信息,则可以有效的改善其感知的性能(10分钟以内)。
但是还有2个弊端:第一个是在缓存生效的10分钟内,api消费者可能会得到旧的数据;第二个是如果api的客户端无视缓存直接访问API依然是需要2秒,治标不治本呐。
2 基于本机内存的缓存 为了解决调用API依然需要2秒的问题,经过排查,其主要原因在于使用SQL获取热点新闻的过程中消耗了将近2秒的时间,于是乎,我们又想到了一个简单粗暴的解决方案,即把SQL查询的结果直接缓存在当前api服务器的内存中(设置缓存有效时间为1分钟)。
后续1分钟内的请求直接读缓存,不再花费2秒去执行SQL了。
假如这个api每秒接收到的请求时100个,那么一分钟就是6000个,也就是只有前2秒拥挤过来的请求会耗时2秒,后续的58秒中的所有请求都可以做到即使响应,而无需再等2秒的时间。
其他API的小伙伴发现这是个好办法,于是很快我们就发现API服务器的内存要爆满了。
。
。
3 服务端的Redis 在API服务器的内存都被缓存塞满的时候,我们发现不得不另想解决方案了。
最直接的想法就是我们把这些缓存都丢到一个专门的服务器上吧,把它的内存配置的大大的。
然后我们就盯上了redis。
。
。
至于如何配置部署redis这里不解释了,redis官方有详细的介绍。
随后我们就用上了一台单独的服务器作为Redis的服务器,API服务器的内存压力得以解决。
3.1 持久化(Persistence) 单台的Redis服务器一个月总有那么几天心情不好,心情不好就罢工了,导致所有的缓存都丢失了(redis的数据是存储在内存的嘛)。
虽然可以把Redis服务器重新上线,但是由于内存的数据丢失,造成了缓存雪崩,API服务器和数据库的压力还是一下子就上来了。
所以这个时候Redis的持久化功能就派上用场了,可以缓解一下缓存雪崩带来的影响。
redis的持久化指的是redis会把内存的中的数据写入到硬盘中,在redis重新启动的时候加载这些数据,从而最大限度的降低缓存丢失带来的影响。
3.2 哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事。
那么怎办办?答曰:备份一台,你挂了它上。
那么如何得知某一台redis服务器挂了,如何切换,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要Sentinel和Replication出场了。
Sentinel可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能;Replication则是负责让一个Redis服务器可以配备多个备份的服务器。
Redis也是利用这两个功能来保证Redis的高可用的。
此外,Sentinel功能则是对Redis的发布和订阅功能的一个利用。
3.3 集群(Cluster) 单台服务器资源的总是有上限的,CPU资源和IO资源我们可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上。
但是内存资源怎么办,主从模式做到的只是相同数据的备份,并不能横向扩充内存;单台机器的内存也只能进行加大处理,但是总有上限的。
所以我们就需要一种解决方案,可以让我们横向扩展。
最终的目的既是把每台服务器只负责其中的一部分,让这些所有的服务器构成一个整体,对外界的消费者而言,这一组分布式的服务器就像是一个集中式的服务器一样(之前在解读REST的博客中解释过分布式于基于网络的差异:基于网络应用的架构)。
在Redis官方的分布式方案出来之前,有twemproxy和codis两种方案,这两个方案总体上来说都是依赖proxy来进行分布式的,也就是说redis本身并不关心分布式的事情,而是交由twemproxy和codis来负责。
而redis官方给出的cluster方案则是把分布式的这部分事情做到了每一个redis服务器中,使其不再需要其他的组件就可以独立的完成分布式的要求。
我们这里不关心这些方案的优略,我们关注一下这里的分布式到底是要处理那些事情?也就是twemproxy和codis独立处理的处理分布式的这部分逻辑和cluster集成到redis服务的这部分逻辑到底在解决什么问题?如我们前面所说的,一个分布式的服务在外界看来就像是一个集中式的服务一样。
那么要做到这一点就面临着有一个问题需要解决:既是增加或减少分布式服务中的服务器的数量,对消费这个服务的客户端而言应该是无感的;那么也就意味着客户端不能穿透分布式服务,把自己绑死到某一个台的服务器上去,因为一旦如此,你就再也无法新增服务器,也无法进行故障替换。
解决这个问题有两个路子:第一个路子最直接,那就是我加一个中间层来隔离这种具体的依赖,即twemproxy采用的方式,让所有的客户端只能通过它来消费redsi服务,通过它来隔离这种依赖(但是你会发现twermproxy会成为一个单点),这种情况下每台redis服务器都是独立的,它们之间彼此不知对方的存在;第二个路...
redis主要解决什么问题
展开全部 redis是内存数据库,访问速度非常快,所以能够解决的也都是这些缓存类型的问题,如下:1、会话缓存(Session Cache)最常用的一种使用Redis的情景是会话缓存(session cache)。
用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。
当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。
甚至广为人知的商业平台Magento也提供Redis的插件。
2、全页缓存(FPC)除基本的会话token之外,Redis还提供很简便的FPC平台。
回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。
再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。
此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
3、队列Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。
Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。
例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。
排行榜/计数器Redis在内存中对数字进行递增或递减的操作实现的非常好。
集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。
所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:当然,这是假定你是根据你用户的分数做递增的排序。
如果你想返回用户及用户的分数,你需要这样执行:ZRANGE user_scores 0 10 WITHSCORESAgora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。
5、发布/订阅最后(但肯定不是最不重要的)是Redis的发布/订阅功能。
发布/订阅的使用场景确实非常多。
我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。
Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。
等等?
php面试题 memcache和redis的区别
展开全部 Redis与Memcached的区别传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
2.Memcached与MySQL数据库数据一致性问题。
3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。
4.跨机房cache同步问题。
众多NoSQL百花齐放,如何选择 最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解决以下几种问题 1.少量数据存储,高速读写访问。
此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。
2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。
3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。
前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。
4.Schema free,auto-sharding等。
比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。
面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。
Redis适用场景,如何正确的使用 前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
2 Redis支持数据的备份,即master-slave模式的数据备份。
3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。
在Redis中,并不是所有的数据都一直存储在内存中的。
这是和Memcached相比一个最大的区别。
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特有内存模型前后的情况对比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used当从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。
这里就存在一个I/O线程池的问题。
在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。
这种策略在客户端的数量较小,进行批量操作的时候比较合适。
但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。
所以Redis运行我们设置I/O线程 池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。
如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。
补充的知识点:memcached和redis的比较1 网络IO模型 Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命...
PHP自学要多久?
光学PHP肯定不够,最基本的也要学HTML,PHP包含的东西也很多,如果简单点,一个小留言板大概学了2个月就差不多了,但是PHP当中还有很多别的比如面向对象、GD库、cookie、session……。
想要做个真正像样的网站,CSS、JS、SQL也是必不可少(ajax无非就是js+css做前台,php、asp或jsp做后台)。
如果这些都要学会,至少要一年时间。
学PHP如果只是想学到可以看懂并修改像PHPWind、Discuz、WordPress等流行的应用代码的话,大概学3、4个月就差不多。
以上的时间都是建立在学习者对PHP抱有极大热情的人才成立,如果只是为了工作而不是兴趣,这些时间至少翻1倍。
群辉安装docker windows下有哪些软件
将Docker安装到CentOS或Fedora上要将Docker安装到CentOS上,首先启用EPEL软件库,然后使用yum命令:$ sudo yum install docker-io $ sudo service docker start $ sudo chkconfig docker on 要将Docker安装到Fedora上,使用下面这些命令:$ sudo yum install docker-io $ sudo systemctl start docker.service $ sudo systemctl enable docker.service 将Docker安装到CentOS或Fedora上后,你需要将自己添加到docker群组,那样才能以非root用户的身份来运行Docker。
为此,使用这个命令:$ sudo usermod -a -G docker $USER 退出,重新登录,以激活群组变更。
至此,你应该能够以非特权用户的身份来运行docker命令了。
Docker的基本用法你想启动一个新的Docker容器,就需要确定为容器使用哪个Docker映像。
你可以搜索官方的Docker映像索引(),上面列出了公开可用的Docker映像。
Docker索引包括:Docker团队管理的Linux基本映像(比如Ubuntu、Debian、Fedora和 CentOS),以及用户贡献的自定义映像(比如MySQL、Redis和WordPress)。
比如说,想在交互模式开启动一个Ubuntu容器,就要运行下面这个命令。
容器一启动,最后的变量“/bin/bash”就在容器里面执行。
$ docker run -i -t ubuntu /bin/bash 你头一次运行上面这个命令时,它会通过网络下载可用的一个或多个Ubuntu docker映像,然后使用该映像,启动Docker容器。
Ubuntu容器会立马启动,你会看到容器里面的控制台提示符。
你可以访问容器沙箱里面的功能完备的Ubuntu操作系统。
如果你在提示符处键入“exit”,就会退出容器,容器会被停止。
想列出所有的容器(包括已停止的容器),运行这个命令:$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a08a0b2bb4c ubuntu:14.04 /bin/bash About a minute ago Exit 0 cocky_ritchie 想在守护进程模式下重新启动某个已停止的容器:$ docker start [container-id] 想移除某个已停止的容器:$ docker rm [container-id] 想连接到后台运行的容器,以便查看容器或与之交互:$ docker attach [container-id] 你可以随意定制某个运行中的容器(比如安装新软件)。
如果你想把变更内容保存在当前容器中,先要在提示符处键入“exit”,退出容器的交互模式。
然后使用这个命令,将已变更的映像保存为不同的映像:$ docker commit [container-id] [new-image-name] 想获得你容器的容器ID,可以使用之前描述的“docker ps –a”命令。
一旦你已构建了像这样的新映像,就可以借助该映像启动一个新的容器了。
你还可以下载任何公开的容器映像(比如ubuntu,bowery/mysql),将它们保存到本地软件库中,如下所示。
$ docker pull [image name] 想查看所有本地下载/保存的容器映像:$ docker images 你可以选择从哪个特定的映像来启动容器:$ docker run -i -t [image-id] /bin/bash 想从本地软件库移除某个容器映像:$ docker rmi [image-id]将Docker安装到CentOS或Fedora上要将Docker安装到CentOS上,首先启用EPEL软件库,然后使用yum命令:$ sudo yum install docker-io $ sudo service docker start $ sudo chkconfig docker on 要将Docker安装到Fedora上,使用下面这些命令:$ sudo yum install docker-io $ sudo systemctl start docker.service $ sudo systemctl enable docker.service 将Docker安装到CentOS或Fedora上后,你需要将自己添加到docker群组,那样才能以非root用户的身份来运行Docker。
为此,使用这个命令:$ sudo usermod -a -G docker $USER 退出,重新登录,以激活群组变更。
至此,你应该能够以非特权用户的身份来运行docker命令了。
Docker的基本用法你想启动一个新的Docker容器,就需要确定为容器使用哪个Docker映像。
你可以搜索官方的Docker映像索引(),上面列出了公开可用的Docker映像。
Docker索引包括:Docker团队管理的Linux基本映像(比如Ubuntu、Debian、Fedora和 CentOS),以及用户贡献的自定义映像(比如MySQL、Redis和WordPress)。
比如说,想在交互模式开启动一个Ubuntu容器,就要运行下面这个命令。
容器一启动,最后的变量“/bin/bash”就在容器里面执行。
$ docker run -i -t ubuntu /bin/bash 你头一次运行上面这个命令时,它会通过网络下载可用的一个或多个Ubuntu docker映像,然后使用该映像,启动Docker容器。
Ubuntu容器会立马启动,你会看到容器里面的控制台提示符。
你可以访问容器沙箱里面的功能完备的Ubuntu操作系统。
如果你在提示符处键入“exit”,就会退出容器,容器会被停止。
想列出所有的容器(包括已停止的容器),运行这个命令:$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a08a0b2bb4c ubuntu:14.04 /bin/bash About a minute ago Exit 0 cocky_ritchie 想在守护进程模式下重新启动某个已停止的容器:$ docker start [container-id] 想移除某个已停止的容器:$ docker rm [container-id] 想连接到后台运行的容器,以便查看容器或与之交互:$ docker attach [container-id] 你可以随意定制某个运行中的容器(比如安装新...
C#怎么使用redis实现秒杀功能
大概思路吧:秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题。
对这类问题,有三种优化性能的思路: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理 用上这三招,不论秒杀时负载多大,都能轻松应对。
更好的是,Redis能够满足上述三点。
因此,用Redis就能轻松实现秒杀系统。
用我这个方案,无论是电商平台特价秒杀,12306火车票秒杀,都不是事:) 下面介绍一下为什么上述三种性能优化思路能够解决秒杀系统的性能问题:写入内存而不是写入硬盘 传统硬盘的读写性能是相当差的。
SSD硬盘比传统硬盘快100倍。
而内存又比SSD硬盘快10倍以上。
因此,写入内存而不是写入硬盘,就能使系统的能力提升上千倍。
也就是说,原来你的秒杀系统可能需要1000台服务器支撑,现在1台服务器就可以扛住了。
你可能会有这样的疑问:写入内存而不是持久化,那么如果此时计算机宕机了,那么写入的数据不就全部丢失了吗?如果你就这么倒霉碰到服务器宕机,那你就没秒到了,有什么大不了? 最后,后面真正处理秒杀订单时,我们会把信息持久化到硬盘中。
因此不会丢失关键数据。
Redis是一个缓存系统,数据写入内存后就返回给客户端了,能够支持这个特性。
异步处理而不是同步处理 像秒杀这样短时大并发的系统,在性能负载上有一个明显的波峰和长期的波谷。
为了应对相当短时间的大并发而准备大量服务器来应对,在经济上是相当不合算的。
因此,对付秒杀类需求,就应该化同步为异步。
用户请求写入内存后立刻返回。
后台启动多个线程从内存池中异步读取数据,进行处理。
如用户请求可能是1秒钟内进入的,系统实际处理完成可能花30分钟。
那么一台服务器在异步情况下其处理能力大于同步情况下1800多倍! 异步处理,通常用MQ(消息队列)来实现。
Redis可以看作是一个高性能的MQ。
因为它的数据读写都发生在内存中。
分布式处理 好吧。
也许你的客户很多,秒杀系统即使用了上面两招,还是捉襟见肘。
没关系,我们还有大招:分布式处理。
如果一台服务器撑不住秒杀系统,那么就多用几台服务器。
10台不行,就上100台。
分布式处理,就是把海量用户的请求分散到多个服务器上。
一般使用hash实现均匀分布。
这类系统在大数据云计算时代的今天已经有很多了。
无非是用Paxos算法和Hash Ring实现的。
Redis Cluster正是这样一个分布式的产品。
使用Redis实现描述系统 Redis和Redis Cluster(分布式版本),是一个分布式缓存系统。
其支持多种数据结构,也支持MQ。
Redis在性能上做了大量优化。
因此使用Redis或者Redis Cluster就可以轻松实现一个强大的秒杀系统。
基本上,你用Redis的这些命令就可以了。
RPUSH key value 插入秒杀请求 当插入的秒杀请求数达到上限时,停止所有后续插入。
后台启动多个工作线程,使用 LPOP key 读取秒杀成功者的用户id,进行后续处理。
或者使用LRANGE key start end命令读取秒杀成功者的用户id,进行后续处理。
每完成一条秒杀记录的处理,就执行INCR key_num。
一旦所有库存处理完毕,就结束该商品的本次秒杀,关闭工作线程,也不再接收秒杀请求。
要是还撑不住,该怎么办 也许你会说,我们的客户很多。
即使部署了Redis Cluster,仍然撑不住。
那该怎么办呢? 记得某个伟人曾经说过:办法总比困难多!下面,我们具体分析下,还有哪些情况会压垮我们架构在Redis(Cluster)上的秒杀系统。
脚本攻击 如现在有很多抢火车票的软件。
它们会自动发起http请求。
一个客户端一秒会发起很多次请求。
如果有很多用户使用了这样的软件,就可能会直接把我们的交换机给压垮了。
这个问题其实属于网络问题的范畴,和我们的秒杀系统不在一个层面上。
因此不应该由我们来解决。
很多交换机都有防止一个源IP发起过多请求的功能。
开源软件也有不少能实现这点。
如linux上的TC可以控制。
流行的Web服务器Nginx(它也可以看做是一个七层软交换机)也可以通过配置做到这一点。
一个IP,一秒钟我就允许你访问我2次,其他软件包直接给你丢了,你还能压垮我吗?交换机撑不住了 可能你们的客户并发访问量实在太大了,交换机都撑不住了。
这也有办法。
我们可以用多个交换机为我们的秒杀系统服务。
原理就是DNS可以对一个域名返回多个IP,并且对不同的源IP,同一个域名返回不同的IP。
如网通用户访问,就返回一个网通机房的IP;电信用户访问,就返回一个电信机房的IP。
也就是用CDN了! 我们可以部署多台交换机为不同的用户服务。
用户通过这些交换机访问后面数据中心的Redis Cluster进行秒杀作业。
总结 有了Redis Cluster的帮助,做个支持海量用户的秒杀系统其实So Easy! 这里介绍的方案虽然是针对秒杀系统的,但其背后的原理对其他高并发系统一样有效。
最后,我们再重温一下高性能系统的优化原则: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理
用了mongodb 还需要使用redis吗
MongoDB不多说,不是一个类型的东西,Redis相对Memcached来说功能和特性上的优势已经很明显了。
而对于性能,Redis作者的说法是平均到单个核上的性能,在单条数据不大的情况下Redis更好。
为什么这么说呢,理由就是Redis是单线程运行的。
因为是单线程运行,所以和Memcached的多线程相比,整体性能肯定会偏低。
因为是单线程运行,所以IO是串行化的,网络IO和内存IO,因此当单条数据太大时,由于需要等待一个命令的所有IO完成才能进行后续的命令,所以性能会受影响。
为什么要使用Redis
①Redis定义:Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。
Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
② Redis特点Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。
以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。
Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。
因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化。
Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。
③Redis应用场景,它能做什么众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。
拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。
要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。
上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。
总之,Redis的应用是非常广泛的,而且极有价值,真是服务器中的一件利器,所以从现在开始,我们就来一步步学好它。
转载请注明出处51数据库 » wordpress使用redis