服務器_數據緩存與持久化(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,根據應用場景採用合理可行的方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章