MyBatis与Redis

一。MyBatis

    1.简介

① MyBatis是一个持久层框架,完成的是对数据库的访问和操作;(CRUD)
② 它解决了JDBC对数据库的操作与访问过程中存在的问题,是对原有JDBC技术的封装
③ MyBatis解决JDBC的问题
【1】虽然JDBC操作数据库的方式很直观,但其核心就是对于数据库的操作。多个方法间存在大量的冗余
【2】基于Java中面向对象的基本思想,所以我们会将查询出来的结果封装成一个对象,这一系列操作都需要手动完成;将对象和表单做一个映射关系,将一个个属性提取出来并赋值给对象,手动ORM映射;
【3】对于多个用户的相同查询操作,没有进行优化,这样会造成运行效率偏低(主要指缓存层Cache)
④ 以.xml配置文件的方式实现DAO接口去除其中冗余代码

    2.MyBatis运行原理与流程图

        ① 运行原理

            MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,获取一个SqlSession,配置和来源于两个地方,一处是配置文件,一处来源于Java代码的注解。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的CRUD操作和事务提交等,完成后关闭。

                

    3.MyBatis缓存

① 原理:

            将频繁查询的数据存储在硬盘中,作为缓存区;当客户端发送请求时,缓存区没有相应的结果,那么就进入数据库查询结果,先在缓存区中存储在返回给客户端,如果缓存区中有,那么就直接返回给客户端.

目的:较少与数据库的通信次数,提高程序的查询效率

缺点:成本高  不安全  缓存在实践张一丁只存储那些频繁查询的数据   以硬盘的空间换取程序运行的时间

        ② 注意事项:
    【1】 只有当SqlSession关闭时,数据才会存入缓存区
    【2】 脏数据问题:当缓存区中数据与数据库中数据不一致时,我们成缓存中的这一部分为脏数据
    【3】 MyBatis在进行事务提交时,会自动清空缓存

    【4】 在查询操作后一定要关闭SqlSession   增删改操作一定要控制事务

    4.$与#的区别
① #{} 是以?占位符的形式成成sql语句,然后在赋值,相当于调用了pstmt.setXXX()这个方法给sql语句中的条件赋值
    ${} 是以字符串拼接的形式来给sql语句赋值的(将sql语句拆分成多个字符串,将所要插入的值放入字符串拼接的部分,并将两部分sql语句连接起来)
② #{}替换的是值,不管输入什么内容都将其当做一个字符串看待 

    ${}替换的是字段  存在sql注入问题 

    5.事务的四个特性
① 原子性:同一事务的多条sql语句时不可分割的整体,都成功才成功,有一条失败则全部失败
② 一致性:事务开始前和事务结束后,数据库的数据保持一致
③ 隔离性:事务与事务之间相互独立,互不干涉

④ 持久性:事务执行后,对数据库的影响是永久的

    6.数据库的事务隔离级别
① 脏读:读未提交(事务锁)
一个事务读取了另一个事务没有提交的临时数据
② 不可重复读:读提交(行级锁)
一个事务中对相同的数据,进行多次读取,读取结果不一致
③ 幻影读:重复读(表级锁)
一个事务中对同一张表的多次查询,但结果不一致
④ 序列化

序列化是事务隔离级别最高的级别,在该模式下所有事务按顺序执行,可以避免以上三种情况

二。Redis

    1.简介
redis是一个基于内存的高性能的key value的NoSQL数据库,其中内部数据类型丰富,包括以下五种:
① List:有序可重复
② Set:无序不可重复
③ hash:存储键值对
④ String:所有key的类型
⑤ ZSet:可排序  按分排序  可做排行榜使用,使用ArrayList实现

2.什么是NoSQL(Not Only SQL)
① 关系型数据库(RDB):以表格的形式存储数据
② NoSQL类型数据库:不易表格的形式存储数据

3.NoSQL类型数据库的特点:
① Schemaless:弱结构化(忽略表格 行 列),表格式存储数据结构太过僵化
② In-Memory 内存型产品
③ 弱化事务(没有事务  事务简单):有事务会影响并发,弱化事务会提高系统运行效率
④ 适用于Cluster(集群)环境
⑤ 没有复杂的表连接查询操作:表连接的工作原理:拿a表的一条数据与b表的所有数据一一进行比对,运行效率低
⑥ 支持脚本编程语言(JavaScript  lua ...)
⑦ 常见的NOSQL产品
[1]Redis(key value)
[2]MongoDB(JSON)
[3]HBASE  存储列类型
[4]Cassandra  存储列类型 永远没有单节点故障

4.Redis的特点
① Redis是一个高性能的key value数据库
② 是一个基于内存的数据库产品
③ 内部数据类型丰富
④ 可持久化
⑤ 可用于订阅/发布 模型

5.Redis 与 Memcache的区别
① Redis是一个内存行数据库产品,而Mmcache是一个内存型缓存产品,Redis可以对内存中的数据进行持久化,而Memcache不行
② Redis不仅仅支持简单的key value类型的数据,同时还提供list,set,hash等数据结构存储
③ Redis支持数据的主从赋值,即集群环境下的数据备份
④ Redis支持数据的持久化,可以将内存中年的数据保存到磁盘中,重启的时候可以再次加载原有数据
⑤ Redis单个value最大限制是1GB,memcached只能保存1MB的数据

6.基础命令
① String类型
[1]flushall  :清空所有数据库中的所有key
flushdb  :清空当前数据库中的所有key
[2]keys *    :查询所有key
[3]get key    :取值
[4]set key value :存值
[5]msetnx key key :创建多个key
[6]mget key key :一次取多个值
[7]getset key value :获取原始值并设置新值
[8]strlen key :获取值长度
[9]append key value :追加值内容
[10]getrange key a b:截取value值,从a下标开始到b下标结束
[11]setnx key value :如果key不存在则创建,如果key存在则不创建
[12]decr key  :对数值类型的值-1
[13]decrby key x :对数值类型的值指定-x
[14]incr key  :对数值类型的值+1
[15]incrby key x :对数值类型的值指定+x
[16]incrbyfloat key y :对数值类型的值指定+y浮点数
[17]setex key x value :设置一个key的存活时间为x秒
[18]psetex key x value :设置一个key的存活时间为x毫秒
[19]mset key1 value1 key2 value2 :一次设置多个key value

② List类型(有序可重复)
[1]lpush key value :存值 每次将value存入下标0位置   类似压栈
[2]lrang key 0 -1  :从下标0开始获取到返回-1结束
[3]lpushx key value :向已存在key中存值
[4]rpush key value :存值
[5]rpushx key value :向已存在key中存值
[6]lpop key :返回并移除第一个元素
[7]rpop key :返回并移除最后一个元素
[8]lrange key a b :取值从下标a开始到下标b结束
[9]llen key :获取元素个数
[10]lset key x value:替换下标x位置的值
[12]lindex key x  :获取下标x位置的值
[13]lrem key x value:删除key中重复value的x个元素
[14]lrange key a b :截取从下标a开始到下标b结束
[15]linsert key before value1 value2:在value1之前插入value2

③ Set类型(无序不可重复)
[1]sadd key value :存值
[2]smembers key    :显示所有值
[3]scard key   :返回元素个数
[4]spop key   :随机获取一个元素 并移除
[5]sunion key1 key2 :查询key1和key2
[6]srem key value   :删除指定value
[7]srandmember key :随机返回一个元素
[8]sdiff key1 key2 :删除key1 key2共有的元素
[9]sinter key1 key2 :查询key1 key2共有的元素
[10]smove key1 value key2 :将key1中的一个value移动到key2中
[11]sismember key value :判断值是否存在

④ ZSet(可排序  按分排序  可做排行榜)
[1]zadd key n value :添加一个key 分数为n
[2]zcard key :返回元素个数
[3]zrange key a b :查询从下标a开始到下标b结束
   zrange key a -1 :查询从下标a开始到返回-1结束
[4]zrem key value   :移除
[5]zrank key value :查询指定value的下标
[6]zscore key value :查询指定value的分数
[7]zrangebyscore key x y :查询分数x到y之间的value
[8]zrevrank key value :倒序查询指定value的下标
[9]zincrby key x value :为指定value分数增加x

⑤ Hash(存储键值对)
[1]hset Key key value :在Key中存储一个键值对
[2]hget Key key :通过键取值
[3]hgetall Key  :查询所有键值对
[4]hdel Key key :通过key删除对应的键值对
[5]hexists Key key :判断Key中key是否存在
[6]hkeys Key :查询所有key
[7]hvals Key :查询所有value
[8]hmset Key key value key value:设置多个键值对
[9]hmget Key key1 key2 :获取多个key的值
[10]hsetnx key value :设置一个不存在的key的值
[11]hincrby Key key x :对数值类型的值指定+x

[12]hincrbyfloat Key key y :对数值类型的值指定+y浮点数

        7.Redis的持久化
Redis是一个支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到磁盘来保证持久化。
Redis支持两种持久化方式,一种是Snapshottiong(快照RDB)(默认),另一种是Append-Only File(缩写AOF)的方式
① RDB
【1】运行机制:在某个时间点保存一个完整的数据快照
【2】运行原理:
Redis是一个单进程的服务,通过fork产生子进程,父进程继续处理Client请求,子进程负责将快照写入临时文件中,子进程写完后,用临时文件替换原来的快照文件,然后子进程退出
② AOF
【1】 运行机制:直接将Redis的执行命令,直接写在log文件中
【2】运行原理:
Redis通过fork一个子进程,父进程继续处理Client请求,子进程把AOF内容写入缓冲区,子进程写完退出,父进程接收退出消息,将缓冲区AOF写入临时文件,临时文件重命名为appendonly.aof 原来文件被覆盖,整个过程完成
8.分布式缓存原理
 分布式缓存由服务端实现管理和控制,由多个客户端节点存储数据,可以进一步提高数据的读取速度。当我们要读取某个数据的时候会根据一致性哈希算法确定数据的存储和读取节点,通过对应的哈希值找到对应的节点,一致性哈希算法的好处在于节点个数发生变化时无需重新计算哈希值,保证数据存储或读取时间可以正确、快速的找到对应的节点、分布式缓存能够高性能的读取数据、能够动态的扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的界面管理,部署和维护都十分方便,一致性哈希算法是使用MD5与MurmurHash两种计算方式,计算hash值,通过java的TreeMap来模拟换装结构实现均匀分布

猜你喜欢

转载自blog.csdn.net/yongqi_wang/article/details/80469869