頻繁更新可以用redis存儲嗎
『壹』 三分鍾讀懂redis資料庫
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
1. 使用Redis有哪些好處?
(1) 速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間復雜度都是O(1)
(2) 支持豐富數據類型,支持string,list,set,sorted set,hash
(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除
2. redis相比memcached有哪些優勢?
(1) memcached所有的值均是簡單的字元串,redis作為其替代者,支持更為豐富的數據類型
(2) redis的速度比memcached快很多
(3) redis可以持久化其數據
3. redis常見性能問題和解決方案:
(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件
(2) 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次
(3) 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個區域網內
(4) 盡量避免在壓力很大的主庫上增加從庫
(5) 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...
這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。
4. Mysql里有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據
相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6種數據淘汰策略:
voltile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據
相關推薦:《Python視頻教程》
5. Memcache與Redis的區別都有哪些?
1)、存儲方式
Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。
Redis有部份存在硬碟上,這樣能保證數據的持久性。
2)、數據支持類型
Memcache對數據類型支持相對簡單。
Redis有復雜的數據類型。
3),value大小
redis最大可以達到1GB,而memcache只有1MB
6. Redis 常見的性能問題都有哪些?如何解決?
1).Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。
2).Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啟的恢復速度。Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啟用內存快照做持久化,如果數據比較關鍵,某個Slave開啟AOF備份數據,策略為每秒同步一次。
3).Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。
4). Redis主從復制的性能問題,為了主從復制的速度和連接的穩定性,Slave和Master最好在同一個區域網內
7. redis 最適合的場景
Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?
如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:
1.Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
2.Redis支持數據的備份,即master-slave模式的數據備份。
3.Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。
(1)會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平台Magento也提供Redis的插件。
(2)全頁緩存(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平台。回到一致性問題,即使重啟了Redis實例,因為有磁碟的持久化,用戶也不會看到頁面載入速度的下降,這是一個極大改進,類似php本地FPC。
再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。
此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度載入你曾瀏覽過的頁面。
(3)隊列
Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平台來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。
如果你快速的在Google中搜索「Redis queues」,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的後端工具,以滿足各種隊列需求。例如,Celery有一個後台就是使用Redis作為broker,你可以從這里去查看。
(4)排行榜/計數器
Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為「user_scores」,我們只需要像下面一樣執行即可:
當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這里看到。
(5)發布/訂閱
最後(但肯定不是最不重要的)是Redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網路連接中使用,還可作為基於發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。
『貳』 Redis是什麼,用來做什麼
Redis是一個nosql資料庫,可以存儲key-value值。因為其底層實現中,數據讀寫是基於內存,速度非常快,所以常用於緩存;進而因其為獨立部署的中間件,常用於分布式緩存的實現方案。
常用場景有:緩存、秒殺控制、分布式鎖。
雖然其是基於內存讀寫,但底層也有持久化機制;同時具備集群模式;不用擔心其可用性。
關於Redis的使用,可以參考《Redis的使用方法、常見應用場景》
『叄』 php頻繁刷新網頁運行一段時間後出現資料庫連接錯誤
這是由於資料庫連接數過多導致的,說明之前建立的連接你沒有釋放。
看到你的需求是實時獲取資料庫裡面的內容,可以考慮使用內存資料庫,這樣返回的效率高,也會避免過多連接的錯誤。
可以使用redis和memcache來解決這個問題。代碼如下,記得首先要安裝redis,並且要安裝php-redis擴展。
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);//serverip port
$redis->auth('mypassword');//my redis password
$redis ->set( "test" , "Hello World");
echo $redis ->get( "test");
『肆』 數據多的時候為什麼要使用redis而不用mysql
通常來說,當數據多、並發量大的時候,架構中可以引入Redis,幫助提升架構的整體性能,減少Mysql(或其他資料庫)的壓力,但不是使用Redis,就不用MySQL。
因為Redis的性能十分優越,可以支持每秒十幾萬此的讀/寫操作,並且它還支持持久化、集群部署、分布式、主從同步等,Redis在高並發的場景下數據的安全和一致性,所以它經常用於兩個場景:
緩存
判斷數據是否適合緩存到Redis中,可以從幾個方面考慮: 會經常查詢么?命中率如何?寫操作多麼?數據大小?
我們經常採用這樣的方式將數據刷到Redis中:查詢的請求過來,現在Redis中查詢,如果查詢不到,就查詢資料庫拿到數據,再放到緩存中,這樣第二次相同的查詢請求過來,就可以直接在Redis中拿到數據;不過要注意【緩存穿透】的問題。
緩存的刷新會比較復雜,通常是修改完資料庫之後,還需要對Redis中的數據進行操作;代碼很簡單,但是需要保證這兩步為同一事務,或最終的事務一致性。
高速讀寫
常見的就是計數器,比如一篇文章的閱讀量,不可能每一次閱讀就在資料庫裡面update一次。
高並發的場景很適合使用Redis,比如雙11秒殺,庫存一共就一千件,到了秒殺的時間,通常會在極為短暫的時間內,有數萬級的請求達到伺服器,如果使用資料庫的話,很可能在這一瞬間造成資料庫的崩潰,所以通常會使用Redis(秒殺的場景會比較復雜,Redis只是其中之一,例如如果請求超過某個數量的時候,多餘的請求就會被限流)。
這種高並發的場景,是當請求達到伺服器的時候,直接在Redis上讀寫,請求不會訪問到資料庫;程序會在合適的時間,比如一千件庫存都被秒殺,再將數據批量寫到資料庫中。
所以通常來說,在必要的時候引入Redis,可以減少MySQL(或其他)資料庫的壓力,兩者不是替代的關系 。
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。
Redis和MySQL的應用場景是不同的。
通常來說,沒有說用Redis就不用MySQL的這種情況。
因為Redis是一種非關系型資料庫(NoSQL),而MySQL是一種關系型資料庫。
和Redis同類的資料庫還有MongoDB和Memchache(其實並沒有持久化數據)
那關系型資料庫現在常用的一般有MySQL,SQL Server,Oracle。
我們先來了解一下關系型資料庫和非關系型資料庫的區別吧。
1.存儲方式關系型資料庫是表格式的,因此存儲在表的行和列中。他們之間很容易關聯協作存儲,提取數據很方便。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常存儲在數據集中,就像文檔、鍵值對或者圖結構。
2.存儲結構關系型資料庫對應的是結構化數據,數據表都預先定義了結構(列的定義),結構描述了數據的形式和內容。這一點對數據建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些數據比較困難。而Nosql資料庫基於動態結構,使用與非結構化數據。因為Nosql資料庫是動態結構,可以很容易適應數據類型和結構的變化。
3.存儲規范關系型資料庫的數據存儲為了更高的規范性,把數據分割為最小的關系表以避免重復,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,數據管理就顯得有點麻煩。而Nosql數據存儲在平面數據集中,數據經常可能會重復。單個資料庫很少被分隔開,而是存儲成了一個整體,這樣整塊數據更加便於讀寫
4.存儲擴展這可能是兩者之間最大的區別,關系型資料庫是縱向擴展,也就是說想要提高處理能力,要使用速度更快的計算機。因為數據存儲在關系表中,操作的性能瓶頸可能涉及到多個表,需要通過提升計算機性能來克服。雖然有很大的擴展空間,但是最終會達到縱向擴展的上限。而Nosql資料庫是橫向擴展的,它的存儲天然就是分布式的,可以通過給資源池添加更多的普通資料庫伺服器來分擔負載。
5.查詢方式關系型資料庫通過結構化查詢語言來操作資料庫(就是我們通常說的SQL)。SQL支持資料庫CURD操作的功能非常強大,是業界的標准用法。而Nosql查詢以塊為單元操作數據,使用的是非結構化查詢語言(UnQl),它是沒有標準的。關系型資料庫表中主鍵的概念對應Nosql中存儲文檔的ID。關系型資料庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的數據訪問模式。
6.事務關系型資料庫遵循ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)),而Nosql資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關系型資料庫的數據強一致性,所以對事務的支持很好。關系型資料庫支持對事務原子性細粒度控制,並且易於回滾事務。而Nosql資料庫是在CAP(一致性、可用性、分區容忍度)中任選兩項,因為基於節點的分布式系統中,很難全部滿足,所以對事務的支持不是很好,雖然也可以使用事務,但是並不是Nosql的閃光點。
7.性能關系型資料庫為了維護數據的一致性付出了巨大的代價,讀寫性能比較差。在面對高並發讀寫性能非常差,面對海量數據的時候效率非常低。而Nosql存儲的格式都是key-value類型的,並且存儲在內存中,非常容易存儲,而且對於數據的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫性能。
8.授權方式大多數的關系型資料庫都是付費的並且價格昂貴,成本較大(MySQL是開源的,所以應用的場景最多),而Nosql資料庫通常都是開源的。
所以,在實際的應用環境中,我們一般會使用MySQL存儲我們的業務過程中的數據,因為這些數據之間的關系比較復雜,我們常常會需要在查詢一個表的數據時候,將其他關系表的數據查詢出來,例如,查詢某個用戶的訂單,那至少是需要用戶表和訂單表的數據。
查詢某個商品的銷售數據,那可能就會需要用戶表,訂單表,訂單明細表,商品表等等。
而在這樣的使用場景中,我們使用Redis來存儲的話,也就是KeyValue形式存儲的話,其實並不能滿足我們的需要。
即使Redis的讀取效率再高,我們也沒法用。
但,對於某些沒有關聯少,且需要高頻率讀寫,我們使用Redis就能夠很好的提高整個體統的並發能力。
例如商品的庫存信息,我們雖然在MySQL中會有這樣的欄位,但是我們並不想MySQL的資料庫被高頻的讀寫,因為使用這樣會導致我的商品表或者庫存表IO非常高,從而影響整個體統的效率。
所以,對於這樣的數據,且有沒有什麼復雜邏輯關系(就只是隸屬於SKU)的數據,我們就可以放在Redis裡面,下單直接在Redis中減掉庫存,這樣,我們的訂單的並發能力就能夠提高了。
個人覺得應該站出來更正一下,相反的數據量大,更不應該用redis。
因為redis是內存型資料庫啊,是放在內存里的。
設想一下,假如你的電腦100G的資料,都用redis來存儲,那麼你需要100G以上的內存!
使用場景Redis最明顯的用例之一是將其用作緩存。只是保存熱數據,或者具有過期的cache。
例如facebook,使用Memcached來作為其會話緩存。
總之,沒有見過哪個大公司數據量大了,換掉mysql用redis的。
題主你錯了,不是用redis代替MySQL,而是引入redis來優化。
BAT里越來越多的項目組已經採用了redis+MySQL的架構來開發平台工具。
如題主所說,當數據多的時候,MySQL的查詢效率會大打折扣。我們通常默認如果查詢的欄位包含索引的話,返回是毫秒級別的。但是在實際工作中,我曾經遇到過一張包含10個欄位的表,1800萬+條數據,當某種場景下,我們不得不根據一個未加索引的欄位進行精確查詢的時候,單條sql語句的執行時長有時能夠達到2min以上,就更別提如果用like這種模糊查詢的話,其效率將會多麼低下。
我們最開始是希望能夠通過增加索引的方式解決,但是面對千萬級別的數據量,我們也不敢貿然加索引,因為一旦資料庫hang住,期間的所有資料庫寫入請求都會被放到等待隊列中,如果請求是通過http請求發過來的,很有可能導致服務發生分鍾級別的超時不響應。
經過一番調研,最終敲定的解決方案是引入redis作為緩存。redis具有運行效率高,數據查詢速度快,支持多種存儲類型以及事務等優勢,我們把經常讀取,而不經常改動的數據放入redis中,伺服器讀取這類數據的時候時候,直接與redis通信,極大的緩解了MySQL的壓力。
然而,我在上面也說了,是redis+MySQL結合的方式,而不是替代。原因就是redis雖然讀寫很快,但是不適合做數據持久層,主要原因是使用redis做數據落盤是要以效率作為代價的,即每隔制定的時間,redis就要去進行數據備份/落盤,這對於單線程的它來說,勢必會因「分心」而影響效率,結果得不償失。
樓主你好,首先糾正下,數據多並不是一定就用Redis,Redis歸屬於NoSQL資料庫中,其特點擁有高性能讀寫數據速度,主要解決業務效率瓶頸。下面就詳細說下Redis的相比MySQL優點。( 關於Redis詳細了解參見我近期文章:https://www.toutiao.com/i6543810796214813187/ )
讀寫異常快
Redis非常快,每秒可執行大約10萬次的讀寫速度。
Redis支持豐富的數據類型,有二進制字元串、列表、集合、排序集和散列等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數據類型來處理解決。
原子性Redis的所有操作都是原子操作,這確保如果兩個客戶端並發訪問,Redis伺服器能接收更新的值。
豐富實用工具 支持異機主從復制Redis支持主從復制的配置,它可以實現主伺服器的完全拷貝。
以上為開發者青睞Redis的主要幾個可取之處。但是,請注意實際生產環境中企業都是結合Redis和MySQL的特定進行不同應用場景的取捨。 如緩存——熱數據、計數器、消息隊列(與ActiveMQ,RocketMQ等工具類似)、位操作(大數據處理)、分布式鎖與單線程機制、最新列表(如新聞列表頁面最新的新聞列表)以及排行榜等等 可以看見Redis大顯身手的場景。可是對於嚴謹的數據准確度和復雜的關系型應用MySQL等關系型資料庫依然不可替。
web應用中一般採用MySQL+Redis的方式,web應用每次先訪問Redis,如果沒有找到數據,才去訪問MySQL。
本質區別1、mysql:數據放在磁碟 redis:數據放在內存。
首先要知道mysql存儲在磁碟里,redis存儲在內存里,redis既可以用來做持久存儲,也可以做緩存,而目前大多數公司的存儲都是mysql + redis,mysql作為主存儲,redis作為輔助存儲被用作緩存,加快訪問讀取的速度,提高性能。
使用場景區別1、mysql支持sql查詢,可以實現一些關聯的查詢以及統計;
2、redis對內存要求比較高,在有限的條件下不能把所有數據都放在redis;
3、mysql偏向於存數據,redis偏向於快速取數據,但redis查詢復雜的表關系時不如mysql,所以可以把熱門的數據放redis,mysql存基本數據。
mysql的運行機制mysql作為持久化存儲的關系型資料庫,相對薄弱的地方在於每次請求訪問資料庫時,都存在著I/O操作,如果反復頻繁的訪問資料庫。第一:會在反復鏈接資料庫上花費大量時間,從而導致運行效率過慢;第二:反復地訪問資料庫也會導致資料庫的負載過高,那麼此時緩存的概念就衍生了出來。
Redis持久化由於Redis的數據都存放在內存中,如果沒有配置持久化,redis重啟後數據就全丟失了,於是需要開啟redis的持久化功能,將數據保存到磁碟上,當redis重啟後,可以從磁碟中恢復數據。redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在內存中的資料庫記錄定時mp到磁碟上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日誌以追加的方式寫入文件)。
redis是放在內存的~!
數據量多少絕對不是選擇redis和mysql的准則,因為無論是mysql和redis都可以集群擴展,約束它們的只是硬體(即你有沒有那麼多錢搭建上千個組成的集群),我個人覺得數據讀取的快慢可能是選擇的標准之一,另外工作中往往是兩者同是使用,因為mysql存儲在硬碟,做持久化存儲,而redis存儲在內存中做緩存提升效率。
關系型資料庫是必不可少的,因為只有關系型資料庫才能提供給你各種各樣的查詢方式。如果有一系列的數據會頻繁的查詢,那麼就用redis進行非持久化的存儲,以供查詢使用,是解決並發性能問題的其中一個手段