redis就是一个底层由C语言编写的非关系型数据库,它主要是用来做缓存,因为他把数据主要以键值对的形式存放在内存上,所以读取非常快。一般应用于消息队列(支付、排行榜等)、会话缓存、消息通知等场景
它有五种数据类型:字符串String、哈希Hash、列表List、集合Set、有序集合Zset,常用的主要是前四种。
redis是一个用C语言编写的非关系型(Nosql)的数据库,可以存储键和五种不同类型的值之间的映射,键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
-
与传统数据库不同的时redis的数据是存在内存中的,所以读写也非常快,因此redis被广泛应用于缓存方向。redis也常用作分布式锁。除此,redis支持事务、持久化、LUA脚本、LRU驱动时间、众多集群方案
Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。
优势
1.他是存在内存里的,读取速度快
2.我所用到不需要连表查询,所以那些关系表数据库的优势用不到
3.redis可以建立在多个服务器里,进行同步
五大数据类型
String(字符串 用法: 键 值),Hash(哈希 类似Java中的 map 用法: 键 键值对),List(列表 用法:键 集合 不可以重复),Set(集合 用法:键 集合 可以重复),Zset(sorted set 有序集合 用法: 键 值 值)
字符串String、
string 是 redis 最基本的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
哈希Hash、
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
列表List、
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
集合Set、
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
有序集合Zset
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
缓存穿透、缓存击穿、缓存雪崩
缓存穿透
缓存穿透
解释:访问一个缓存和数据库都不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB可能会挂掉。
解决:1).访问key未在DB查询到值,将空值写进缓存,但可以设置较短的过期时间。2).可能是非法攻击,通过接口先做校验,不通过则直接返回。3).使用布隆过滤器存储所有可能访问的 key,不存在的key直接被过滤,存在的key则再进一步查询缓存和数据库。
缓存雪崩
缓存雪崩
解释:缓存在同一时刻大量失效,造成DB瞬时请求量大、压力骤增,引起雪崩。
解决:1).给过期时间时加个随机值时间,使过期时间分布开来,不会集中。2).加锁互斥。3).热点数据不过期。
缓存击穿
缓存击穿
解释:一个热点key,在缓存过期后,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。
解决:1).加锁互斥。2).热点数据不过期。
持久化两种
持久化机制能够保证 Redis 储存的数据不会因故障(停电)而丢失
AOF
通过保存Redis服务器所执行的写命令来记录数据库状态。
有什么策略?三种
第一,appendfsync always,每一个操作(每一次写入命令)都会持久化到硬盘里,速度比较慢,性能比较差,效率低。但是最大的好处是不丢数据。 因为每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
第二,appendfsync everysecond,每秒钟同步一次,显示地将多个写命令同步到硬盘 坏处:可能丢失一秒的数据,好处:每一秒同步一次将多个命令写入硬盘
第三,appendfsync no:让操作系统决定何时进行同步,让操作系统决定何时将缓存持久化
AOF的优点
数据的一致性和完整性更高
AOF的缺点
AOF记录的内容越多,文件越大,数据恢复变慢
RDB
RDB是通过保存数据库中的键值对来记录数据库的状态
RBD,就是把内存数据以快照形式保存到磁盘上。
默认的三种配置:
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照
可以根据自己需求去改
两种触发策略:一种是手动触发,另一种是自动触发。
手动触发:
RBD的优点
适合大规模的数据恢复场景
RBD的缺点
没办法做到实时持久化/秒级持久化
新老版本存在RDB格式兼容问题
rbd 优点:访问性能最佳 缺点:数据不安全、fork消耗极大
aof 优点:数据相对安全 缺点:访问性能相对不在最佳