网站首页 > 技术文章 正文
一、Redis数据库的安装和配置
1.下载地址:https://github.com/MSOpenTech/redis/releases
2.解压后,分别点击redis-server和redis-cli启动
二、主从概念
1.一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构
2.master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
3.通过主从配置可以实现读写分离:
4.master和slave都是一个redis实例(redis服务)
三、集群概念
1.集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
2.Redis集群:
2.1分类:
软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务
硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。
四、关于缓存
当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能会出现一些现象:
1.缓存穿透:
1.1概念:请求去查询一条数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。这种查询不存在数据的现象我们称为缓存穿透。
1.2带来的问题:如果有黑客会对你的系统进行攻击,拿一个不存在的id 去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。
1.3解决方法:
1.3.1缓存空值:之所以会发生穿透,就是因为缓存中没有存储这些空数据的key。从而导致每次查询都到数据库去了。那么我们就可以为这些key对应的值设置为null 丢到缓存里面去。后面再出现查询这个key 的请求的时候,直接返回null 。
1.3.2使用BloomFilter:BloomFilter 类似于一个hbase set 用来判断某个元素(key)是否存在于某个集合中。这种方式在大数据场景应用比较多,比如 Hbase 中使用它去判断数据是否在磁盘上。还有在爬虫场景判断url 是否已经被爬取过。 这种方案可以加在第一种方案中,在缓存之前在加一层 BloomFilter ,在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存 -> 查 DB。
1.4如何选择解决方法:针对于一些恶意攻击,攻击带过来的大量key 是不存在的,使用第二种方案进行过滤掉这些key。对于空数据的key有限的,重复率比较高的,我们则可以采用第一种方式进行缓存。
2.缓存击穿:
2.1概念:在平常高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿。
2.2带来的问题:会造成某一时刻数据库请求量过大,压力剧增。
2.3解决方法:我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。
3.缓存雪崩:
3.1概念:当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到数据库上面。结果就是数据库撑不住,挂掉。
3.2解决方法:
3.2.1事前:发生雪崩前对缓存集群实现高可用,如果是使用 Redis,可以使用 主从+哨兵 ,Redis Cluster 来避免 Redis 全盘崩溃的情况。
3.2.2事中:ehcache本地缓存 + Hystrix限流&降级,避免MySQL被打死
3.2.3事后:开启Redis持久化机制,尽快恢复缓存集群
4.热点数据集中失效:
4.1概念:我们在设置缓存的时候,一般会给缓存设置一个失效时间,过了这个时间,缓存就失效了。
对于一些热点的数据来说,当缓存失效以后会存在大量的请求过来,然后打到数据库去,从而可能导致数据库崩溃的情况。
4.2解决方法:
4.2.1设置缓存过期时间的时候,让他们失效的时间错开。比如在一个基础的时间上加上或者减去一个范围内的随机值。
4.2.2互斥锁,由于它会阻塞其他的线程,此时系统吞吐量会下降。需要结合实际的业务去考虑是否要这么做。
猜你喜欢
- 2024-09-20 Redis这些知识你了解吗?(redis知识点)
- 2024-09-20 Redis之Pub/Sub(发布订阅)(redis pub sub)
- 2024-09-20 本地启动redis控制台 & 安装redis服务(用于调试)
- 2024-09-20 redis安装4步轻松解决,你知道吗?
- 2024-09-20 redis快速入门(redis教程详解)
- 2024-09-20 Redis学习之路1-Redis的安装(redis 安装步骤)
- 2024-09-20 Redis系列-入门及安装(redis安装及使用)
- 2024-09-20 一探Redis究竟:超火爆入门指南,你竟然还没看?
- 2024-09-20 redis 一主二从三哨兵的搭建测试(redis三主三从如何选举)
- 2024-09-20 费时3个月啃烂了这份Redis技术笔记,我成功上岸进了字节
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 563℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 508℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 465℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 445℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 442℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)