1,redis的5种数据结构
- key-string:一个key对应一个值。
- key-hash:一个key对应一个Map。
- key-list:一个key对应一个列表。
- key-set:一个key对应一个集合。
- key-zset:一个key对应一个有序的集合。
2.redis主从架构模式的优缺点
优点:
1,可靠性高,主机出现问题立马调动备胎,另一方面开启数据持久化功能,和配置合理的备份策略,能有效解决数据误操作和数据异常丢失问题。
2,读写分离策略,从节点可以拓展主库主库节点的读的能力,有效的应对并发量大的读操作
缺点:
1,主库的写能力受到单机的限制,可以考虑分片。2,主库的存储能力受到单机的限制,可以考虑 Pika。3,当主库节点出现故障时,需要手动将一个从节点晋升为主节点,同时需要通知业务方变更配置,并且需要让其它从库节点去复制新主库节点,整个过程需要人为干预,比较繁琐(就是一旦主节点发生故障整个缓存机制就会瘫痪)。
3.哨兵模式
其部署架构主要包括两部分:Redis Sentinel 集群和 Redis 数据集群。其中 Redis Sentinel 集群是由若干 Sentinel 节点组成的分布式集群,可以实现故障发现、故障自动转移、配置中心和客户端通知。Redis Sentinel 的节点数量要满足 2n+1(n>=1)的奇数个。
优点:
1,Redis Sentinel 集群部署简单,2,能够解决 Redis 主从模式下的高可用切换问题。
3,很方便实现 Redis 数据节点的线形扩展,轻松突破 Redis 自身单线程瓶颈,可极大满足 Redis 大容量或高性能的业务需求。
4,可以实现一套 Sentinel 监控一组 Redis 数据节点或多组数据节点
缺点:
1,部署相对 Redis 主从模式要复杂一些,原理理解更繁琐。
2,资源浪费,Redis 数据节点中 slave 节点作为备份节点不提供服务。
3,Redis Sentinel 主要是针对 Redis 数据节点中的主节点的高可用切换,对 Redis 的数据节点做失败判定分为主观下线和客观下线两种,对于 Redis 的从节点有对节点做主观下线操作,并不执行故障转移。
4,不能解决读写分离问题,实现起来相对复杂。
4,redis集群模式
主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好的负载均衡的目的。Redis Cluster 集群节点最小配置 6 个节点以上(3 主 3 从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。Redis Cluster 采用虚拟槽分区,所有的键根据哈希函数映射到 0~16383 个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据。
特点:
1》redis集群是无中心的
2》redis集群有个ping-pang机制
3》投票机制,redis集群的节点数量必须是2n-1
4》redis集群中默认分配了16384个hash槽,在存储数据时就会把key进行crc16的算法,并且对16382取余,根据最终的结果,将key-value存放到指定的redis节点中,而且每一个redis集群都会维护着相应的hash槽。
5》为了保证数据的安全性,每一个集群的节点,至少要根着一个从节点。
6》单独的针对redis集群的某一个节点搭建主从。
7》当redis集群中,超过半数的节点宕机之后,redis集群就瘫痪了。
5,缓存穿透,缓存击穿,缓存雪崩的区别和解决方案
缓存处理流程: 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
-
缓存穿透
描述:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。 -
缓存击穿
描述:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
设置热点数据永远不过期。
加互斥锁。缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。 -
缓存雪崩
描述:
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
设置热点数据永远不过期。
6,ES的RESTful语法
- GET请求:查索引
- http://ip:port/index:查询索引信息—+++查索引
- http://ip:port/index/type/doc_id:查询指定的文档信息—+++查id
- POST请求:查某一条,(当做添加文档,自动生成id时也用这个手动生成id的时候用 put)
- http://ip:port/index/type/_search:查询文档,可以在请求体中添加json字符串来代表查询条件—+++查(加条件查询加query)
- http://ip:port/index/type/doc_id/_update:修改文档,在请求体中指定json字符串代表修改的具体信息—+++改(根据id改指定的doc文档)
- http://ip:port/index/type:增加操作,可以自动生成id
- PUT请求:增(创建索引)
- http://ip:port/index:创建一个索引,需要在请求体中指定索引的信息,类型,结构—+++增索引
- http://ip:port/index/type/_mappings:代表创建索引时,指定索引文档存储的属性的信息—+++增(为已有索引增mapping,fired)
- DELETE请求:删
- http://ip:port/index:删除索引
- http://ip:port/index/type/doc_id:删除指定的文档
7,springboot的启动方式
main方法
maven命令:mvn spring-boot:run
jar包:java-jar jar文件
8,term和match的区别
》term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中去匹配内容。
terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。如果分词器没有这个分词就匹配不到。
》match查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。
- 查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。
- 如果查询的内容是一个不能被分词的内容(keyword),match查询不会对你指定的查询关键字进行分词。
- 如果查询的内容时一个可以被分词的内容(text),match会将你指定的查询内容根据一定的方式去分词,去分词库中匹配指定的内容。
match查询,实际底层就是多个term查询,将多个term查询的结果给你封装到了一起。
但是不同点是每一个term是不能分词的,当match差一个可以分词的数据时候相当于把他分为多个不能分词的term去查询