redis
Redis
概念:
redis是一个开源免费的,遵守BSD协议,是一个高性能的KV数据库
内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
非关型数据库
支持5种数据类型
string(字符串)
set:添加一条String数据
get:获取一条String数据
mset:添加多条String数据
mget:获取多条String数据
hash(哈希)
hset :添加一条hash类型数据
hget :获取一条hash类型数据
hmset :添加多条hash类型数据
hmget :获取多条hash类型数据
hgetAll :获取指定所有hash类型数据
hdel :删除指定hash类型数据(一条或多条)
list(列表)
lpush :左添加(头)list类型数据
rpush :右添加(尾)类型数据
lrange : 获取list类型数据start起始下标 end结束下标 包含关系
llen :获取条数
lrem :删除列表中几个指定list类型数据
set集合
sadd:添加set类型数据
smembers :获取set类型数据
scard :获取条数
srem :删除数据
sorted set(有序集合)
sorted set是通过分数值来进行排序的,分数值越大,越靠后。
zadd :添加sorted set类型数据
zadd需要将Float或者Double类型分数值参数,放置在值参数之前
zrange :获取sorted set类型数据
zcard :获取条数
zrem :删除数据
优点
容易理解
使用方便,通用的sql语言
易于维护,丰富的完整性
缺点
磁盘I/O是并发的瓶颈
海量数据查询效率低
横向扩展困难
多表的关联查询以及复杂的数据分析类型的复杂sql查询
使用redis好处
1.速度快,因为数据存在内存中,类似于hashmap
2.支持丰富数据类型
3.支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
4。丰富的特征:可用于缓存,消息,按key设置过期时间,过期后会自动删除
redis持久化机制
RDB(快照)
是指用数据集快照的方式半持久化模式)记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复
优点
1.只有一个文件dump.rdb,方便持久化
2.容灾性好,一个文件可以保存到安全的磁盘
3.性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化
缺点
数据安全性底
RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
AOP(日志)
是指所有的命令行记录以 redis 命令请求协议的格式完全持久化存储)保存为 aof 文件。
优点
数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。
通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof工具解决数据一致性问题。
AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点
1.AOP文件比RDB文件大,且恢复速度慢
2.数据集大的时候,比RDB启动效率底
怎么理解 Redis 事务?
(1)事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
(2)事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
Key的过期淘汰机制
1.定期删除
2.惰性删除
3.内存淘汰机制
内存快要满了的时候,对一下快要过期的数据提前进行删除
缓存击穿
有人拿抢扫射,但是被扫的人穿了防弹衣,但是防弹衣有一个洞,那个人就一直往洞里扫
缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。. 这种现象就叫做缓存击穿
高并发的情况下,某个热门key突然过期,导致大量请求在Redis未找到缓
存数据,进而全部去访问DB请求数据,引起DB压力瞬间增大
解决方案
1.redis中的数据不设置过期时间
可以把不存在的key也设置缓存,并设置过期时间
2.加一个互斥锁
缓存穿透
查询缓存和DB中都不存在的数据
我们使用Redis大部分情况都是通过Key查询对应的值,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。假如有大量这样的请求,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。
解决方案
1.互斥锁
2.异步更新
3.提供一个能迅速判断请求是否有效的拦截机制
缓存雪崩
当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死
解决方案
1.在原有的失效时间上加上一个随机值
这样就避免了艺文采用相同的过期时间导致雪崩
2.使用熔断机制
3.提高数据库的容灾能力,可以使用分库分表,读写分离的车略
4.为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。
5.双缓存
6.互斥锁
7.设置热点数据永不过期