摘要:如今數據量越來越大,傳統的關系型數據庫已經無法應付如此大數據的需求了。由此可見,在數據量日漸增長的今天,為了解決大數據量與高并發的難題,應運而生。的消息存儲采用的就是數據庫,支持大數據進行隨機實時訪問。
引言
打開Microsoft To-Do,發現Redis的學習計劃還躺在那里。
其實我對Redis的理解,僅僅停留在我認識這個單詞的層面上。
學習 簡介本來對這個Redis沒什么興趣的,不就是一個緩存的數據庫而已嗎?直到上次配置spring-redis的時候,發現這個東西沒有用戶名。
spring: redis: host: 127.0.0.1 port: 6379 password:
配置如上所示,只有主機、端口和密碼,和普通的MySQL或其他數據庫不同。
Redis是一個使用ANSI C編寫的開源、支持網絡、基于內存、可選持久性的鍵值對存儲數據庫。
我們熟知的就是Redis的緩存,Redis采用C編寫,運行異常的快。是有磁盤存儲支持的內存數據庫!
適用于數據變化快且數據庫大小可遇見(適合內存容量)的應用程序。
使用場景:股票價格、數據分析、實時數據搜集、實時通訊。
NoSQLRedis屬于NoSQL,NoSQL = Not Only SQL。
如今數據量越來越大,傳統的關系型數據庫已經無法應付如此大數據的需求了。
舉個例子:假設我們使用關系型數據庫存儲朋友圈,那一天會產生多少數據?再查詢的時候數據庫不就死了嗎?
這讓我想起了我之前關注的一個帖子:騰訊微信的后臺數據庫到底是怎么設計的?無知的人相談甚歡,最后好像是官方的哥們是在看不下去了,回復:誰告訴你們微信用的是關系型數據庫?
普通關系型數據庫,如果只查詢的話效率很高?如果算上讀寫的話?那可能傳統的數據庫都承受不住高并發。
重要的是關系型數據庫沒法擴展,大家想一想,因為數據之間是有關系的,所以數據庫擴展絕對不像擴展后臺服務規模一樣再拎個服務器出來那么簡單。
由此可見,在數據量日漸增長的今天,為了解決大數據量與高并發的難題,NoSQL應運而生。
NoSQL產品主要有四類:
類型 | 特點 | 代表 | 適用場景 |
---|---|---|---|
鍵值對存儲 | 能實現快速查詢,但存儲的數據缺少結構化 | Redis | 內容緩存,主要用于處理大數據的高訪問負載 |
列存儲數據庫 | 查找速度快,可擴展性強,更容易進行分布式擴展,但功能相對局限 | HBase | 分布式的文件系統 |
文檔數據庫 | 數據結構要求不嚴格,查詢性能不高,而且缺乏統一的查詢語法 | MongoDB | Web應用(相較于普通的Key-Value,其Value是結構化的) |
圖形數據庫 | 利用圖結構相關算法,但需要對整個圖做計算才能得出結果,不容易分布式 | Neo4j | 社交網絡,推薦系統,專注于構建關系圖譜 |
這些數據庫的名稱大家或多或少應該聽說過吧?今天才真正知道它們的作用,各有其特長,我們需根據業務場景動態選擇。Facebook的消息存儲采用的就是HBase數據庫,支持大數據進行隨機、實時訪問。
NoSQL因為數據之間都是沒有關系的,所以易擴展,同時具有很高的讀寫性能,很適合高并發場景。
歷史2008年,意大利的一家創業公司Merzia推出了一款基于MySQL的網站實時統計系統LLOOGG。
沒過多久,創始人Salvatore Sanfilippo對MySQL的性能大失所望,于是他決定自己寫一個數據庫。牛人就是牛人,我們就算質疑MySQL的性能,想寫也寫不出來啊?!
2009年,Salvatore Sanfilippo完成了數據庫的編寫,這就是Redis。
Salvatore Sanfilippo將Redis開源,并一直進行著Redis的開發,直到今天。我們熟知的Github、StackOverflow、新浪微博等公司都是Redis的用戶。
緩存傳統的緩存代碼需要這樣寫,很冗長,都是重復的代碼。
ValueOperationsvalueOperations = redisTemplate.opsForValue(); logger.info("判斷Redis中是否有Key"); if (redisTemplate.hasKey(url)) { logger.info("Redis命中,從Redis中獲取"); return valueOperations.get(url); } logger.info("發起Get請求"); ResponseEntity response = restTemplate.getForEntity(url, String.class); logger.info("存入緩存"); valueOperations.set(url, response.getBody(), TIME_OUT, TimeUnit.MINUTES);
感謝Spring AOP,我們可以使用注解實現緩存功能。
@Cacheable("cacheName") public ListfindAll() { return studentRepository.findAll(); }
使用注解實現緩存很簡單,同時@Cacheable還有許多的高級用法,以后與大家詳述。
操作Redis有三種動作:
GET:根據鍵查找值。
SET:給定鍵存儲值。
DEL:刪除鍵中的值。
然后就是Redis的數據結構,這個覺得暫時還不需要知道,畢竟現在使用的是現成的@Cacheable注解,還不需要我們手動去操作Redis。
一如代碼深似海,軟件之路很廣很遠。生命有限的我們不能把所有東西都精通,我們要在學習成本與能力提升之間進行權衡。
總結故不積跬步,無以至千里;不積小流,無以成江海。騏驥一躍,不能十步,駑馬十駕,功在不舍。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/62084.html
摘要:上圖中,每個紅圈表示一個請求,每一層的請求分別是上一層請求的子請求。換而言之,父請求是依賴于子請求的。特別地,的子請求運行時,會阻塞父請求掛起其對應的協程。 張超:又拍云系統開發高級工程師,負責又拍云 CDN 平臺相關組件的更新及維護。Github ID: tokers,活躍于 OpenResty 社區和 Nginx 郵件列表等開源社區,專注于服務端技術的研究;曾為 ngx_lua 貢...
摘要:資源包括什么內存磁盤網絡文件描述符外部緩存數據庫等,編程語言是如何管理資源的合理的算法架構保證了資源的合理使用,分配內存使用網絡等等。 在云計算時代,開發和運維的結合變得越來越重要。在DIFF論壇第一期,前新浪SAE運維主管,鄭志勇,分享了《一個開發眼中的運維》根據自己從開發人員轉型運維之后的心得,談如何把在開發上的運用抽象思維方式運用到運維領域。 showImg(http://se...
摘要:接下來就來說下我眼中的。鏈表轉換為樹的閾值,超過這個長度的鏈表會被轉換為紅黑樹,當然,不止這一個條件,在下面的源碼部分會看到。 源碼部分從HashMap說起是因為筆者看了很多遍這個類的源碼部分,同時感覺網上很多都是粗略的介紹,有些可能還不正確,最后只能自己看源碼來驗證理解,寫下這篇文章一方面是為了促使自己能深入,另一方面也是給一些新人一些指導,不求有功,但求無過。有錯誤的地方請在評論中...
閱讀 1281·2021-11-23 09:51
閱讀 1639·2021-11-16 11:45
閱讀 4076·2021-10-09 09:43
閱讀 2701·2021-07-22 16:47
閱讀 961·2019-08-27 10:55
閱讀 3461·2019-08-26 17:40
閱讀 3100·2019-08-26 11:39
閱讀 3241·2019-08-23 18:39