redis简述
redis是什么?
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
redis的优点:
1、本质上是一个 Key-Value 类型的内存数据库,很像memcached
2、整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存
3、因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的Key-Value DB
4、Redis最大的魅力是支持保存多种数据结构(string,list,set,hash,sortedset),此外单个 value 的最大限制是 1GB,不像memcached只能保存 1MB 的数据
5、Redis也可以对存入的 Key-Value 设置 expire 时间,因此也可以被当作一个功能加强版的memcached 来用
缺点:
1、Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis默认支持16个数据库,
可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用select命令更换数据库。
Redis支持多个数据库,并且每个数据库是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念
端口:6379
缓存穿透:
概述:指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。(redis查询不到数据库,出现很多非正常的url访问---黑客攻击)
现象:应用服务器压力变大, redis命中率降低 ,一直都是在查询数据库
解决方案:
1、查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短
2、布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询
3、设置可访问的白名单
4、进行实时的监控
缓存击穿:
概述:对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。(redis的某个key过期了,并大量访问这个key)
现象:数据库访问瞬时增加, redis里面没有出现大量key过期 , redis正常运行
解决方案:
1、使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法
2、永远不过期:不要对这个key设置过期时间
3、预先设置热门的数据
缓存雪崩:
概述:设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存。(大量的key同时过期)
现象:数据库的压力变大服务器崩溃 --雪崩效应对底层的系统冲击非常大
解决方案:
1.构建多级架构(nginx缓存+ redis缓存 + 其它的缓存)
2.使用锁或者队列(避免大量的线程堆数据库进行一次性读写)
3.设置过期标志,更新缓存
4.将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
本文来自博客园,作者:阿萨德菩提子,转载请注明原文链接:https://www.cnblogs.com/ychptz/p/16625855.html