掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
大家好,我是哪吒。

10余年的定陶網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。網(wǎng)絡營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整定陶建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“定陶網(wǎng)站設計”,“定陶網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
(1)Redis可以存儲幾十個G的數(shù)據(jù),Map行嗎?
(2)Redis的緩存可以進行本地持久化,Map行嗎?
(3)Redis可以作為分布式緩存,Map只能在同一個JVM中進行緩存;
(4)Redis支持每秒百萬級的并發(fā),Map行嗎?
(5)Redis有過期機制,Map有嗎?
(6)Redis有豐富的API,支持非常多的應用場景,Map行嗎?
(1)代碼更清晰,處理邏輯更簡單。
(2)不用考慮各種鎖的問題,不存在加鎖和釋放鎖的操作,沒有因為可能出現(xiàn)死鎖而導致的性能問題。
(3)不存在多線程切換而消耗CPU。
(4)無法發(fā)揮多核CPU的優(yōu)勢,但可以采用多開幾個Redis實例來完善。
(1)Redis6.0之前是單線程的,Redis6.0之后開始支持多線程。
(2)Redis內(nèi)部使用了基于epoll的多路復用,也可以多部署幾個Redis服務器解決單線程的問題。
(3)Redis主要的性能瓶頸是內(nèi)存和網(wǎng)絡。
(4)內(nèi)存好說,加內(nèi)存條就行了,而網(wǎng)絡才是大麻煩,所以Redis6內(nèi)存好說,加內(nèi)存條就行了。
(5)而網(wǎng)絡才是大麻煩,所以Redis6.0引入了多線程的概念。
(6)Redis6.0在網(wǎng)絡IO處理方面引入了多線程,如網(wǎng)絡數(shù)據(jù)的讀寫和協(xié)議解析等,需要注意的是,執(zhí)行命令的核心模塊還是單線程的。
(1)Redis是KV數(shù)據(jù)庫,MySQL是關系型數(shù)據(jù)庫,Redis速度更快。
(2)Redis數(shù)據(jù)操作主要在內(nèi)存中,MySQL主要將數(shù)據(jù)存儲在硬盤,Redis速度更快。
(3)Redis同樣支持持久化(RDB+AOF),Redis支持將數(shù)據(jù)異步將內(nèi)存的數(shù)據(jù)持久化到硬盤上,避免Redis宕機出現(xiàn)數(shù)據(jù)丟失的問題。
(4)Redis性能極高,讀的速度是110000次/秒,寫的速度是81000次/秒。
(5)Redis數(shù)據(jù)類型豐富,不僅支持KV鍵值對,還支持list、set、zset、hash等數(shù)據(jù)結構的存儲。
(6)Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
(7)Redis支持簡單的事務,操作滿足原子性。
(8)Redis支持讀寫分離,分擔讀的壓力。
(9)Redis支持哨兵模式,實現(xiàn)故障的自動轉移。
(10)單線程操作,避免了頻繁的上下文切換。
(11)采用了非阻塞I/O多路復用機制,性能卓越。
(1)數(shù)據(jù)存儲在內(nèi)存,容易造成數(shù)據(jù)丟失。
(2)存儲容量受內(nèi)存的限制,只能存儲少量的常用數(shù)據(jù)。
(3)緩存和數(shù)據(jù)庫雙寫一致性問題。
(4)用于緩存時,容易出現(xiàn)內(nèi)存穿透、緩存擊穿、緩存雪崩的問題。
(5)修改配置文件后,需要進行重啟,將硬盤中的數(shù)據(jù)同步到內(nèi)存中,消耗的時間較長,而且數(shù)據(jù)同步的時間里Redis不能提供服務。
(1)Redis是基于內(nèi)存的nosql數(shù)據(jù)庫,可以通過新建線程的形式進行持久化,不影響Redis單線程的讀寫操作。
(2)通過list取最新的N條數(shù)據(jù)。
(3)模擬類似于token這種需要設置過期時間的場景。
(4)發(fā)布訂閱消息系統(tǒng)。
(5)定時器、計數(shù)器。
(6)緩存加速、分布式會話、排行榜、分布式計數(shù)器、分布式鎖。
(7)Redis支持事務、持久化、LUA腳本、發(fā)布/訂閱、緩存淘汰、流技術等特性。
(1)String簡介
String 是最基本的 key-value 結構,key 是唯一標識,value 是具體的值,value其實不僅是字符串, 也可以是數(shù)字(整數(shù)或浮點數(shù)),value 最多可以容納的數(shù)據(jù)長度是 512M。
(2)應用場景
① 作為緩存數(shù)據(jù)庫
在Java管理系統(tǒng)體系中,大多數(shù)都是用MySQL存儲數(shù)據(jù),redis作為緩存,因為Redis具有支撐高并發(fā)的特性,通常能起到加速讀寫和降低數(shù)據(jù)庫服務器壓力的作用,大多數(shù)請求都會先請求Redis,如果Redis中沒有數(shù)據(jù),再請求MySQL數(shù)據(jù)庫,然后再緩存到Redis中,以備下次使用。
② 計數(shù)器
Redis字符串中有一個命令INCR key,incr命令會對值進行自增操作,比如CSDN的文章閱讀,視頻的播放量,都可以通過Redis來計數(shù),每閱讀一次就+1,同時將這些數(shù)據(jù)異步存儲到MySQL數(shù)據(jù)庫中,降低MySQL服務器的寫入壓力。
③ 共享session
在分布式系統(tǒng)中,用戶每次請求一般會訪問不同的服務器 ,這就會導致session不同步的問題,這時,一般會使用Redis來解決這個問題,將session存入Redis,使用的時候從Redis中取出就可以了。
④ 分布式鎖
(3)key操作命令
(4)set key value
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]。
備注:
命令不區(qū)分大小寫,而key是區(qū)分大小寫的。
help @類型:查看當前類型相關的操作命令。
Since the SET command options can replace SETNX, SETEX, PSETEX, GETSET, it is possible that in future versions of Redis these commands will be deprecated and finally removed。
(5)同時設置多個鍵值
(6)獲取指定區(qū)間范圍內(nèi)的值
getrange、setrange。
(7)數(shù)值增減
(8)獲取字符串的長度,內(nèi)容追加
(1)List 列表簡介
List 列表是簡單的字符串列表,按照插入順序排序,可以從頭部或尾部向 List 列表添加元素。
列表的最大長度為 2^32 - 1,也即每個列表支持超過 40 億個元素。
主要功能有push/pop,一般用在棧、隊列、消息隊列等場景。
它的底層是雙向鏈表,對兩端的操作性能很高,通過索引下標操作中間的節(jié)點,性能會較差。
(2)應用場景
① 消息隊列
使用 lpush + rpop或者 rpush + lpop實現(xiàn)消息隊列,Redis還支持阻塞操作,在彈出元素的時候使用阻塞命令來實現(xiàn)阻塞隊列。
② 作為棧使用
使用 lpush+lpop或者 rpush+rpop實現(xiàn)棧。
③ 文章列表
(3)常用命令
(1)hash簡介
Hash 是一個鍵值對(key - value)集合,value也是一個hash,相當于 Map
(2)常用場景
由于特殊的數(shù)據(jù)結構,hash一般作為存儲bean使用,String+JSON的數(shù)據(jù)結構存儲特定的應用場景。
(3)常用命令
(1)Set類型簡介
Set 類型是一個無序并唯一的鍵值集合,它的存儲順序不會按照插入的先后順序進行存儲。
一個集合最多可以存儲 2^32-1 個元素。概念和數(shù)學中個的集合基本類似,可以交集,并集,差集等等,所以 Set 類型除了支持集合內(nèi)的增刪改查,同時還支持多個集合取交集、并集、差集。
(2)應用場景
① 相同好友可見
在朋友圈場景中,對于點贊、評論的功能,通過交集實現(xiàn)相同還有可見的功能。
② 共同關注、共同喜好
③ 抽獎功能
(3)常用命令
(1)Zset 類型簡介
Zset 類型(有序集合類型)相比于 Set 類型多了一個排序屬性 score(分值),對于有序集合 ZSet 來說,每個存儲元素相當于有兩個值組成的,一個是有序結合的元素值,一個是排序值。
有序集合保留了集合不能有重復成員的特性(分值可以重復),但不同的是,有序集合中的元素可以排序。
zset k1 score1 v1 score2 v2。
(2)應用場景
① 排行榜
通過score來記錄點贊數(shù),然后根據(jù)score進行排序,實現(xiàn)排行榜的功能。
② 延遲消息隊列
訂單系統(tǒng),下單后需要在15分鐘內(nèi)進行支付操作,否則自動取消訂單。
將下單后15分鐘后的時間作為score,訂單作為value存入Redis,消費者輪詢?nèi)ハM,如果消費的大于等于score,則取消該訂單。
(3)Zset常用命令
(1)Bitmap簡介
Bitmap,即位圖,是一串連續(xù)的二進制數(shù)組(0和1),可以通過偏移量(offset)定位元素。BitMap通過最小的單位bit來進行0|1的設置,表示某個元素的值或者狀態(tài),時間復雜度為O(1)。
(2)應用場景
由于 bit 是計算機中最小的單位,使用它進行儲存將非常節(jié)省空間,特別適合一些數(shù)據(jù)量大且使用二值統(tǒng)計的場景。
① 簽到統(tǒng)計
② 判斷用戶是否登錄
③ 統(tǒng)計連續(xù)學習打卡的人
(3)BitMap常用命令
通過bitfield命令可以一次性操作多個比特位,它會執(zhí)行一系列操作并返回一個響應數(shù)組,這個數(shù)組中的元素對參數(shù)列表中的相應操作的執(zhí)行結果。
(1)HyperLogLog簡介
Redis HyperLogLog 是 Redis 2.8.9 版本新增的數(shù)據(jù)類型,是一種用于「統(tǒng)計基數(shù)」的數(shù)據(jù)集合類型,基數(shù)統(tǒng)計就是指統(tǒng)計一個集合中不重復的元素個數(shù)。但要注意,HyperLogLog 是統(tǒng)計規(guī)則是基于概率完成的,不是非常準確,標準誤算率是 0.81%。
所以,簡單來說 HyperLogLog 提供不精確的去重計數(shù)。
HyperLogLog 的優(yōu)點是,在輸入元素的數(shù)量或者體積非常非常大時,計算基數(shù)所需的內(nèi)存空間總是固定的、并且是很小的。
在 Redis 里面,每個 HyperLogLog 鍵只需要花費 12 KB 內(nèi)存,就可以計算接近 2^64 個不同元素的基數(shù),和元素越多就越耗費內(nèi)存的 Set 和 Hash 類型相比,HyperLogLog 就非常節(jié)省空間。
(2)應用場景
百萬級網(wǎng)頁 UV 計數(shù)
(3)常用命令
(1)GEO簡介
Redis GEO 是 Redis 3.2 版本新增的數(shù)據(jù)類型,主要用于存儲地理位置信息,并對存儲的信息進行操作。
在日常生活中,我們越來越依賴搜索“附近的餐館”、在打車軟件上叫車,這些都離不開基于位置信息服務(Location-Based Service,LBS)的應用。LBS 應用訪問的數(shù)據(jù)是和人或物關聯(lián)的一組經(jīng)緯度信息,而且要能查詢相鄰的經(jīng)緯度范圍,GEO 就非常適合應用在 LBS 服務的場景中。
(2)應用場景
高德地圖、滴滴打車等定位軟件。
(3)常用命令
(1)Stream簡介
Redis Stream 是 Redis 5.0 版本新增加的數(shù)據(jù)類型,Redis 專門為消息隊列設計的數(shù)據(jù)類型。
在 Redis 5.0 Stream 沒出來之前,消息隊列的實現(xiàn)方式都有著各自的缺陷,例如:
基于以上問題,Redis 5.0 便推出了 Stream 類型也是此版本最重要的功能,用于完美地實現(xiàn)消息隊列,它支持消息的持久化、支持自動生成全局唯一 ID、支持 ack 確認消息的模式、支持消費組模式等,讓消息隊列更加的穩(wěn)定和可靠。
(2)應用場景
消息隊列
(3)常用命令
Redis是一個key-value存儲系統(tǒng),支持10種數(shù)據(jù)類型,總結了為何要用Redis替代map作為程序緩存、Redis為什么是單線程的、Redis的優(yōu)缺點、Redis的常用場景,做了一次Redis的快速入門。
本文轉載自微信公眾號「哪吒編程」,可以通過以下二維碼關注。轉載本文請聯(lián)系哪吒編程公眾號。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流