本文共 14000 字,大约阅读时间需要 46 分钟。
使用场景:
发布、订阅消息系统 地图信息分析 定时器、计数器 String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存应用: 常规计数:微博数,粉丝数等。set使用地方: 在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为
集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能hash使用:Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
存储部分变更的数据,如用户信息等。Zset使用:排行榜应用; 取TOP N操作 !
1.网站的瓶颈?
1.数据量太大,一个机器放不下 2.数据的索引(B+Tree),一个机器内存也放不下 3.访问量(读写混合),一个服务器承受不了2. 数据库优化的发展过程?
1.优化mysql底层的数据结构和索引 2.文件缓存(IO) 3.Memcached(当时最热门的技术) 4.读写分离 5.分库分表3. MyISAM :表锁(将整个表锁了),十分影响效率,高并发下出现严重的锁问题
Innodb:行锁(一行一行的锁) 使用分库分表来解决 写 的压力4. NoSQL
NoSQL = Not Only SQL,意思:不仅仅是SQL,泛指非关系型的数据库很多的数据类型:用户信息,地理位置,社交网络,这些数据类型的存储不需要一个固定的
格式,可以使用Map<String,Object>使用键值对来进行控制 5. NoSQL 的特点? 1.易扩展 2.大数据量高性能 官方记录:Redis 一秒可以写8万次,读11万次! 3.多样灵活的数据模型 (不需要事先设计数据库 随取随用,)NoSQL
- 代表着不仅仅是SQL - 没有声明性查询语言 - 没有预定义的模式 - 键值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性 - 非结构化和不可预知的数据 - CAP定理 - BASE 高性能,高可用性 和 可伸缩性6.大数据时代的3V : 主要是对问题的描述
海量 Volume 多样 Variety 实时 Velocity互联网需求的3高 : 主要是对程序的要求
高并发 高可用 高性能7. 做一个架构师?
没有什么是加一层解决不了的8. 文档型数据库:MongoDB (商品描述、详情、评价信息(多文字类))
9.商品的图片?
分布式文件系统 FastDFS 淘宝自己的 TFS Google的 GFS Hadoop HDFS 阿里云的 oss10. 商品的关键字(搜索)?
搜索引擎,淘宝内用 ISearch:多隆 一高兴一个人开发的 搜索引擎: solr es11. 商品的热门的波段信息?
内存数据库 Redis Tair Memache12. 商品的交易,外部的支付接口?
三方应用, 一个支付接口13. 大型互联网的应用问题?
1.数据类型太多了 2.数据源繁多,经常重构 3.数据要改造,大面积改造解决方法: UDSL(统一数据服务平台)
14.NoSQL四大分类?
1.KV键值: 新浪:BerkeleyDB+redis 美团:redis+tair 阿里、百度:memcache+redis2.文档型数据库(bson格式比较多):
MongoDB MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可 扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰 富,最像关系数据库的。 3.列存储数据库: HBase 分布式文件系统 4.图关系数据库 它不是放图形的,放的是关系比如:朋友圈社交网络、广告推荐系统 社交网络,推荐系统等。专注于构建关系图谱 Neo4J15. Redis能干嘛?
内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面使用场景:
发布、订阅消息系统 地图信息分析 定时器、计数器 String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存应用: 常规计数:微博数,粉丝数等。16.Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。
17. Redis 启动命令?
# 【shell】启动redis服务 [root@192 bin]# cd /usr/local/bin [root@192 bin]# redis-server /opt/redis-5.0.7/redis.conf# redis客户端连接===> 观察地址的变化,如果连接ok,是直接连上的,redis默认端口号 6379
[root@192 bin]# redis-cli -p 6379# 【shell】ps显示系统当前进程信息
[root@192 myredis]# ps -ef|grep redis# 【redis】关闭连接
127.0.0.1:6379> shutdown18. Redis里面有16个数据库,默认使用的是第0个
# 切换数据库 127.0.0.1:6379> select 7#DBSIZE查看当前数据库的key的数量
127.0.0.1:6379[7]> DBSIZE (integer) 0#清除当前数据库
127.0.0.1:6379> FLUSHDB OK#Flushall:清空全部的库
#查看所有的name值
127.0.0.1:6379>keys * #判断name是否存在 127.0.0.1:6379>EXI19. redis 6.0 引入了对多线程,为了提高网络IO读写性能,但是
默认关闭,并且执行命令是单线程的20. redis为什么单线程还这么快?
核心:redis是将所有的数据全部存放在内存中的,所以说使用单线程去操作效率就 是最高的,多线程(CPU上下文会切换,耗时的操作),对于内存来说, 如果没有上下文切换,效率就是最高的。 多次读写都是在一个CPU上的 CPU> 内存 > 硬盘这种模拟出来的情况就有一个代价,就是上下文的切
换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存 的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处 理这个事。在内存的情况下,这个方案就是最佳方案。21. redis常见的五大数据类型?
Redis-key String List Set Hash Zset 三种特殊的数据类型? geospatial hyperloglog bitmaps1. String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M。2. Hash(哈希,类似 Java里的Map)
Redis hash 是一个键值对集合。 Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象。 类似Java里面的Map<String,Object>3.List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 它的底层实际是个链表 !4. Set(集合)
Redis的Set是String类型的无序集合,它是通过HashTable实现的5. Zset(sorted set:有序集合)
22. Redis-Key 是什么?
# keys * 查看所有的key 127.0.0.1:6379> keys * (empty list or set)127.0.0.1:6379> set name qinjiang
OK127.0.0.1:6379> keys * 1) "name"
# exists key 的名字,判断某个key是否存在
127.0.0.1:6379> EXISTS name (integer) 1127.0.0.1:6379> EXISTS name1
(integer) 0# move key db ---> 当前库就没有了,被移除了
127.0.0.1:6379> move name 1 (integer) 1 127.0.0.1:6379> keys * (empty list or set) # expire key 秒钟:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删 除。 # ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期 127.0.0.1:6379> set name qinjiang OK# type key 查看你的key是什么类型
127.0.0.1:6379> type name string23.字符串 String 常用命令?
set key1 value1 # 设置值 get key1 # 获得key del key1 # 删除key keys * # 查看全部的key append key1 "hello" # 对不存在的 key 进行 APPEND ,等同于 SET key1 "hello" STRLEN key1 # # 获取字符串的长度# incr、decr 一定要是数字才能进行加减,+1 和 -1。
# incrby、decrby 命令将 key 中储存的数字加上指定的增量值。# range [范围]
# getrange 获取指定区间范围内的值,类似between...and的关系,从零到负一表示全部# mset Mset 命令用于同时设置一个或多个 key-value 对。
# mget Mget 命令返回所有(一个或多个)给定 key 的值。 # 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。 # msetnx 当所有 key 都成功设置,返回 1 。 # 如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。原子操 作String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
常规key-value缓存应用: 常规计数:微博数,粉丝数等。24.列表List 常用命令?
# Lpush:将一个或多个值插入到列表头部。(左) # rpush:将一个或多个值插入到列表尾部。(右) # lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。# lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil 。
# rpop 移除列表的最后一个元素,返回值为移除的元素。Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)
llen 用于返回列表的长度。
lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
# Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区 间之内的元素都将被删除。
# rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
# lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。
List 性能总结
它是一个字符串链表,left,right 都可以插入添加 如果键不存在,创建新的链表 如果键已存在,新增内容 如果值全移除,对应的键也就消失了 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。Redis的list是每个子元素都是String类型的双向链表。
25.Set 数据类型 常用命令?
单值多value # sadd 将一个或多个成员元素加入到集合中,不能重复 # smembers 返回集合中的所有的成员。 # sismember 命令判断成员元素是否是集合的成员。 # srem key value 用于移除集合中的一个或多个成员元素 # scard,获取集合里面的元素个数 # srandmember key 命令用于返回集合中的一个随机元素。 # spop key 用于移除集合中的指定 key 的一个或多个随机元素# smove SOURCE DESTINATION MEMBER
# 将指定成员 member 元素从 source 集合移动到 destination 集合。 使用地方: 在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为 集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能26. 哈希Hash?
kv模式不变,但V是一个键值对 # hset、hget 命令用于为哈希表中的字段赋值 。 # hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段。 # hgetall 用于返回哈希表中,所有的字段和值。 # hdel 用于删除哈希表 key 中的一个或多个指定字段 # hlen 获取哈希表中字段的数量。 # hexists 查看哈希表的指定字段是否存在。 # hkeys 获取哈希表中的所有域(field)。 # hvals 返回哈希表所有域(field)的值。# hincrby 为哈希表中的字段值加上指定增量值。
# hsetnx 为哈希表中不存在的的字段赋值 。hash使用:Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
存储部分变更的数据,如用户信息等。27. 有序集合Zset ?
在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2 # zadd 将一个或多个成员元素及其分数值加入到有序集当中。 # zrange 返回有序集中,指定区间内的成员 # zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大) 次序排列。 # zrem 移除有序集中的一个或多个成员 # zcard 命令用于计算集合中元素的数量。 # zcount 计算有序集合中指定分数区间的成员数量。 # zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。Zset使用:排行榜应用; 取TOP N操作 !
28.GEO地理位置? Geospatial地理位置详解 获取地理位置的坐标 GEO 的数据结构总共有六个常用命令:geoadd、geopos、geodist、georadius、 georadiusbymember、gethash#getadd 添加地理位置
127.0.0.1:6379> geoadd china:city 116.23 40.22 北京 (integer) 1#getpos 获得当前定位:一定是一个坐标值
127.0.0.1:6379> geopos china:city 北京 1) "116.23000055551528931" 2) "40.2200010338739844"#geodist 返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值。
127.0.0.1:6379> geodist china:city 北京 上海 "1088785.4302"#georadius 以给定的经纬度为中心, 找出某一半径内的元素
# 在 china:city 中寻找坐标 100 30 半径为 1000km 的城市 127.0.0.1:6379> georadius china:city 100 30 1000 km 重庆 西安#geohash Redis使用geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似 表示距离越近。
127.0.0.1:6379> geohash china:city 北京 重庆 wx4sucu47r0 wm5z22h53v0GEO底层的实现原理其实就是Zset(有序集合),我们可以使用zset命令来操作geo
29.Bitmaps 位存储 统计用户信息,活跃,不活跃,登录,未登录, 打卡 ,两种状态的,都可以用bitmaps Bitmaps 位图,数据结构,都是操作二进制来进行记录,就只用0和1俩个状态127.0.0.1:6379> setbit sign 0 1
0127.0.0.1:6379> getbit sign 3 # 查看周四是否打卡
130. 事务?
redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。Redis事务没有隔离级别的概念:
redis单条命令是保存原子性的,但是事务不保证原子性Redis事务的三个阶段:
开始事务 (multi) 命令入队 执行事务 (exec)放弃事务(DISCARD)
若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行
若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确
命令会被执行,错误命令抛出异常。31.监控?Watch (本身就可以做一个乐观锁)
悲观锁: 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在 拿数据的时候都会上锁,这样别人想拿到这个数据就会block直到它拿到锁。传统的关系型数据库里面就 用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在操作之前先上锁。 乐观锁: 乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会 上锁。但是在更新的时候会判断一下再此期间别人有没有去更新这个数据,可以使用版本号等机制,乐 观锁适用于多读的应用类型,这样可以提高吞吐量,乐观锁策略:提交版本必须大于记录当前版本才能 执行更新。 乐观锁: 1. 获取version 2.更新的时候比较 versionredis的监视测试:
测试多线程修改值,使用watch可以当做redis的乐观锁操作 怎样解决监视问题: 如果事务执行失败 unwatch 解锁 之后在重新监视 watch money exec 比对监视的值是否发生了变化,如果变化就执行失败32. Jedis
使用java来操作Redis 编码测试: 连接数据库 操作命令 断开连接Jedis所有的命令 就是我们之前学习的指令
setex 过期时间
setnx 没有的就创建33. SpringBoot整合Redis?
SpringBoot 操作数据:spring-data jpa jdbc mongodb redis说明: 在SpringBoot2.x之后,原来使用的jedis被替换成了lettuce
jedis:采用的是直连,多个线程操作的话,是不安全的,如果想要避免不安全的, 使用jedis pool 连接池 BIO模式lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况,
可以减少线程数量, NIO模式使用:
1,导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>2.配置redis,可以查看 RedisProperties 分析
# Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379在企业中,我们所有的pojo类,都会序列化
在真实的开发中,公司都会自己封装一个RedisUtils
34. Redis的配置文件?
启动的时候,就通过配置文件来启动的进入Redis.conf文件里面,用vim
持久化 ,在规定的时间内,执行了多少次操作,则会持久化到文件 rdb aof
redis是内存数据库,如果没有持久化,那么数据断电即失。35. Redis持久化?
Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中 的数据库状态也会消失。所以 Redis 提供了持久化功能!RDB (Redis DataBase)
1. 什么是RDB 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快 照文件直接读到内存里。2. Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程
都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。 这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB方式要比AOF方式更加的高效。 RDB的缺点是最后一次持久化后的数据可能丢失。rdb保存的文件是dump.rdb 都是在我们的配置文件中快照进行配置的
ps -ef|grep //查看进程
3. RDB快照触发机制?
1.save的规则满足的情况下,会自动触发rdb规则,生成dump.rdb文件 2.执行flushall命令,也会触发我们的rdb规则,生成dump.rdb文件 3.退出redis,也会产生rdb文件4.如何恢复rdb文件?
1、将备份文件(dump.rdb)移动到redis安装目录并启动服务即可 2、CONFIG GET dir 获取目录5.rdb快照的优缺点?
优点: 1、适合大规模的数据恢复 2、对数据完整性和一致性要求不高 缺点: 1、在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改 2、Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。34.AOF?
AOF(Append Only File) 以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件 但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件 的内容将写指令从前到后执行一次以完成数据的恢复工作 AOF保存的是 appendonly.aof 文件总结:1、RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储
2、AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始 的数据,AOF命令以Redis 协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重 写,使得AOF文件的体积不至于过大。 35.Redis的发布订阅? 1.是什么? Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。2.命令?
#订阅者 redis 127.0.0.1:6379> SUBSCRIBE redisChat#发布者
redis 127.0.0.1:6379> PUBLISH redisChat "Hello,Redis" (integer) 1 redis 127.0.0.1:6379> PUBLISH redisChat "Hello,Kuangshen" (integer) 13.原理?
Redis 通过 PUBLISH(推送) 、SUBSCRIBE(接受) 和 PSUBSCRIBE(接收多个) 等命令实现发布和订阅功能。Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个
key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应 的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。使用场景:
1,实时消息系统 2.实时聊天(频道当做聊天室,将信息回显给所有人) 3.订阅,关注系统都是可以的稍微复杂的场景,我们就会使用消息中间件来做 MQ (ribbitMQ)
36.Redis 的主从复制?
1.是什么? 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader), 后者称为从节点(slave/follower); 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。 (主从复制,读写分离,80%的情况下都在进行读操作,减缓服务器的压力,主从复制是标配的)默认情况下,每台Redis服务器都是主节点; 一个主节点可以有多个从节点(或者没有从节点),但是一个从节点只能有一个主节点
2.主从复制的作用主要包括?:
1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。 2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务 的冗余。 3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写 少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。 4、高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是 Redis高可用的基础。高可用大部分情况下都在说集群
3.一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(一主二从),原因是什么?
1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大; 2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有 内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。4.环境配置?
只配置从库,不用配置主库, 默认情况下,每台Redis服务器都是主节点 5.一主二从? 命令: 127.0.0.1:6380> SLAVEOF 127.0.0.1:6379 //80认79当老大6.细节1?
主机可以写,从机不能写只能读,主机中的所有信息和数据,都会自动被从机保存。细节2?
主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,如果主机回来了,从机依旧可以直接 获取到主机写的信息。细节3?
如果使用命令行,来配置的主从,这个时候如果重启了,就会变回主机,只要重新配成从机,立马就会从主机中获取值。7.复制原理?
Slave 启动成功连接到 master 后会发送一个sync命令 Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。 增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行,我们的数据一定可以在从机中看到。8.层层链路?
上一个主节点连接下一个从节点,中间的节点依旧是从节点 这个时候也可以完成我们的主从复制上一个Slave 主节点可以是下一个slave 和 Master,Slave 同样可以接收其他 slaves 的连接和同步请求,那么
该 slave 作为了链条中下一个的master,可以有效减轻 master 的写压力!9.谋朝篡位?
如果主机断开了连接,我们可以使用 SLAVEOF on one 让自己变成主机,其他的节点就可以手动连接到最新的这个主节点(手动) (哨兵没用之前,手动选老大,哨兵用了之后,自动选老大),如果这个时候老大修复了,那就只能重新配置,他现在是一个光杆司令。37. 哨兵模式?(自动选取老大的模式)
谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独
立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。1.这里的哨兵有两个作用?
通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服 务器,修改配置文件,让它们切换主机。2.哨兵的使用过程?
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover(故障转移)过程,仅仅是哨兵1主观的认 为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一 定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作。 切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为 客观下线。3.启动哨兵?
命令: Redis-sentinel /myredis/sentinel.conf 4.查看哨兵日志? info replication 查看5.如果主机此时回来了,只能当从机,归并到新的主机下
6.哨兵模式的优缺点?
优点 1. 哨兵集群模式是基于主从模式的,所有主从的优点,哨兵模式同样具有。 2. 主从可以切换,故障可以转移,系统可用性更好。 3. 哨兵模式是主从模式的升级,系统更健壮,可用性更高。 缺点 1. Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。 2. 实现哨兵模式的配置也不简单,甚至可以说有些繁琐38. Redis的缓存穿透和雪崩?
1.缓存穿透?(查不到) 缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于 是向数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是 都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。解决方法?
1.布隆过滤器 布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则 丢弃,从而避免了对底层存储系统的查询压力; 2. 缓存空对象 当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数 据将会从缓存中获取,保护了后端数据源;但是这种方法会存在两个问题:
1、如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多 的空值的键; 2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于 需要保持一致性的业务会有影响。2. 缓存击穿?(量太大了,缓存过期) 这里需要注意和缓存击穿的区别,缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中 对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一 个屏障上凿开了一个洞。 当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访 问数据库来查询最新数据,并且回写缓存,会导使数据库瞬间压力过大。
解决方案?
设置热点数据永不过期 从缓存层面来看,没有设置过期时间,所以不会出现热点 key 过期后产生的问题。 加互斥锁 分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布 式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。 3.缓存雪崩? 缓存雪崩,是指在某一个时间段,缓存集中过期失效。 产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商 品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都 过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波 峰。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。解决方法?
redis高可用 这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续 工作,其实就是搭建的集群。 限流降级 这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对 某个key只允许一个线程查询数据和写缓存,其他线程等待。
转载地址:https://blog.csdn.net/qq_18072961/article/details/125501648 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!