redis和普通缓存区别
cached:本质是一个内存key-value 数据库,但
不支持数据持久化,服务器关闭后,数据全丢失。只支持key-value 结构
Redis:将大部分数据放在内存中,支持的数据类型有:字符串、hash 表、链表、集合、
有序集合以及基于这些数据类型的相关操作。Redis 内部使用一个redisobject 对象来表示all
key 和value。
他们的区别:
1)redis 中并不是all 数据都一直存储在内存中
2)redis 不仅仅支持简单的key-value 类型的数据,同时还支持字符串、hash表、链表、集合、有序集合
3)redis 支持数据备份,即master-slave 模式的备份
4)redis 支持数据的持久化,可以将内存中的数据保存在磁盘上,重启的时候可以再次加载进内存使用。
5)cached 挂掉后,数据不可以恢复,redis数据丢失后可通过AOF 恢复(灾难恢复)。
为什么需要NoSQL
1.对数据库高并发读写的需求
高并发就是同一时间有许多用户访问同一网站造成访问量太大容易造成服务器崩溃,而传统的解决方法就是搭建集群,通俗的讲就是原先一个服务器提供服务,现在变成多个服务器提供服务
2.高负载-对海量数据的高效率存储和访问的需求
通俗的讲就是数据量非常大,造成没地方存储或者访问查询sql的语句超过上千万造成查询非常低下
.高扩展-对数据库的高可扩展性和高可用性的需求
通俗的讲相当于银行窗口排队,刚开始一个窗口不能满足需求,后来增加多个窗口,而增加窗口不会造成业务上的不同,也就是集群起来很方便
redis应用
主要应用在如下场景
1.缓存(数据查询、商品内容等等)
2.聊天室的在线好友列表
3.任务队列(秒杀、抢购等等)
4.应用排行榜
5.网站访问统计
6.数据过期处理
7.分布式集群架构中的session分离
了解redis主从复制
通俗的讲就是一个用户访问一台服务器,该服务器假设为主服务器,具有读写功能,而在该主服务器下关联了一台从服务器,该从服务只具有读功能不具有写功能,并且数据是从主服务器经过一些列同步算法到该服务器上
分析:
1.master可以拥有多个slave
2.多个slave可以连接同一个master外,还可以连接其他的slave
3.主从复制不会阻塞master在同步数据时,master可以据需处理client请求
4提供系统的伸缩性
5.slave挂掉重启后不是slave
主从复制过程
1.slave与master建立连接,发送sync同步命令
2.master会开启一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存
3.后台完成保存后,就将文件发送给slave
4.slave将此文件保存在硬盘上
了解redis持久化机制
edis需要经常将内存中的数据同步到硬盘来保证持久化
1.快照(默认方式)
将内存中以快照的方式写入到二进制文件中,默认为dump.rdb,可以通过配置设置自动做快照持久化的方式。可以配置redis在n秒内如果超过m个key则修改就自动做快照
save 900 1 #900秒内如果超过1个key被修改 则发起快照保存
2.aof(日志方式)
由于快照方式是在一定时间间隔做一次,所以可能发生redis意外down的情况就会丢失最后一次快照后的所有修改的数据。使用aof时,redis会将每一个收到的写命令都通过write函数追加到命令中
aof设置
appendonly yes //启动aof,有三种修改方式
#appendfsync always//收到命令就立即写入到磁盘,效率最慢,但是保证完全的持久化
#appendysync everysec//每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendysync no //完全依赖os性能,持久化没保证
Redis的回收策略
从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
从已设置过期时间的数据集中挑选将要过期的数据淘汰
从已设置过期时间的数据集中任意选择数据淘汰
从数据集中挑选最近最少使用的数据淘汰
从数据集中任意选择数据淘汰
禁止驱逐数据
redis常见性能问题和解决方案
Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
尽量避免在压力很大的主库上增加从库
主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变
了解分布式锁
可靠性
互斥性。在任意时刻,只有一个客户端能持有锁。
不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。
解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了
基本原理 : 用一个状态值表示锁,对锁的占用和释放通过状态值来标识。
redis+setnx实现?
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放
如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
同时把setnx和expire合成一条指令来用的
假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使用keys指令可以扫出指定模式的key列表
如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
如果有大量的key需要设置同一时间过期,一般需要注意什么?
如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。
redis其他功能
Redis是单进程单线程的,利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销
数据分片、分库
发布订阅
集群
各种配置
Nginx负载均衡方式
可以根据客户端的ip 进行负载均衡,在upstream 里设置ip_path,负载均衡五种配置
1)轮询(默认),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端
服务器down 掉,能自动剔除
2)指定权重,指定轮询几率。权重越大,轮询几率越大,用于后端服务器性能不均的情况
3)ip 绑定ip_path,每个请求按访问ip 的哈希结果分配,这样每个客户固定访问一个服务器,可以解决session 问题
4)fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配
5)url_hash 按访问的url 结果来分配请求,使每个url 定位到同一个后端服务器。后端服务器为缓存时比较有效
nginx其他
反向代理
文件服务器
静态资源
ssl配置
各种其他配置
了解shiro
主要为解决以下四个问题
1、 认证-用户身份识别,常被称为用户登录
2、 授权-访问控制
3、 密码加密-保护或隐藏数据防止被偷窥
4、 会话管理-每用户相关的时间敏感的状态
原理图
token令牌、认证与授权、缓存机制(Ehcache)、散列算法(MD5)、匹配、会话
拦截器和相关配置、shiro标签
shiro会话管理(sessionDao和监听器)
了解lucene
全文检索首先对要搜索的文档进行分词,然后形成索引,通过查询索引来查询文档,比如:字典
字典的偏旁部首页,就类似于luence的索引
字典的具体内容,就类似于luence的文档内容
原理图:
其主要分为索引流程和搜索流程
索引流程:采集数据—文档处理-存储到索引库中
搜索流程:输入查询条件—通过lucene的查询器查询索引—从索引库中取出结果
逻辑结构
索引-文档域(document-field)
分词、过滤、各种查询语法
了解elasticsearch
字典树(结合图形)
根节点不包含字符,除根节点外每一个节点都只包含一个字符。
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
每个节点的所有子节点包含的字符都不相同。
其它参考lucene学习的
了解dubbo
那张原理图,主要是暴露服务,提供接口
Consumer服务消费者,Provider服务提供者。Container服务容器,Monitor这是一个监控,Registry注册中心
Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
可以的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用
注册中心对等集群,任意一台宕掉后,会自动切换到另一台
注册中心全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯
服务提供者无状态,任一台 宕机后,不影响使用
服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复
Dubbo在安全机制方面是如何解决的
Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方
了解activeMQ
发布-订阅(topic)一对多
p2p(Queue)点对点
配置参数相关设置,如处理过期,心跳等设置
了解websocket
ajax轮询 : 让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息
long poll : 客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始,取的是阻塞模型
Websocket :主动推送,建立一次握手
了解fastdfs
原理图
clint-tracker(相当于一个管家,在storager与client之间进行交流)-storager(存储图片)
配合Nginx按照一定规则存储和取出图片
一般有图片到tomcat服务器或者第三方(如七牛云),或者自己搭建图片服务器
其他
技术是学不完的,总是为解决某些问题而产生,技术只是工具,而如何去解决问题才是关键,而我认为计算机基础课程才是最主要的,对一个人在计算机领域的发展和学习技术至关重要
最后
希望自己找到一份好的实习