當前位置:首頁 » 文件管理 » 本地持久化緩存

本地持久化緩存

發布時間: 2022-10-15 05:07:32

1. 如何從持久化存儲中讀取數據

對於數據的持久化存儲,ios中一般提供了4種不同的機制。
1.屬性列表
2.對象歸檔
3.資料庫存儲(sqlite3)
4.蘋果公司提供的持久性工具Core Data。
其實儲存的形式無非就這么幾種,而我們還必須要關心的是,這些文件會被放置在那個文件下,然後如何讀取。
也就是說:IOS上數據存儲,我們要了解的兩點,數據存儲格式(也就是存儲機制),數據存儲位置。
1》文件如何存儲(如上面4點)
2》文件存儲在哪裡。
對於數據的操作,其實我們關心的是操作的速率。
就好比在Adnroid中偏好存儲,資料庫存儲,io存儲一樣。

2. 什麼是數據持久化為什麼要持久化

數據持久化就是將內存中的數據模型轉換為存儲模型,以及將存儲模型轉換為內存中的數據模型的統稱. 數據模型可以是任何數據結構或對象模型,存儲模型可以是關系模型、XML、二進制流等。cmp和Hibernate只是對象模型到關系模型之間轉換的不同實現。

數據持久化對象的基本操作有:保存、更新、刪除、查詢等。

Hibernate框架中數據持久化機制:

在業務程序與資料庫之間,Hibernate框架使用Session會話,來完成數據的提交、更新、刪除、查詢等等。

1、向資料庫提交數據

在程序中保存對象時,會把數據保存到Session會話中,然後根據框架的配置文件,自動或手動決定什麼時候把這種保存提交到資料庫。

2、從資料庫中查詢數據

在查詢數據之前,需要清理緩存(手動清理,或者通過配置文件框架自動清理)清理緩存的目的是為了使Session會話中的數據與資料庫中的數據保持一致。然後程序只需要查詢Session會話中的數據即可。

(2)本地持久化緩存擴展閱讀:

使用數據持久化有以下好處:

1、程序代碼重用性強,即使更換資料庫,只需要更改配置文件,不必重寫程序代碼。

2、業務邏輯代碼可讀性強,在代碼中不會有大量的SQL語言,提高程序的可讀性。

3、持久化技術可以自動優化,以減少對資料庫的訪問量,提高程序運行效率。

3. java web開發緩存方案,ehcache和redis哪個更好

這里就不再逐個討論了,我將會在一個實際應用程序開發場景中介紹其中的一些。使用Redis作為一個緩存解決方案我之前提到過,Redis可輕易地用作一個緩存解決方案,碰巧我現在正好需要這樣一個!在該應用程序示例中,我將Redis集成到我基於定位的移動Web服務中,稱之為Magnus。如果您沒有關注本系列,那麼我會先使用Play框架實現Magnus,從那時起我就已經在各種實現中開發和重構它了。Magnus是一個簡單服務,可以通過HTTPPUT請求使用JSON文檔。這些文檔描述了特定帳號的位置,表示持有移動設備的人。現在,我想要將緩存集成到Magnus,也就是說我想要通過將不常更改的數據存儲在內存中以減少I/O流量。Magnus緩存!在清單5中的第一步中,可以通過get調用了解新引入的帳戶名稱(一個鍵)是否為REdis中的一個鍵。get調用可以將帳戶ID作為一個值返回,或者將返回null。如果返回一個值,我將用其作為我的acctId變數。如果返回的是null(表明該帳戶名稱不是Redis中一個鍵),那麼我將在MongoDB查找該帳戶值,並通過set命令將其添加到Redis。這里的優勢是速度:接下來,被請求的帳戶將提交一個位置,這樣我就能夠從Redis中獲取其ID(作為內存緩存),而不是轉到MongoDB並帶來額外讀取I/O成本。清單5.使用Redis作為內存緩存"/location/:account"{put{defjacksonMapper=newObjectMapper()defjson=jacksonMapper.readValue(request.contentText,Map.class)defformatter=newSimpleDateFormat("dd-MM-yyyyHH:mm")defdt=formatter.parse(json['timestamp'])defres=[:]try{defjedis=pool.getResource()defacctId=jedis.get(request.parameters['account'])if(!acctId){defacct=Account.findByName(request.parameters['account'])jedis.set(request.parameters['account'],acct.id.toString())acctId=acct.id}pool.returnResource(jedis)newLocation(acctId.toString(),dt,json['latitude'].doubleValue(),json['longitude'].doubleValue()).save()res['status']='success'}catch(exp){res['status']="error${exp.message}"}response.json=jacksonMapper.writeValueAsString(res)}}注意,清單5中的aMagnus實現(使用Groovy編寫)仍然使用一個NoSQL實現作為數據模型存儲;它僅僅使用Redis作為一個緩存實現用於查詢數據。因為我的主要帳戶數據位於MongoDB中(事實上,它駐留在MongoHQ.com中),而我的Redis數據存儲在本地運行。在隨後查找帳戶ID時,Magnus速度將顯著提升。可是等等!我為什麼同時需要MongoDB和Redis?難道我就不能單獨使用一個嗎?ORM的Node.js很多項目均提供ORM類映射用於Redis,其中包括一個極富影響力的基於Ruby的備用方案,稱為Ohm。我檢查了該項目基於Java的派生產品(稱為JOhm),但是最終決定使用一個為Node編寫的派生產品。Ohm及其派生項目的妙處在於他們允許您將一個對象模型映射到一個基於Redis的數據結構。因此,您的模型對象是持久性的,同時在大多數情況下其讀取速度也非常之快。有了Nohm,我便能夠使用JavaScript快速重寫我的Magnus應用程序並能立即持久化Location對象。在清單6中,我已定義了一個Location模型,該模型包括3個屬性。(注意,我通過將timestamp設置為一個字元串而不是一個真實的時間戳,從而簡化我的示例。)清單6.Node.js中的RedisORMvarLocation=nohm.model('Location',{properties:{latitude:{type:'float',unique:false,validations:[['notEmpty']]},longitude:{type:'float',unique:false,validations:[['notEmpty']]},timestamp:{type:'string',unique:false,validations:[['notEmpty']]}}});Node的Express框架使NohmLocation對象的使用變得十分簡單。在我的應用程序PUT實現中,我可以捕獲正在進入的JSON值,並通過Nohm的p調用將其導入到一個Location實例。然後我再檢查該示例是否有效,如果有效,我會對其進行持久化。清單7.在Node的Express.js中使用Nohmapp.put('/',function(req,res){res.contentType('json');varlocation=newLocation;location.p("timestamp",req.body.timestamp);location.p("latitude",req.body.latitude);location.p("longitude",req.body.longitude);if(location.valid()){location.save(function(err){if(!err){res.send(JSON.stringify({status:"success"}));}else{res.send(JSON.stringify({status:location.errors}));}});}else{res.send(JSON.stringify({status:location.errors}));}});正如清單7所示,可以輕易地將Redis構建成一個極其快速的內存數據存儲。在一些案例中,它甚至是一個比memcached更好的緩存!結束語Redis對於許多數據存儲場景非常有用,因為它可以將數據持久化到磁碟(還因為它支持一個豐富的數據集),有時候,它是memcached的有力競爭對手。有些情況下,對於您的領域也是很有意義的,您可以使用Redis作為數據模型和隊列的一個備份存儲。Redis客戶端實現幾乎可被移植到任何編程語言中。Redis不是RDMBS的完全替代品,也不是一個重量級存儲,但是和MongoDB一樣擁有豐富的功能。然而,在很多情況下,它可與這些技術共存。

4. 如何從持久化存儲中讀取數據

MySQL 8 之前,使用的動態變數不是永久性的,並且在重啟後會重置。可在運行時使用 SET 語句更改這些變數,以影響當前實例的操作,但是我們必須手動更新 my.cnf 配置文件以使其持久化。
在許多情況下,從服務端更新 my.cnf 並不是一個方便的選擇,並且使變數僅被更新才能在後續重新啟動時動態還原,而沒有任何歷史記錄。
持久化系統變數是 MySQL 8 中引入的功能之一。新功能可幫助 DBA 動態更新變數並注冊它們,而無需從伺服器端訪問配置文件。

如何持久化全局系統變數?
與 SET GLOBAL 一樣,SET PERSIST 是可用於在運行時更新系統變數並使它們在重新啟動後保持不變的命令。當我們使用 PERSIST 關鍵字時,變數更改將更新到數據目錄中的 mysqld-auto.cnf 選項文件。mysqld-auto.cnf 是僅在第一次執行 PERSIST 或 PERSIST_ONLY 語句時創建的 JSON 格式文件。

5. 緩存與數據持久化有什麼區別

持久化就是找個地方存緩存里的數據,以後需要的時候在從這個地方讀到緩存里。 查看原帖>>

6. ios緩存跟持久化是一個意思嗎

數據的持久化本質上都是就是寫文件,但從邏輯上又分成很多種,比如寫入沙盒(其實是一個本應用程序才可以訪問的路徑),比如存到網路上,比如寫入資料庫。 你的問題問的是資料庫相關,那麼針對它討論, Core data與sqlite還是有聯系的,core data 是對sqlite的封裝,因為sqlite是c語言的api,然而有人也需要obj-c 的api,所以有了 core data 另外,core data不僅僅是把c的api翻譯成oc 的api,還提供了一些管理的功能,使用更加方便。

7. Redis 持久化 ★

1、RDB
2、AOF
3、兩種的使用場景

在指定的時間間隔內將內存中的數據集快照寫入磁碟, 也就是行話講的Snapshot快照,它恢復時是將快照文件直接讀到內存里

Redis會單獨創建(fork)一個子進程來進行持久化,會先將數據寫入到 一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。 整個過程中,主進程是不進行任何IO操作的,這就確保了極高的性能 如果需要進行大規模數據的恢復,且對於數據恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的數據可能丟失。

(1)Fork的作用是復制一個與當前進程一樣的進程。新進程的所有數據(變數、環境變數、程序計數器等) 數值都和原進程一致,但是是一個全新的進程,並作為原進程的子進程
(2)在Linux程序中,fork()會產生一個和父進程完全相同的子進程,但子進程在此後多會exec系統調用,出於效率考慮,Linux中引入了「寫時復制技術」
(3)一般情況父進程和子進程會共用同一段物理內存,只有進程空間的各段的內容要發生變化時,才會將父進程的內容復制一份給子進程。

在redis.conf中配置文件名稱,默認為mp.rdb

rdb文件的保存路徑,也可以修改。默認為Redis啟動時命令行所在的目錄下
dir "/myredis/"

dir ./ 表示在當前配置文件的文件夾下生成 .rdb文件

(1)配置文件中默認的快照配置

(2)命令save VS bgsave
save :save時只管保存,其它不管,全部阻塞。手動保存。不建議。
bgsave:Redis會在後台非同步進行快照操作, 快照同時還可以響應客戶端請求。
可以通過lastsave 命令獲取最後一次成功執行快照的時間

(3)save(禁用)
格式:save 秒鍾 寫操作次數
RDB是整個內存的壓縮過的Snapshot,RDB的數據結構,可以配置復合的快照觸發條件,
默認是1分鍾內改了1萬次,或5分鍾內改了10次,或15分鍾內改了1次。(短時間內越多越快)

不設置save指令,或者給save傳入空字元串

(4)stop-writes-on-bgsave-error
如果配置成no,表示你不在乎數據不一致或者有其他的手段發現和控制

(5)rdbcompression 壓縮文件
對於存儲到磁碟中的快照,可以設置是否進行壓縮存儲。如果是的話,redis會採用LZF演算法進行壓縮。如果你不想消耗CPU來進行壓縮的話,可以設置為關閉此功能:

(6)rdbchecksum
在存儲快照後,還可以讓redis使用CRC64演算法來進行數據校驗,但是這樣做會增加大約10%的性能消耗,如果希望獲取到最大的性能提升,可以關閉此功能:

(7)rdb的備份

1)將備份文件 (mp.rdb) 移動到 redis 安裝目錄並啟動服務即可

2)CONFIG GET dir獲取目錄

(1)優點:
適合大規模的數據恢復
對數據完整性和一致性要求不高更適合使用
節省磁碟空間
恢復速度快

(2)缺點:
Fork的時候,內存中的數據被克隆了一份,大致2倍的膨脹性需要考慮
雖然Redis在fork時使用了寫時拷貝技術,但是如果數據龐大時還是比較消耗性能。
在備份周期在一定間隔時間做一次備份,所以如果Redis意外down掉的話,就會丟失最後一次快照後的所有修改。

以日誌的形式來記錄每個寫操作(增量保存),將Redis執行過的所有寫指令記錄下來(讀操作不記錄), 只許追加文件但不可以改寫文件,redis啟動之初會讀取該文件重新構建數據,換言之,redis 重啟的話就根據日誌文件的內容將寫指令從前到後執行一次以完成數據的恢復工作

(1)客戶端的請求寫命令會被append追加到AOF緩沖區內;
(2)AOF緩沖區根據AOF持久化策略[always,everysec,no]將操作sync同步到磁碟的AOF文件中;
(3)AOF文件大小超過重寫策略或手動重寫時,會對AOF文件rewrite重寫,壓縮AOF文件容量;
(4)Redis服務重啟時,會重新load載入AOF文件中的寫操作達到數據恢復的目的

可以在redis.conf中配置文件名稱,默認為 appendonly.aof
AOF文件的保存路徑,同RDB的路徑一致。

AOF和RDB同時開啟,系統默認取AOF的數據(數據不會存在丟失)

AOF的備份機制和性能雖然和RDB不同, 但是備份和恢復的操作同RDB一樣,都是拷貝備份文件,需要恢復時再拷貝到Redis工作目錄下,啟動系統即載入。

正常恢復:
修改默認的appendonly no,改為yes
將有數據的aof文件復制一份保存到對應目錄(查看目錄:config get dir)
恢復:重啟redis然後重新載入

異常恢復:
修改默認的appendonly no,改為yes
如遇到AOF文件損壞,通過/usr/local/bin/redis-check-aof--fix appendonly.aof進行恢復
備份被寫壞的AOF文件
恢復:重啟redis,然後重新載入

appendfsync always
始終同步,每次Redis的寫入都會立刻記入日誌;性能較差但數據完整性比較好

appendfsync everysec
每秒同步,每秒記入日誌一次,如果宕機,本秒的數據可能丟失。

appendfsync no
redis不主動進行同步,把同步時機交給操作系統。

(1)是什麼
AOF採用文件追加方式,文件會越來越大為避免出現此種情況,新增了重寫機制, 當AOF文件的大小超過所設定的閾值時,Redis就會啟動AOF文件的內容壓縮, 只保留可以恢復數據的最小指令集.可以使用命令bgrewriteaof

(2)重寫原理,如何實現重寫
AOF文件持續增長而過大時,會fork出一條新進程來將文件重寫(也是先寫臨時文件最後再rename),redis4.0版本後的重寫,是指上就是把rdb 的快照,以二級制的形式附在新的aof頭部,作為已有的歷史數據,替換掉原來的流水賬操作。

no-appendfsync-on-rewrite:
如果 no-appendfsync-on-rewrite=yes ,不寫入aof文件只寫入緩存,用戶請求不會阻塞,但是在這段時間如果宕機會丟失這段時間的緩存數據。(降低數據安全性,提高性能)

重寫雖然可以節約大量磁碟空間,減少恢復時間。但是每次重寫還是有一定的負擔的,因此設定Redis要滿足一定條件才會進行重寫。

(3)重寫流程
(1)bgrewriteaof觸發重寫,判斷是否當前有bgsave或bgrewriteaof在運行,如果有,則等待該命令結束後再繼續執行。
(2)主進程fork出子進程執行重寫操作,保證主進程不會阻塞。
(3)子進程遍歷redis內存中數據到臨時文件,客戶端的寫請求同時寫入aof_buf緩沖區和aof_rewrite_buf重寫緩沖區保證原AOF文件完整以及新AOF文件生成期間的新的數據修改動作不會丟失。
(4)
1).子進程寫完新的AOF文件後,向主進程發信號,父進程更新統計信息。
2).主進程把aof_rewrite_buf中的數據寫入到新的AOF文件。
(5)使用新的AOF文件覆蓋舊的AOF文件,完成AOF重寫。

備份機制更穩健,丟失數據概率更低。
可讀的日誌文本,通過操作AOF穩健,可以處理誤操作。

比起RDB佔用更多的磁碟空間。
恢復備份速度要慢。
每次讀寫都同步的話,有一定的性能壓力。
存在個別Bug,造成恢復不能。

官方推薦兩個都啟用。
如果對數據不敏感,可以選單獨用RDB。
不建議單獨用 AOF,因為可能會出現Bug。
如果只是做純內存緩存,可以都不用。

https://blog.csdn.net/xm393392625/article/details/89053171

8. 常用的緩存技術

第一章 常用的緩存技術
1、常見的兩種緩存

本地緩存:不需要序列化,速度快,緩存的數量與大小受限於本機內存
分布式緩存:需要序列化,速度相較於本地緩存較慢,但是理論上緩存的數量與大小無限(因為緩存機器可以不斷擴展)
2、本地緩存

Google guava cache:當下最好用的本地緩存
Ehcache:spring默認集成的一個緩存,以spring cache的底層緩存實現類形式去操作緩存的話,非常方便,但是欠缺靈活,如果想要靈活使用,還是要單獨使用Ehcache
Oscache:最經典簡單的頁面緩存
3、分布式緩存

memcached:分布式緩存的標配
Redis:新一代的分布式緩存,有替代memcached的趨勢
3.1、memcached

經典的一致性hash演算法
基於slab的內存模型有效防止內存碎片的產生(但同時也需要估計好啟動參數,否則會浪費很多的內存)
集群中機器之間互不通信(相較於Jboss cache等集群中機器之間的相互通信的緩存,速度更快<--因為少了同步更新緩存的開銷,且更適合於大型分布式系統中使用)
使用方便(這一點是相較於Redis在構建客戶端的時候而言的,盡管redis的使用也不困難)
很專一(專做緩存,這一點也是相較於Redis而言的)
3.2、Redis

可以存儲復雜的數據結構(5種)
strings-->即簡單的key-value,就是memcached可以存儲的唯一的一種形式,接下來的四種是memcached不能直接存儲的四種格式(當然理論上可以先將下面的一些數據結構中的東西封裝成對象,然後存入memcached,但是不推薦將大對象存入memcached,因為memcached的單一value的最大存儲為1M,可能即使採用了壓縮演算法也不夠,即使夠,可能存取的效率也不高,而redis的value最大為1G)
hashs-->看做hashTable
lists-->看做LinkedList
sets-->看做hashSet,事實上底層是一個hashTable
sorted sets-->底層是一個skipList
有兩種方式可以對緩存數據進行持久化
RDB
AOF
事件調度
發布訂閱等
4、集成緩存

專指spring cache,spring cache自己繼承了ehcache作為了緩存的實現類,我們也可以使用guava cache、memcached、redis自己來實現spring cache的底層。當然,spring cache可以根據實現類來將緩存存在本地還是存在遠程機器上。

5、頁面緩存

在使用jsp的時候,我們會將一些復雜的頁面使用Oscache進行頁面緩存,使用非常簡單,就是幾個標簽的事兒;但是,現在一般的企業,前台都會使用velocity、freemaker這兩種模板引擎,本身速度就已經很快了,頁面緩存使用的也就很少了。

總結:

在實際生產中,我們通常會使用guava cache做本地緩存+redis做分布式緩存+spring cache就集成緩存(底層使用redis來實現)的形式
guava cache使用在更快的獲取緩存數據,同時緩存的數據量並不大的情況
spring cache集成緩存是為了簡單便捷的去使用緩存(以註解的方式即可),使用redis做其實現類是為了可以存更多的數據在機器上
redis緩存單獨使用是為了彌補spring cache集成緩存的不靈活
就我個人而言,如果需要使用分布式緩存,那麼首先redis是必選的,因為在實際開發中,我們會緩存各種各樣的數據類型,在使用了redis的同時,memcached就完全可以舍棄了,但是現在還有很多公司在同時使用memcached和redis兩種緩存。

9. jfinal如何實現緩存持久化

Cache 緩存

1 :EhCache

EhCachePlugin是JFinal集成的緩存插件,通過使用EhCachePlugin可以提高系統的並發訪問速度。

網頁鏈接

ehcache.xml簡介

EhCache的使用需要有ehcache.xml配置文件支持,該配置文件中配置了很多cache節點,每個cache節點會配置一個name屬性,例如:<cache name="blog" …>,該屬性是CacheKit取值所必須的。其它配置項如eternal、overflowToDisk、timeToIdleSeconds、timeToLiveSeconds詳見EhCache官方文檔。cache節點配置為都寫入磁碟即可.


2: Redis

RedisPlugin是支持 Redis的極速化插件。使用RedisPlugin可以極度方便的使用redis,該插件不僅提供了豐富的API,而且還同時支持多redis服務端。Redis擁有超高的性能,豐富的數據結構,天然支持數據持久化,是目前應用非常廣泛的nosql資料庫。對於redis的有效應用可極大提升系統性能,節省硬體成本。網頁鏈接

3:j2cache
開源中國教主紅薯的二級緩存,性能非常高,是 EhCache+Redis二合一的處理方式
網頁鏈接

10. memcached可以持久化嗎

memcached 是緩存系統,通過名字就可以看出來,官網也明確說了(Free & open source, high-performance, distributed memory object caching system),之所以是緩存系統,就說明它不會作為可靠的數據存儲,所以並不支持持久化。
另一個是redis,他是一個存儲系統,官網也說了。只不過redis是在內存中存儲的,所以速度快,因為是存儲系統,所以可以作為一個可靠的數據存儲系統。支持持久化。

熱點內容
在團競模式中怎麼重置配置 發布:2024-10-08 02:12:54 瀏覽:289
寶馬遠程伺服器如何啟用 發布:2024-10-08 02:02:57 瀏覽:391
c語言freadfwrite 發布:2024-10-08 02:01:15 瀏覽:854
腳本還不簡單嗎 發布:2024-10-08 01:54:43 瀏覽:423
安卓手機如何像平板一樣橫屏 發布:2024-10-08 01:33:26 瀏覽:510
wapi認證伺服器ip 發布:2024-10-08 01:33:24 瀏覽:507
centos自帶python 發布:2024-10-08 00:53:31 瀏覽:340
android串口調試助手 發布:2024-10-08 00:45:03 瀏覽:405
sqlserver2008亂碼 發布:2024-10-08 00:39:59 瀏覽:220
華為電腦伺服器系統進不去提示 發布:2024-10-08 00:13:42 瀏覽:493