设为首页 加入收藏

TOP

数据库缓存mybatis,redis(一)
2019-09-17 16:48:40 】 浏览:87
Tags:数据库 mybatis redis
  • 简介

    处理并发问题的重点不在于你的设计是怎样的,而在于你要评估你的并发,并在并发范围内处理。
    你预估你的并发是多少,然后测试r+m是否支持。缓存的目的是为了应对普通对象数据库的读写限制,依托与nosql的优势进行高速读写。

    redis本身也有并发瓶颈。所以你要把读写和并发区分开来处理。只读业务是不是可以用mysql分布做只读库和只读表,进行读写分离+库分布,
    拆库拆表不能搞定再考虑上多级缓存
    任何设计,你外面套一层,就多一倍的维护成本,缓存不是万金油。

    这里多级缓存主要指的是二级缓存技术,也就是依托nosql的高速读取优势。

  • mybatis

    如果底层ORM框架用的是mybatis框架,就可以用mybatis自带的缓存机制,mybatis自带一级缓存和二级缓存。
    一级缓存指的是sqlsession缓存,是session级别缓存
    二级缓存指的是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的,这里的namespace指的是xml里的命名空间
    mybatis默认开启一级缓存,二级缓存默认不开启,需要手动开启。

    一级缓存
    mybatis的一级缓存是SqlSession级别的缓存,在操作数据库的时候需要先创建SqlSession会话对象,在对象中有一个HashMap用于存储缓存数据,
    此HashMap是当前会话对象私有的,别的SqlSession会话对象无法访问。
    具体流程:

          1.第一次执行select完毕会将查到的数据写入SqlSession内的HashMap中缓存起来

          2.第二次执行select会从缓存中查数据,如果select相同切传参数一样,那么就能从缓存中返回数据,不用去数据库了,从而提高了效率

      注意事项:

          1.如果SqlSession执行了DML操作(insert、update、delete),并commit了,那么mybatis就会清空当前SqlSession缓存中的所有缓存数据,
    这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读

          2.当一个SqlSession结束后那么他里面的一级缓存也就不存在了,mybatis默认是开启一级缓存,不需要配置

          3.mybatis的缓存是基于[namespace:sql语句:参数]来进行缓存的,意思就是,SqlSession的HashMap存储缓存数据时,
    是使用[namespace:sql:参数]作为key,查询返回的语句作为value保存的。
    例如:-1242243203:1146242777:winclpt.bean.userMapper.getUser:0:2147483647:select * from user where id=?:19

    二级缓存
    二级缓存是mapper级别的缓存,也就是同一个namespace的mappe.xml,当多个SqlSession使用同一个Mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域

    二级缓存默认是没有开启的,需要在xml配置setting全局参数中配置开启二级缓存

    <settings>
            <setting name="cacheEnabled" value="true"/><!--开启mybatis缓存 默认是false:关闭二级缓存--><settings>

    然后再具体的xml里配置

    <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>当前mapper下所有语句开启二级缓存

    这里配置了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而却返回的对象是只读的

    若想禁用当前select语句的二级缓存,添加useCache="false"修改如下:

    <select id="getCountByName" parameterType="java.util.Map" resultType="INTEGER" statementType="CALLABLE" useCache="false">

    具体流程:

          1.当一个sqlseesion执行了一次select后,在关闭此session的时候,会将查询结果缓存到二级缓存

          2.当另一个sqlsession执行select时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,
    找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能 

    注意事项:

          1.如果SqlSession执行了DML操作(insert、update、delete),并commit了,那么mybatis就会清空当前mapper缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读

          2.mybatis的缓存是基于[namespace:sql语句:参数]来进行缓存的,意思就是,SqlSession的HashMap存储缓存数据时,是使用[namespace:sql:参数]作为key,查询返回的语句作为value保存的。例如:-1242243203:1146242777:winclpt.bean.userMapper.getUser:0:2147483647:select * from user where id=?:19

  • redis

    这里我实现了spring集成Jedis,并通过解析key实现自定义缓存失效时间。官网可以下载linux下的redis,没有windows下的,但micro开发小组在github上维护了windows环境下的redis,
    https://github.com/MSOpenTech/redis/releases

    pom.xml引入依赖
      <!--redis start-->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>1.6.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.7.3</version>
            </dependency>
     <!--redis end-->

    在xml配置文件里配置各种bean

     <!--JedisPool线程池-->
        <!--redis是单线程的,为了满足java多线程需求,jedis引入线程池的概念-->
        <bea
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇完了!生产事故!几百万消息在消.. 下一篇Nginx实现负载均衡功能

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目