JAVA的缓存机制
-
Java中要用到的缓存的地方很多,首当其冲的就是持久层的缓存
要实现Java的缓存有很多的方式,最简单的就是static hashMap,这个内存的实现是基于Java的内存缓存,这种方式虽然简单但是却不是很实用,因为static HashMap的周期我们是不能控制的,这样就会导致内存的上升,因此我们也可以使用Java提供的弱引用集合来充当Java的缓存。弱引用就是对象的声明周期与JVM是挂钩的,JVM内存不够的时候就会对弱引用进行回收 -
除此之外我们可以用一些第三方的JAVA内存缓存插件来进行编码
OsCache与EsCache区别
- OsCache :
页面级别缓存,占用本机的内存资源,可以选择缓存到硬盘,如存取到硬盘重启服务也可以重新获得上次持久化的资源,如果存取到缓存就不行了。一般情况下也没有必要将其缓存到硬盘当中,因为IO操作也是比较消耗资源的。Oscache存取数据的作用域分为application和session两种
其实MyBatis的缓存机制
- EhCache :
Hibernate的缓存,DAO缓存,安全性凭证缓存,WEB缓存,应用持久化和分布式缓存。
-
jvm的内置缓存,值存放在jvm当中。
-
myBatis和Hibernate的二级缓存机制
(1)mybais的二级缓存机制是oscache
(2)hibernate的二级缓存机制是ehcache
oscache和ehcache是jvm的内置缓存 -
oscache与ehcache的区别:
(1)oscache主要针对的是数据库的访问层
(2)ehcache主要针对的是jsp页面的缓存 -
JVM缓存的缺点
(1)内存溢出
(2)没有持久化
(3)线程不安全
(4)多服务器数据集不能共享
NOSQL
NoSQL是非关系型数据库,以key-value的形式对其进行存储。
NoSQL有redis,mongodb(存储的是json的数据结构), membase,HBase
Redis和Membase的区别
- Redis支持数据的持久化,可以将数据存放在硬盘上
- Memcache不支持数据的持久化存储
- Redis数据类型丰富,有常用的5中数据类型
- Memcache支持简单的数据类型,需要客户端自己来处理复杂的对象
Redis的简介
- Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库
- Redis与其他的key-value缓存产品有以下三个特点
(1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘当中,重启的时候可以再次进行加载进行使用
(2)Redis不仅支持简单的key-value数据类型,同时还提供了list,set,zset,hash,string常用的几种数据存储结构
(3)Redis支持数据的备份,即master-slave模式
主要可以用来减轻数据库的访问的压力,例如:短信验证码的时间有效期,session共享解决方案
(1)性能高,redis的读的速度是110000次/s,写的速度是81000次/s
(2)丰富的数据类型,redis支持二进制案例的string,list,hash,set,zset数据类型操作
(3)原子性,redis的所有操作都是原子性的,数据安全,都是单线程
(4)丰富的特性,redis还支持发布订阅的模式,但是这个不常用,一般我们经常使用消息队列而不是redis的发布订阅
- redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构,无需进行额外的抽象
- Redis运行在内存中,但是可以持久化到磁盘,所以在对不同的数据集进行高速读写的时候需要权衡内存,因为数据量不能大于硬件内存。
安装redis
-
下载windows上的redis的安装包,并且进行解压。
-
这里最重要的文件是redis-server.exe 和 redis.windows.conf(该文件是用来配置redis的相关操作)
我们修改密码的时候直接在redis.windows.conf中修改即可。 -
新增start.bat脚本文件,里面将上述两个文件的文件名写入
redis-server.exe redis.windows.conf
- 启动的时候,直接点击start.bat即可。
- 下载redis的linux的源码包:http://redis.io/download
- 将安装包放到linux上的一个合适的目录中
- 解压缩 tar -zxvf redis-2.6.17.tar.gz ,进入解压后的目录中cd redis-2.6.17
- 进行编译 make
(1)这里需要gcc的支持,如果没有,需要先安装gcc。可以使用rpm -q gcc查看gcc是否安装完成
(2)利用yum在线安装gcc的命令,yum -y install gcc
(3)如果编译出错,使用make clean清除临时文件,找出原因重新安装 - 进入src目录 cd src
- 执行安装 make install
此时我们的环境基本上就已经安装完毕了。我们要想改配置可以在redis.conf中进行修改,运行的时候输入src/redis-server redis.conf即可
(1)修改redis.conf文件
daemonize yes ---- 修改为yes,后台启动
requirepass 123456 ------ 修改并设置密码
(2)常用redis的命令
ps aux | grep '6379' --- 查询端口
kill -15 PID ---- 杀死重置
kill -9 PID -----强制杀死
./redis-cli -h ip -p port -a '密码' ---redis使用账号密码链接
redis -cli shutdown 或者 kill redis进程的pid ----关闭redis
注意如果我们要通过外部链接redis,一定要关闭linux的防火墙
这里我们不介绍redis的基本数据类型以及jedis的使用,和springboot的使用我在之前的博客中已经写过,所以这里也不再详细介绍
redis的主从复制
准备工作,我们可以进行虚拟机的clone,并启动三台redis作为准备工作。虚拟机的clone不是我们的重点,这里我们也不详细论述
概述
- redis的赋值功能是支持多个数据库之间的数据同步,一类是主数据库(master),一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候,自动将数据库同步到从数据库,而从数据库一般是只读的,不能够进行写的相关操作,从数据库接受并同步主数据库同步来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库
- 通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库主要进行读操作。
- redis只支持一主多从,不存在多主多从,Nginx是支持多主的。
上面就是主从复制的大体过程:
(1)当一个从数据库启动的时候会向主数据库发送sync命令
(2)当主数据库接收到sync命令之后,开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来
(3)快照完成后,redis会将快照和所有的缓存命令发送给从数据库
(4)当从数据库接受到快照和缓存命令后,会载入快照文件并执行缓存的命令。
配置redis的主从复制
修改slave从redis中的redis.conf文件,只修改redis的从机配置,不修改主机的配置
- 打开redis.conf文件
slaveof 主机IP 主redis端口号
--- 如果主redis的服务器配置了密码,则需要修改配置
masterauth 主redis的密码
启动的时候需要加上配置文件进行启动
主从复制的补充知识点说明
- 什么是主从复制
主从复制,就是主机数据更新之后根据配置和策略,自动同步到备机的master/slave机制,master以写为主,slave以读为主
- 用处
- 读写分离
(1)主机用来写,从机用来读
(2)一主多从,主机必须只能有一台,从机需要有多台,主机有多台的话多台机子同时写会出错- 容灾的快速恢复
- info replication
该命令可以查看当前的机子是主机还是从机
- 注意事项
- 配从不配主
- 从机会拿到主机上的所有数据,即使是建立主从关系之前的数据
- 从机不能够写
- 如果主从关系确定后,主机down机
(1)从机的身份还是从机,不允许写
(2)主机恢复了之后,主从关系依旧,没有发生变化- 如果主从关系确定后,从机down机
(1)主机不受任何影响,该怎么样还是怎么样
(2)从机重新恢复之后,从机不再是从机,主从关系不在
原因是:
1 因为slaveof 主机IP 端口号 这个命令如果没有在redis.conf中配置,其只会在内存中生效,down机之后恢复不再有效
2 若想在down机之后,从机上线了还是从机,将slaveof的命令直接写到配置文件中(这里就是这么做的)
- 一主二仆模式:
我们上面使用的就是一主二仆模式,从机的主机都是同一台服务器
- 薪火相传模式:
- 上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,一个slave作为链条中下一个slave的master,可以有效的减轻master的写压力,去中心化降低风险
- 中途变更转向
(1)会清除之前的数据,重新建立拷贝最新的- 风险是一旦slave发生down机,后面的slave就没有办法备份了
- 这里的所有的机子变成了即是从机又是主机,这样的机子依然不允许写操作,只要有从机的角色就是不允许写操作的
- 如果主机down机了。down机主机后面的从机反客为主,变为主机
(1)当一个master发生了down机之后,后面的slave可以立刻升级为master,其后面的slave不用做任何的修改
(2)用slaveof no one 将其从机变为主机
redis的哨兵机制
Redis的哨兵系统用于管理多个redis的服务器,该系统执行以下三个任务
- 监控:哨兵会不断地用心跳机制检查你的master和slave是否是正常运行
- 提醒:当被监控的某个redis出现了问题的时候,哨兵可以通过API向管理员或者其他应用程序发送通知
- 自动故障迁移:当一个master不能正常工作的时候,哨兵会开始进行一次故障迁移操作,他会将失效Master的其中一个Slave升级为新的Master,并让失效的Master的其他slave改为复制新的Master;当客户端试图连接失效的Master的时候,集群就会向客户端返回新的master的地址,是的集群可以使用新的Master代替失效的Master。
- 哨兵是一个分布式系统,你可以在一个架构中运行多个哨兵进程,这些进程用留言协议来接受关于Master是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个Slave作为新的master
- 每个哨兵回想其他的哨兵,master,slave定时发送消息,确认对方是否还活着,如果发现对方在指定的时间内未回应,则暂时认为对方down机(主观down机 sdown)
- 若哨兵群中的多数哨兵,都报告某一个master没有响应,系统才认为该master彻底死亡(即客观down机 odown),此时就会通过一定的vote算法,从剩下的slave节点中,选一台提升为master。然后自动修改相关的配置。
哨兵模式的配置
- 将配置暂时定为一主二仆的模式
- 自定义配置文件sentinel.conf
- 修改该配置文件
(1)sentinel monitor mymaster IP地址 端口号 选举次数
eg. sentinel monitor mymaster 127.0.0.1 6379 1
(1)卸载slave中,监控主机
(2)其中mymaster是为监控对象起的服务器的名字,1位至少有1个哨兵同意迁移(哨兵通常不止一个)
(3)sentinel monitor是关键字
(4)127.0.0.1是监控的主机
(2)slave-priority XXX
(1)XXX是一个数字,该命令是用来设置优先级的
(2)优先级越小,越容易切换成master
哨兵模式的故障恢复
- 从下线的主服务的所有从服务中选取一个服务,将其切换成主服务
- 挑选出新的主服务之后,sentinel向原主服务的从服务发送slaveof新主服务的命令。复制新的master
- 当已经下线的服务重新上线的时候,sentinel会向其他发送slaveof命令,让其成为新的从机,而不是主机
spring的事务
spring的事务机制以及常用的spring的操作:https://blog.csdn.net/u014437791/article/details/90672092
springboot中常用的事务操作:https://blog.csdn.net/u014437791/article/details/90600614
上面这两篇文章是自己原来总结的,可以看看
Redis的持久化机制
Redis的持久化机制分为两种:RDB和AOF
RDB
- 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,他恢复的时候是将快照文件直接读到内存中。
- 备份是如何进行的?
- 首先RDB是全盘备份,备份后的数据文件直接替换掉之前的文件
- redis会单独创建一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化完成了,在用这个临时文件替换掉上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模的数据的恢复,且对于数据恢复的完整性不是非常敏感,那么RDB的方式要不AOF更加的高效。
- RDB的缺点是最后一次持久化后的数据可能会丢失
- 如何配置RDB存储?
- 在redis.conf中对其进行配置
- dbfilename dump.rdb
(1)表示备份的文件名叫做dump.rdb- dir ./
(1)表示备份到运行redis的当前路径(在什么地方敲redis-server,就指的是哪里)
(2)一般情况下需要对其进行修改,将其修改为一个固定的路径 如 dir “/myredis”- 保存策略
(1)save 900 1
表示的是在900s以后且至少一个键值被改变,就会触发存盘
(2)save 300 10
表示在300s以后至少有10个键值被改变,就会触发存盘
(3)save 60 10000
表示在60s之后至少有10000个键值被改变,就会触发存盘操作
(4)上面的这些时间都是从redis的服务器启动的时候开始计时的,每次服务器启动的时候就会先读取dump文件,将其持久化的内容先读出来
(5)stop-writes-on-bgsave-error yes
表示的是后台存盘操作发生错误的时候就停止写操作。- 注意,千万不要同时使用flushall和shutdown操作
(1)flushall表示将内存中的redis的key全部清除掉
(2)shutdown表示服务器关闭,这时候系统自动存盘,但是这时候存盘会将flushall也记录进去,所以在此启动的时候依然没有数据,因为会调用flushall命令
(3)kill和断电的时候是不会进行持久化操作的- save
该命令相当于是手动进行存盘,执行该命令后会将命令进行存盘,该操作会阻塞,如果save操作没有执行完,将阻塞后续的操作,应该谨慎使用- RDB的缺点
(1)虽然redis在fork的时候使用了写时拷贝技术(就是进程共享内存),但是如果数据庞大的时候还是比较消耗性能
(2)备份周期在一定的时间间隔做一次备份,所以如果redis意外down掉的话,就会失去最后一次快照后的所有修改- RDB的优点:
(1)节省磁盘空间(会对命令进行相关处理,所以我们的备份文件通常是看不懂的,但是AOF就可以)
(2)恢复速度快
AOF
- append only file
- 以日志的形式记录每一个写操作,将redis执行的所有的写的指令记录下来,只允许追加文件,但是不可以改写文件,redis启动的时候会读取该文件重新构建数据,换言之,redis重启的话就会根据日志文件的内容将写指令从前到后执行一次完成数据的恢复工作。因此相对而言恢复速度比RDB慢,且数据过大的时候,该日志文件过大,磁盘占用空间大。
- 如何配置?
- 在redis.conf中配置
- AOF默认是不开启的
- appendonly no
(1)表示的是关闭AOF的操作- appendfilename ‘XXXX.file’
(1)表示的是备份的文件叫做XXX.file
- rewrite
AOF采用文件追加的方式,文件会越来越大,为了避免出现这种情况。新增了重写机制,当AOF文件的大小超过了所设定的阈值的时候,Redis就会启动AOF的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof
好比:a + 1 a+1 a + 1 ===> a + 3
- AOF的优点:
- 备份机制更加稳定,丢失数据的概率更低
- 可读的日志文本,通过操作AOF文件,可以处理事务操作,直接打开日志,将失误操作删除
- AOF的缺点:
- 比起RDB占用更多的磁盘空间
- 恢复备份的速度慢
- 每次读写都同步的话,有一定的性能压力
注意:
- 同时开启了AOF和RDB的时候,若两个数据备份不一致,则AOF的优先级高,因为AOF数据更准确,日志密度高
- 官方推荐两个都使用
- 如果对数据不敏感可以单独使用RDB
- 不建议单独使用AOF,会有bug
- 如果是只用redis做缓存,可以都不使用