首页 > 技术文章 > redis的使用(下)

scar1et 2019-11-25 10:08 原文

Jedis的使用?

  Jedis就是redis提供的Java客户端工具(在Java代码中,直接通过jedis就可以操作redis数据库)

  加载jedis依赖

  连接redis服务器(创建jedis对象;相当于jdbc的connection、mybatis的sqlsession)

  通过jedis对象中的方法完成redis的操作(jedis对象中的方法名和redis中的命令名是一样)

  把jedis封装成工具类:获取jedis对象;关闭jedis对象

  

  序列化:

    把Java对象转换成字节数据/json串

    通过commons-lang3提供的工具类/json解析工具

  反序列化

    把字节数组/json串转换为Java对象

redis作为缓存服务器

  A:缓存

    缓存就是一个内存区域

    缓存:把sql语句执行之后的结果存储在内存中;如果发送同样的sql语句获取数据,就直接从缓存中获取数据,而不去操作数据库

    缓存中不适应存储笔记重要的事务:比如财务

    缓存:是为了提高检索效率

    程序一旦执行了增删改操作,就会把缓存清空==》防止脏读

    

    mybaitis中提供了缓存支持

      一级缓存:sqlSession级别的缓存:用同一个sqlSession对象,执行多次相同的查询操作,第一次从数据库中获取数据,后面的多次从缓存中读取数据

      一次缓存是默认开启的

    

      二级缓存:sqlSessionFactory级别的缓存:用同一个sqlSessionFactory对象,获取到多个sqlSession,这多个sqlSession执行相同的查询操作,第一次从数据库中获取数据,后面的多次从缓存中获取数据

      1):要使用二级缓存,需要开启

  

    在mapper文件中指定要使用二级缓存

      

      2):sqlSession必须关闭掉,数据才会被缓存下拉

    

      3):一旦执行了增删改操作,缓存会被清空(flush)

      4):redis实现缓存

      mybatis默认是用缓存类PerpetualCache作缓存处理

  

      mybatis支持自定义缓存:可以写一个像PertualCache一样的类,作为mybatis的缓存类;在自定义缓存类中,操作redis完成缓存的处理

    

      为什么要使用redis作为mybatis的缓存工具?

      1):redis可以做到持久化

      2):redis支持集群环境:可以搭建专门的缓存服务器集群

    步骤:

      1):写一个缓存类,需要实现mybatis提供的缓存接口Cache

      2):实现里面的方法

         对比着PerpetualCache完成:把PerpetualCache放入到map中的数据,用redis完成

  

      3):把自定义的缓存类应用到映射文件中:

    

 redis集群环境下的session

  负载均衡集群环境,session数据会丢失

  解决这个问题:

    1):session replication(session 复制)

      TomcatA创建一个session,使用完毕之后,把session复制到tomcatB和tomcatC

      问题:内存的浪费,网络资源的浪费

    2):借助于cookie解决

      问题:安全的问题;cookie存储的数据是有限制的;中文的处理

    3):nginx的负载策略设置为IP粘着

      问题:有可能会造成数据丢失;有可能会造成负载不均衡

    3):借助于非关系数据库

      告诉集群中的所有的tomcat,session使用的时候,先到redis中获取;如果没有获取到自己创建;使用完毕之后,把session放入到redis中

    

    配置思路:

      1):把redis管理的tomcat的session的jar包放入到tomcat的lib目录下

      2):在tomcat的context.xml中配置:告诉tomcat要到哪个redis服务器中读取数据

      3):重新启动所有的tomcat

      4):测试:方法nginx

    具体配置:

    

 

redis的持久化机制

  redis可以自动持久化:自动把内存中的数据写入到磁盘文件;自动把磁盘文件中的内容恢复到内容。

  redis的持久化机制有两种:

    A:RDB机制

      Snapshoting(全本快照)

      默认的机制

      Snapshoting:全本快照:要做持久化,九八内存中的所有数据都写入到磁盘文件中,把磁盘文件中的原本内容替换掉

      持久化时机:

        1):关闭服务的时候

        2):程序员可以通过命令:主动持久化bgsave

        3):redis配置文件中配置的有持久化时机

    

    B:AOF机制

      AppendOnlyFile:以日志的方式作增量备份(把对redis进行增删改操作的命令以日志的方式追加到日志文件中)

      AOF机制,要使用需要开启

      

      如果开启了AOF机制,AOF机制和RDB机制同时存在;但是在恢复数据的时候,通过AOF机制恢复数据

    AOF的持久化时机:

    

     AOF使用中面对的一个问题?

      日志文件中有可能会存在对于恢复数据来说,没有任何意义的命令

      要解决这个问题,可以通过日志重做完成:根据内存中现有数据完成的日志文件的重做

      

    RDB机制切换为AOF机制,会造成数据丢失

    为什么会丢?RDB机制已经恢复了数据,此时新开机的AOF机制里面日志文件是空白,所以会造成数据丢失。

    怎么解决:热切换,在RDB机制正常使用的时候,通过命令把AOF机制启用

    config set appendonly yes

    

推荐阅读