什么叫做内置缓存?存放在jvm内置缓存中,比如oscahe ehcahe,在内置缓存中查询不到,然后再查询数据库。
什么叫NOSQl:非关系型数据库。
Redis 和 Memcached的区别?redis可以持久化,高可用,灾难备份,
Redis:也叫远程字典服务器,也叫分布式的内存数据库,减轻数据库访问压力,redis是内存数据库,要比io数据库效率要高。
1.---------使用redis有哪些好处?-------------------
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都很快
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
2.----------redis的应用场景----------------
token生成,session共享,分布式锁,自增id(redis有一个方法自动获取),验证码2.----------分布式数据库中CAP原理CAP+BASE----------------
(1).传统ACID是什么?原子性,一致性,隔离性,持久性
(2).NOSQL中的CAP: C强一致性(例如:评论点赞数前后端必须一样), A可用性(只要保证网站别崩溃就行), P分布式容忍性
CAP只能三选二: P是分区容错性是我们必须需要实现的,我们只能在一致性与可用性之间进行权衡,没有NOSQL系统能够同时满足这一点
CA:主要是指传统数据库 AP:大多数的网站选择 CP:Redis,Mongodb
(3).BASE:就是为了解决关系数据库一致性引起的问题,降低可用性而提出的解决问题.
(4).分布式+集群: 分布式:不同的多台服务器机器部署不同的服务模块 集群:不同的多台服务器部署相同的服务模块
3.---------redis持久化 主要两个 rdb 和 aop--------
RDB(Redis DataBase)
定义: 在特定的时间段内将内存中的数据集快照写入磁盘
行话也叫snapshot快照,它恢复时是将快照的内容读入内存.
保存的是dump.rdp文件
Fork:重新拷贝一个线程,与原线程相同,主要是备份dump.rdp文件,此文件应该和原dump.rdp文件处于不同的主机
如何触发RDB快照:
(1)根据默认的配置来进行保存
1分钟内改了1万次
5分钟改了10万次
15分钟内改了1次
(2)通过save命令
(3)执行flushall,但是执行之后文件是空的,没有意义
RDB的 优势:适合大规模的数据恢复 劣势:并不是实时存储,最后一次的备份可能有丢失,Fork效率有问题.
aof:在配置文件中将appendonly打开就可以启用这种方式,是将所有的操作记录全部记录下来
aof文件如果记录错误,会有相关的命令去检查文件,会将相应的错误记录去掉.默认的出厂设置是每秒中保存一次,也就是最多丢失一秒钟的数据,最好将aof的文件也备份一份.
劣势:每次发生数据变化就会立即记录到磁盘,性能较差,但是数据的完整性较好
处理:当aof文件大到一定地步的时候,redis会进行压缩也叫重写,一般是默认64M的之后启动.
4.--------redis发布订阅-------
只需要了解即可,真正的企业不会用它做消息中间间,他的主要功能还是分布式缓存数据库
5.-------redis复制----------
一主二仆 : 一个master主要进行写的操作,两个salve主要进行读的操作
薪火相传 : 一个master挂掉之后,将配置的salve转换成master角色
反客为主 : 使当前数据库停止与其它数据库的同步,转成主数据,需要手动通过命令来执行
哨兵模式 :目前主要的方式 反客为主的自动版 使用投票选举的方式选择一个master,底层会根据机器的情况在计算
以上四种方式在复制的时候又会分为全量复制和部分复制
1. redis什么时候会发生全量复制?
a) redis slave首启动或者重启后,连接到master时
b) redis slave进程没重启,但是掉线了,重连后不满足部分复制条件
2. redis什么时候会发生部分复制?
b) redis slave进程没有重启,但是掉线了,重连了master(因为slave进程重启的话,run id就没有了)
c) redis slave保存的run id与master当前run id一致
d) redis slave掉线期间,master保存在内存的offset可用,也就是master变化不大,被更改的指令都保存在内存
3. redis进程重启后会发生全量复制还是部分复制?
a) master重启时,run id会发生变化
b) slave重启时,run id会丢失
答:很显然,会发生全量复制,因为部分复制的条件之一run id已经不能满足
4.当全量复制或者同步复制完毕,增量是如何更新到slave的?
答:通过流式的命令更新,此时master就是slave的client,这样去理解。
5. run id如何查看?
答:通过info server命令查看
6.如果master和salve都宕机之后,应该怎么办?
使用keepalived监控,自动帮你重启,如果一直重启失败,会以邮件的形式通知.
6.---------redis事物--------------
redis对事物的支持是部分支持.
常用命令:
redis的事物执行步骤
(2)命令入队。
(3)执行事务。
redis事物的五大特性
乐观锁(Optimistic Lock),每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
6.---------redis宕机之后解决方案--------------
一般我们会用哨兵模式+keepalive
当发现宕机之后,哨兵机制会重新选择一个master,如果所有的redis宕机的话,会使用kepalive进行心跳检测,帮助我们自动重启,如果尝试多次仍然重启不来,就会给我发送邮件通知。
7.---------redis宕机之后数据会失效吗?-------------
8.---------Session共享的解决方案-------------
1.spring-session+redis(最为靠谱)
2.使用token重写session
3.存放在数据库中,每次查询的时候访问数据库(浪费资源)
4.nginx情况下,使用路由的ip绑定策略(无法减轻单台服务器的压力)
5.tomcat配置session共享(占用资源,配置麻烦)
6.使用cookie(不安全)