服务器_数据缓存与持久化(MySQL,Hibernate,MongoDB,Memcache,Redis)

数据存储

数据缓存方式

  • 使用Java自身的内存(List,Map等)或第三方的缓存中间件(如Memcache ,Redis),都是内存数据库,数据操作都在内存中,常用于第三方的缓存中间件。Memcache ,Redis 均提供多种语言实现,都是通过key-value键值对方式存储,但是Memcache存储的值仅仅支持string类型,而Redis支持五种类型,还提供定期回写数据到本地数据库,实现数据持久化。

数据持久化方式

使用关系型数据库MySQL,NoSQL 数据库Mongo或带本地持久化功能的内存数据库Redis。

  • MySQL的关系型数据库拥有索引,事务,表关联,完整性约束条件,标准SQL语句等最完整的数据库类型。
  • NoSQL数据库概念,它灵活便捷,易扩展以及高效率。
  • Mongo,采用JSON的BSON数据格式进行存储,支持丰富的数据表达,索引和查询语言,以文档为单位。

MySQL

开源数据库管理系统,即RDBMS,使用结构化查询语言SQL,属于关系型数据库,以表的形式存储数据。
特点

  1. 开源免费
  2. 功能强大
  3. 使用标准的结构化查询语言SQL
  4. 可在多个平台运行,并支持多种语言
  5. 容量大,可自定义。

数据类型
MySQL支持三种数据类型 : 数字,日期时间,字符串

  • 数字类型
    • 整数 : tinyint smallint mediumint int bigint
    • 浮点数:float double real decimal
  • 日期和时间
    • date time datetime timestamp year
  • 字符串类型
    • 字符串:char varchar
    • 文本: tinytext text mediumtext longtext
    • 二进制: tinyblob blob mediumblob longblob 可存储图片视频
      使用
      除了SQL语言,还提供了很多丰富的函数,如DATE() ,NOW() SUM() 等聚集函数。
  • 登录 : 安装完MySQL客户端和服务端后,启动MYSQL服务 ,通过客户端输入命令 mysql -h 主机名 -u 用户名 -p
    • h: 本地可以是127.0.0.1 或localhost
    • u:登录的 用户名字
    • p:通知服务端将以密码形式登录,回车后输入密码
    • 登录成功出现 mysql>
  • 数据库操作
    • 创建数据库: create database 数据库名字 [其他选项], 如: create database binge character utf-8 (创建名为binge的数据库并指定编码格式)
    • 指定数据库:对一个数据库操作时,要指定数据库
      1. 登陆时指定 mysql -D 数据库名字
      2. 登录后用use指定,use 数据库名
    • 创建表 create table 表名{}
    • 插入数据 insert into 表名 (列属性) values (列属性值) insert into student (name,age) values (“binge”,12 )
    • 查询数据 select 列属性名 from 表名 查询条件 select name from student where age > 10;
    • 更新表操作 update 表名 set 列名= 新的值 where 更新条件 update student set name=“binge2” where name=“binge”
    • 删除表数据 delete from 表名称 where 删除条件 delete from student where age > 10;

Java使用MySQL
在Java中使用MySQL有JDBC-ODBC Bridge,JDBC+ mysql驱动,往上封装有Hibernate,ibatis MyBatis等。

  • JDBC 基础的数据库连接方式,主要有七个步骤:
    1. 加载驱动(Class.forName或者DriverManager.egistDriver)
    2. 指定连接字符串以及用户名密码等信息
    3. 建立数据库连接,得到Connection对象
    4. 获取数据库操作对象Statement
    5. 执行SQL语句
    6. 处理结果
    7. 关闭对象,释放连接资源

Hibernate

  • 基于Java的开源持久化中间件,对JDBC做了轻量级的封装,采用ORM映射机制。它负责实现Java对象和关系数据库之间的映射,把sql语句传给数据库,并把返回结果封装成对象。内部封装了JDBC访问数据库的操作,向上层应用提供面向对象的数据库访问API。以对象的形式操作数据,提高开发效率。
  • 是一款成熟的ORM框架,使用起来简单,需要提前配置好配置文件,初始化构建好Hibernate的SessionFactory。接着,利用SessonFactory获取操作的Session,就可以通过Session的API操作数据库了。

MongoDB

MongoDB是文档型数据库,具有高性能,开源特性,多种场景下可以替代传统的关系型数据库或键值存储方式。
特点

  • 文档存储
  • 可扩展性:可以横向扩展
  • 易查询
  • 安全

使用API
提供多种语言API ,Spring也提供Mongo的封装。

  • 实例化MOngo对象,配置所有连接条件
  • 通过getDB连接具体的数据库实例
  • getCollection方法获取数据库的具体的集合
  • 通过collection操作文档

使用Mongo
需要再学习

Memcache

一款内存数据库,分布式高速缓存系统。在应用服务器与数据库服务器之间添加一个缓存作为中间件是十分必要的。可以减少数据库服务器的压力,又提高访问速度。在内存中,Memcache在内存中用一张hash表存储各种格式的数据。
Memcache会把数据调到内存中,然后直接从内存中读取数据,提升读取的速度,分配给它的内存用完时,采用LRU算法,替换失效的数据再替换最近没有使用的数据。通常以deamon(守护线程)的方式运行再服务器中,等待客户端连接。

特点

  • 采用内存存储,读写快但不能持久化,对内存要求高,对CPU要求低。
  • 集中式cache : 避免了分布式传播的问题,但要提供可靠性则需要Cluster的工作,多个Memcache可以作为一个虚拟的Cluster,对它的操作像对Memcache的读写在性能差不多。
  • 采用分布式扩展的模式,将部署在一台服务器上的多个Memcache的服务端或部署在多个服务器上的Memcache服务端组合成虚拟的服务端,这对调用者是透明的,提高了单机器的内存利用率。
  • Socket通信
    虽然Memcache通常被放在内网作为cache使用,但是传输内容大小和序列化的问题还是要注意。
    Socket传输速率高,当前支持UDP和TCP模式,同时根据客户端的不同选择NIO同步或者异步调用,也要注意序列化所需的成本和带宽。类的序列化成本最高,如果只传输字符串则不用序列化,所以在Memcache中往往保存较小的内容。
  • 内存分配机制: Memcache支持的最大存储对象的大小是1MB,它的内存分配方式是基于性能考虑的,简单的内存分配更容易实现内存回收再分配,从而节省了对CPU的使用。
  • Cache机制:简单的cache机制,用户把内存存进去可以取出来,如果Key没有命中则告诉用户这个key没有对应的内容,可以去数据库取出来,当用户再外部数据源取得数据的时候,可以直接把内容存到cache,下一次再使用这个key就可以取到内容。同步数据有两种方式,修改之后立即更新cache中的内容立即生效。或者容许一个失效的时间后,到了时间的内容自动删除。

应用场景:

  • 小对象的缓存,如用户的Token,权限,session等
  • 小的静态资源缓存,如网站的首页
  • 数据库SQL结果集的缓存,对于数据库的负载有很大的缓解作用。
    应用结构
    传统的C/S结构,当应用服务器的请求数量多时,容易造成数据库服务器超负载。而应用了Memcache之后,它作为中间缓存,分担数据库的读取请求,实现读写分离,但是要有较好的同步策略。

Java中使用Memcache

Memcache的Java客户端有spymemcached,xmemcache,danga.Memcached。
danga.Memcached使用
通过SocketPool创建连接池连接Memcache,通过MemcacheClient使用API进行操作Memcache,MemcacheCRUD是对Memcache的封装(里面封装了Memcache的建立连接,增删查改等方法,并提供接口)。使得操作类更方便。

客户端使用要点

Memcache高效,稳定,高内存利用的等特点,作为内存数据库还既有读写速度块等特点,但是数据在内存中不可靠,要根据实际场景使用。

Redis

Redis是开源的内存数据库,比Memcache更先进的Key-value系统,是一套构建高性能和可扩展的应用服务器程序的完美方案

特点:

有与Memcache的相似之处,也有自己的特点:

  • 速度快: 运行在内存中,执行速度块,
  • 存储类型丰富: 存储系统由Key-value映射的字段组成,值的类型不限于字符串,还支持其他五种类型:
    • string:可存储任意内容,上限是512MB
    • list : 链表结构,提供pop,push,获取范围内的值等功能。
    • set 集合 : 无序, 无重复元素
    • sorted set :有序,每个元素关联一个score排序
    • hash: 字符串与字符串之间的映射。
  • 操作原子性: 所有的操作都是不可再分的原子性,保证多个客户端并发访问时获得到Redis服务器的值为最新值。
  • 持久化: 比Memcache多了数据持久化功能。,提供AOF和RDB两种持久化模式。
  • 应用场景丰富: 缓存,消息,队列(Redis原生支持订阅/发布),数据库。

Redis 的 持久化

提供AOF和RDB两种持久化模式。
AOF(Append Only File,只追加数据到文件)
Redis在执行过程中会把所有的写指令记录下来,当数据恢复时,再按照当时记录的顺序执行一遍,在redis.conf中添加appendonly yes 就能打开AOF文件功能,任何写操作进来就会追加到AOF文件末尾。
RDB(Redis Database)
该模式是在不同的时间点将Redis的数据快照存储到磁盘,Redis在持久化过程中,会把数据先写到临时文件中,之后再用临时文件替换上一次持久化好的文件。Redis会单独fork一个子进程进行持久化,而主进程是不会进行任何IO操作的,保证了在持久化的过程中保留Redis的性能。

Redis的主从复制

  • Redis提供了主从同步,也支持一主多从以及多级从结构。主从结构不仅可以备份数据到从服务器,更可以分但一部分主服务器的读操作,提高Redis的性能。主从同步是异步执行的,只需要在从服务器的redis.conf中加上slaveof msterip masterport命令,先启动服务器再启动从服务器,从服务器会根据主服务器的IP端口对主服务器发从同步命令,然后进行数据同步。
  • 多组主从同步及主从切换可以通过Redis Sentinet 进行管理,Sentinel能对Redis集群中的主服务器及从服务器进行管理,当主服务器,Sentinel可以自动切换到从服务器。

Java中使用Redis

Redis工具类封装了Redis对五种数据类型的增删查改等操作,使用方便。
单点Redis

  • 在class Redis 中, 直接实例化一个设置好参数的JedisPool对象,并通过Jedis获取Jedis对象来调用相应的API。
    集群服务器
  • 连接Sentinel集群,可以通过实例化SentinelPool获取Jedis对象调用相应的API。

总结

服务器开发中,数据的缓存或者持久化,需要一个高可用的方案保证服务器数据的稳定,不管选择的是Memcache还是Redis,是MYsql还是Mongo,根据应用场景采用合理可行的方案。

你可能感兴趣的:(服务器学习)