最近一些人在介绍方案时,常常会出现redis这个词,因而不少小伙伴百度完redis也就以为它是一个缓存,而后项目里面把数据丢进去完事,甚至有例如将实体属性拆分塞进redis hash里面的奇怪用法等等!缘由是什么呢?你们以为redis火,使用了redis项目就是高大上的,因而无论三七二十一,项目里用上强塞一个用上!这里本人想说的是你知道redis为何这么火么,应该怎么用么?下面带着本人拙建,简单分析一下:mysql
redis是一个基于内存hash结构的缓存型db,同mysql等传统数据库对比性能时,读操做在1k左右数据的时候相差基本上在10-100倍的差异,写入的性能差异就更大了,下面是一些测试数据redis
经过对redis的set、get命令测试观察,redis的读写性能在单线程下能够达到每秒2W左右;经过对mysql的select和insert、delete语句测试,mysql的读性能可达到5000每秒左右,写性能可到达3000每秒,读性能基本是写性能的2倍。而上述测试是基于redis单实例、单链接的状况,若是根据cpu核数来增长redis实例,而且使用pie和多链接,这个数据还能轻松的再上一个数量级~也可参见一下网上其余人发布的一些redis性能测试,例如:https://www.sohu.com/a/29865580_219700。sql
上面分析了redis的性能很是高,基本上同机器配置下彻底吊打传统sql,甚至nosql的mongodb等。即便这样redis也只是一个分布式缓存,或者说是分布式缓存数据库,那么redis确定不能像传统数据同样,动不动放个几T的数据,通常都是用来放热数据或者体量小的数据,其余的数据仍是使用队列经过后台服务放到sql db里面;另外根据redis的特性,建议服务器cpu核心数要留个1/4,每一个实例的内存最得多出1/2;假如24核的120G的服务器,建议部署18个reids实例,每一个实例5G的内存,实际使用不要超过3G的数据量~reids是缓存就继承了缓存的优缺点,性能高是优势,缺点:缓存穿透、缓存雪崩。mongodb
1.缓存穿透:缓存穿透是指查询一个必定不存在的数据,因为缓存是不命中时被动写的,而且出于容错考虑,若是从存储层查不到数据则不写入缓存,这将致使这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂了。数据库
解决办法就是将从db过来的返回值进行缓存,根据实际状况从新加热,若db返回是空则缓存几分钟就能够了。后端
2.缓存雪崩:在咱们设置缓存时采用了相同的过时时间或者缓存服务器因某些缘由没法使用时,致使缓存在某一时刻同时失效,请求所有转发到DB,DB瞬时压力太重雪崩。缓存
解决办法过时时间上增长一个范围的随机值,使用Redis Sentinel 和 Redis Cluster 实现高可用,另增设一个寿命更短的本机缓存来解决redis分布缓存抢修时的问题。服务器
在发生不管是缓存穿透仍是缓存雪崩,都建议使用队列来排队、拒绝大量请求涌入和分布式互斥锁来避免后端数据服务被冲击,防止已有的数据出现问题。nosql
redis很强大,不管是哨兵式集群仍是自带的redis cluster方式集群,可是必定要对redis了解清楚才能更好的使用~分布式