缓存
网站百分之80的情况下都是在读的,所以频繁的去数据库查询,会导致性能下降,为了避免,使用缓存
企业级用户访问数据流程
在这里插入图片描述
Nosql
Nosql = Not only sql(非关系型数据库)
关系型数据库:行 列 表格(局限性)
很多数据类型,用户的个人信息,社交网络,地理位置,这些都不是固定格式,甚至是网状、拓扑,
Redis
Remote Dictionary Sever 远程字典服务
是一个开源key_value的数据库,是当下最热门的Nosql技术之一
默认有16个数据库,默认使用第0个
可以使用select *去切换
设置了key_value
在这里插入图片描述
key * 罗列出当前key,flushdb清空当前数据库,flushall清除全部数据库内容,
redis 是单线程的
redis的所有数据都放在内存里,单线程效率最高,多线程会造成上下文的切换造成耗时,对内存系统来说,没有上下文切换是最好的,多次读写都在一个cpu上
五大数据类型
string
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
value除了是字符串还可以是数字,他可以用来做计数器,比如粉丝的数量
List
列表
左右插入
在这里插入图片描述
在这里插入图片描述
它实际上就是一个链表
他的功能可以用于微博的粉丝列表,他的range从某个元素读取多少个元素功能类似微博 高性能分页 下一页
set
set(集合)中的值是不能重复的,可以实现两个集合的并集 差集 交集 比如微博 B站 共同关注应用。
Hash
哈希表,相当于一个key_map的映射表,它更适用于存储对象,用于用户信息、商品信息。
zset
对比于set 它增加了一个score参数,根据这个参数能够排序,可以应用与直播间礼物榜的排名
redis事务

redis 不支持回滚,“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。
如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
如果在一个事务中出现运行错误,那么正确的命令会被执行
我不怎么使用事务
持久化
redis是内存数据库,如果没有持久化,断电即失,
RDB,在一定时间内将数据以快照的形式保存到硬盘中,对应的文件产生dump.rdb 可以通过修改配置文件来改变周期
优点:fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化,保证了redis性能高 恢复速度快
缺点:兼容性差,容易造成数据丢失
AOF:每次执行的命令记录到日志文件中,当重启redis的时候,会重新将持久化的日志恢复数据
优点:每进行一次 命令操作就记录到 aof 文件中一次 所以安全,即使中途服务器宕机,也可以重新恢复
缺点:AOF文件大,恢复速度慢
订阅
在这里插入图片描述
比如订阅了公众号,发布了公众号我们能看到
在这里插入图片描述
发布之后,所有订阅的客户端都接受消息内容
主从复制
一台redis服务器的数据,复制到其他redis服务器,主以写为多,从以读为多。
作用:
1.当主节点出现问题的时候,从节点可以提供服务,快速的修复故障。
2.负载均衡,主从复制的基础上配合读写分离,分担服务器负载,尤其是在读多写少的情况下,通过多个从节点进行分担负载,提高redis的并发量
哨兵模式
哨兵是一个独立的进程,通过发送命令,等待redis服务器响应,监控运行多个redis实例,但是一个哨兵对服务器监控,可能会出现问题,所以需要多个哨兵,各个哨兵还会互相监控,形成多哨兵模式

故障转移时,判断一个 master node 是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题。
即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的,因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就很坑爹了
缓存穿透(查不到)
当用户想查询一个数据,发现缓存中没有,于是会向数据库查询,发现数据库也没有,当类似于秒杀,当很多用户进行请求的时候,会造成很大压力,导致缓存穿透。
解决方案:
1.使用布隆过滤器,他是一种数据结构,对所有的查询的参数,以hash的方式存储,进行校验,不符合则丢弃,避免了对底层存储系统的查询压力
2.使用缓存空对象,即使缓存不命中,也将空的对象缓存起来,设置一个过期的时间,之后如果在访问这个数据,也从这个缓存读,这样保护了后端数据源。不过:会造成时间不一致,业务不一致,同时也占用内存
缓存击穿(查量太大)
一个key非常的热点,大并发集中一个点进行访问,当这个key在过期的瞬间,持续的大并发访问,直达数据库,同时数据库又要写回缓存,导致数据库时间压力过大
解决方案:
设置热点数据永不过期
加互斥锁,保证只有一个线程能直接查询后端服务
缓存雪崩
缓存同一时间内,大面积失效,后面所有的请求都落在数据库上,数据库短时间内承受。
解决方案:
1.多增设几台redis,保证一台挂掉之后 其他能顶上,集群的特点
2.限流降级,在缓存失效后,通过加锁和队列控制读数据库写缓存,某个key只允许一个线程,查询数据和写缓存,。
3.数据预热,在部署之前,先访问一遍,设置不同的过期时间,让缓存失效的时候均匀点

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐