Redis 总结
Posted 寂静花开
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 总结相关的知识,希望对你有一定的参考价值。
目 录
什么是Redis
Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
redis每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外redis也常用来做分布式锁。
Redis为什么快?
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
同时数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1); - 数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
- 采用单线程。
避免了不必要的上下文切换和竞争条件,不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; - 使用多路 I/O 复用模型,非阻塞 IO;
- 使用底层模型不同。
它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
Redis有哪些常用的数据类型?
Redis主要有5种数据类型,包括String,List,Set,Zset,Hash
String (字符串、整数或者浮点数): 做简单的键值对缓存
List 列表: 存储一些列表型的数据结构
set 无序集合: 交集、并集、差集的操作
hash 包含键值对的无序散列表: 结构化的数据,比如一个对象
zset 有序集合 : 去重但可以排序
Redis RDB和AOF持久化的区别,如何选择?
什么是Redis持久化?
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis 的持久化机制是什么?
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
-
RDB:Redis DataBase,把当前数据生成快照保存在硬盘上。
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义的周期。 -
AOF:Append Only File持久化,记录每次对数据的操作到硬盘上。
将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
RDB和AOF的优缺点
- AOF文件比RDB更新频率高,优先使用AOF还原数据。
- AOF比RDB更安全也更大
- RDB性能比AOF好
- 如果两个都配了优先加载AOF
如何选择
1、一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
2、如果可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。
3、只使用AOF持久化,但并不推荐。因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。
4、如果只希望数据在服务器运行的时候存在,可以不使用任何持久化方式。
如何解决缓存击穿、缓存穿透、雪崩问题?
缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案
- 设置热点数据永远不过期。
- 加互斥锁
缓存穿透
对某个一定不存在的数据进行请求,该请求将会穿透缓存到达数据库。
缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案
- 对这些不存在的数据缓存一个空数据;
- 对这类请求进行过滤。
缓存雪崩
指的是由于数据没有被加载到缓存中,或者缓存数据在同一时间大面积失效(过期),又或者缓存服务器宕机,导致大量的请求都到达数据库。
在有缓存的系统中,系统非常依赖于缓存,缓存分担了很大一部分的数据请求。当发生缓存雪崩时,数据库无法处理这么大的请求,导致数据库崩溃。
解决方案:
- 为了防止缓存在同一时间大面积过期导致的缓存雪崩,可以通过观察用户行为,合理设置缓存过期时间来实现
(缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。) - 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队
- 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。
- 为了防止缓存服务器宕机出现的缓存雪崩,可以使用分布式缓存,分布式缓存中每一个节点只缓存部分的数据,当某个节点宕机时可以保证其它节点的缓存仍然可用。
- 也可以进行缓存预热,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。
以上是关于Redis 总结的主要内容,如果未能解决你的问题,请参考以下文章