缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)

Posted ywb-articles

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)相关的知识,希望对你有一定的参考价值。

一.JVM内置缓存(值存放在JVM缓存中)

  我们可以先了解一下Cookie,Session,和Cache

    Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你。具体来说Cookie机制采用的是在客户端保持状态的方案(保存客户浏览器请求服务器页面的请求信息),而Session机制采用的是在服务器端保持状态的方案。

  Cookie存储的数据量受限制,不仅有大小限制,还有个数限制,因此不适合存放大数据。由于并非所有的浏览器都支持Cookie,数据将以明文的形式保存在客户端。

    Session:session一般用来保存每一个用户的专有信息,Session缓存信息保存在web服务器当中,并且Session缓存容易丢失,导致数据的不确定性。而且Session不适宜放大量信息,否则会导致服务器性能降低。

    Cache:Cache用于在Http请求期间保存页面或者数据,而且它的使用可以大大的提高整个应用程序的效率。它允许将频繁访问的服务器资源存储在内存中,当用户发出相同的请求后,服务器不是再次处理而是将Cache中保存的数据直接返回给用户,可以看出Cache节省的是时间—服务器处理时间。Cache实例是每一个应用程序专有的,其生命周期==该应用程序周期,应用程序重启将重新创建其实例。

  JVM的内置缓存:

    oscache:oscache 主要是对页面的缓存,可以整页或者指定网页某一部分缓存,同时指定它的过期时间,这样在此时间段里面访问的数据都是一样的

 

    ehcache:ehcache主要是对数据库访问的缓存,相同的查询语句只需查询一次数据库,从而提高了查询的速度,使用spring的AOP可以很容易实现这一功能

二.MyBatis和Hibernate缓存简单介绍   

  MyBatis一级缓存:MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。SqlSession对象被创建,一级缓存就存在了,如果Session对象关闭或调用清理方法,会导致缓存失效。缓存底层实现就是通过HashMap实现的。

  MyBatis二级缓存:mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper通常情况下有不同的namespace,就都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的。(MyBatis二级缓存默认使用的是oscache)

  Hibernate一级缓存:session提供了一级缓存的功能,默认总是有效的,应用保存持久化实体、修改持久化实体时,session不会立即将改变提交数据库,而是缓存在当前session,除非显示调用了session的flush()方法或通过close()方法关闭session。通过一级缓存,可以减少应用程序与数据库的交互,提高数据库访问性能。 

 

  Hibernate二级缓存:Hibernate二级缓存是SessionFactory级的缓存。 SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。(Hibernate二级缓存默认使用的是ehcache)

三.Redis缓存 (重点)

  简介:Redis缓存一般是在service层开启,如果缓存中有数据,请求就不用再进入dao层,也不用再次与数据库连接,能减轻服务器压力,提高性能。(查询内存比查询数据库效率更高)

  应用:

    分布式锁

    session共享

    token生成

    验证码

    ......

  Redis安装(Linux):

    1.在官网上下载Linux版本的Redis(链接https://redis.io/download)

    技术图片

    2.在Linux的/usr/local中创建redis文件夹mkdir redis(一般第三方软件放在/usr/local中),上传文件到该文件夹中(securityCRT中输入rz命令即可)

    3.解压文件,并进入解压后的文件夹中,执行make命令,完毕后可以查看该文件夹中的目录如下

      技术图片

    4.可以进入src文件夹中,执行./redis-server即可启动redis,例如(注意这种方式启动redis 使用的是默认配置)

      技术图片

    5.可以通过启动参数告诉redis使用指定配置文件来启动

./redis-server ../redis.conf

    6.修改redis.conf配置(先退出redis)

      找到redis.conf文件:

        1.注释以下绑定的主机地址 # bind 127.0.0.1

        2. daemonize设置为yes

        3.设置密码requirepass 123456

    7.再次启动redis(在src目录中可以通过后台启动方式 redis-cli -h host -p port -a password,如果不后台启动,会显示如步骤4的界面,就无法进行其他与redis无关的操作),例如:

./redis-cli -h 127.0.0.1 -p 6379 -a "123456"

     如果能ping通,则说明启动成功(这里可能是密码太简单了)

      技术图片

    8.远程连接redis (这里使用的是RedisClient),如下所示

     技术图片

  Redis基本数据类型:

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

以上是关于缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)的主要内容,如果未能解决你的问题,请参考以下文章

Redis

干货分享|精讲 MyBatis 缓存机制(下)

Mybatis学习总结——全局配置文件SQL映射文件动态SQL缓存机制

MyBatis缓存专题-一文彻底搞懂MyBatis一级缓存

MyBatis缓存专题-一文彻底搞懂MyBatis一级缓存

MyBatis学习总结——Mybatis缓存