一、Redis是什麼
Redis:REmote DIctionary Server(遠程字典服務器)
Redis是完全開源免費的,用C語言編寫的,遵守BSD協議的一個高性能的(key/value)分佈式內存數據庫
,也是基於內存運行並支持持久化的NoSQL數據庫
,是當前最熱門的NoSql數據庫之一,也被人們稱爲數據結構服務器。同時,Redis也是一個簡單的、高效的、分佈式的、基於內存的緩存工具
。架構好服務器後,通過網絡連接(類似數據庫),提供Key-Value式緩存服務。
Redis有以下幾個優勢:
1.性能極高
Redis讀的速度是11萬次/s,寫的速度是8萬次/秒。2.豐富的數據類型
Redis支持的類型有String、Hash、List、Set以及Ordered Set數據庫類型。3.原子性
Redis所有操作都是原子性的,通過MULTI和EXEC指令包起來。4.豐富的讀寫
Redis支持publish/subscribe、通知、key過期等特性。5.高速讀寫
redis使用自己實現的分離器,代碼量很短,沒有使用lock(MySQL),因此效率非常高。
Redis也有以下幾個劣勢:
1.持久化
Redis直接將數據存儲在內存中,如果要將數據保存到磁盤上,第一種方法是使用①定時快照(snapshot)
:每隔一段時間將整個數據庫寫到磁盤上,每次均是寫全部數據,但是代價非常高;第二種方法是②基於語句追加(aof)
:只追蹤變化的數據,但是追加的log可能過大,同時所有的操作均重新執行一遍,恢復速度慢。2.耗內存
,佔用內存過高。
二、Redis能幹什麼
企業開發中,可以將Redis作爲數據庫、緩存、熱點數據(經常被查詢但是不被修改和刪除的數據)、消息中間件等大部分功能。
Redis的常用場景實例如下:
-
緩存
如今緩存幾乎是所有中大型網站都在用的必殺技,合理的利用緩存不僅能夠提升網站的訪問速度,還能大大降低數據庫的壓力。Redis提供了鍵過期的功能,也提供了靈活的鍵淘汰策略。 -
排行榜
如淘寶的月度銷量榜單、商品按時間的上新排行榜等。Redis提供的有序集合數據類構能實現各種複雜的排行榜應用。 -
計數器
如電商網站商品的瀏覽量、視頻網站視頻的播放數等。爲了保證數據實時效,每次瀏覽都得給+1,併發量高時如果每次都請求數據庫操作無疑是種挑戰和壓力。Redis提供的incr命令來實現計數器功能,內存操作,性能非常好,非常適用於這些計數場景。 -
分佈式會話
集羣模式下,在應用不多的情況下一般使用容器自帶的session複製功能就能滿足,在應用增多相對複雜的系統中,一般都會搭建以Redis等內存數據庫爲中心的session服務,session不再由容器管理,而是由session服務及內存數據庫管理。 -
分佈式鎖
分佈式技術帶來的技術挑戰是對同一個資源的併發訪問,如全局ID、減庫存、秒殺等場景,併發量不大的場景可以使用數據庫的悲觀鎖、樂觀鎖來實現,但在併發量高的場合中,利用數據庫鎖來控制資源的併發訪問是不太理想的,大大影響了數據庫的性能。可以利用Redis的setnx功能來編寫分佈式的鎖,如果設置返回1說明獲取鎖成功,否則獲取鎖失敗,實際應用中要考慮的細節要更多。 -
社交網絡
點贊、踩、關注/被關注、共同好友等是社交網站的基本功能,社交網站的訪問量通常來說比較大,而且傳統的關係數據庫類型不適合存儲這種類型的數據,Redis提供的哈希、集合等數據結構能很方便的的實現這些功能。 -
最新列表
Redis列表結構,LPUSH可以在列表頭部插入一個內容ID作爲關鍵字,LTRIM可用來限制列表的數量,這樣列表永遠爲N個ID,無需查詢最新的列表,直接根據ID去到對應的內容頁即可。 -
消息系統
消息隊列是大型網站必用中間件,如ActiveMQ、RabbitMQ、Kafka等流行的消息隊列中間件,主要用於業務解耦、流量削峯及異步處理實時性低的業務。Redis提供了發佈/訂閱及阻塞隊列功能,能實現一個簡單的消息隊列系統。但是,這個不能和專業的消息中間件相比。
三、Redis下載與安裝部署
由於企業裏面做Redis開發,99%都是Linux版的運用和安裝,所以本文僅介紹Linux下的安裝與運行,Windows下的安裝使用小夥伴們可以自行百度。前往上面的官網點擊Download下載.gz
安裝包後,放在Linux下的/opt
目錄 (我這裏安裝的是Redis的6.0.5版本)。
- 解壓命令爲:
tar -zxvf redis-6.0.5.tar.gz
上述命令只是解壓了Redis,如果想要安裝Redis,需要Linux系統有gcc環境,如果沒有可以使用
yum install gcc-c++
安裝,然後使用gcc -v
查看版本。
如果Linux環境已經有了gcc環境,直接使用下面的命令進行安裝:
- 安裝命令爲:
make install
安裝好默認是像Tomcat那樣不能開機自啓的,可以修改 redis.conf 文件中的 daemonize 屬性爲yes。
- 開啓redis服務:
redis-server /myredis/redis.conf
(此處爲修改屬性後的redis配置文件)
查看後臺Redis服務是否啓動:
ps -ef|grep redis
開啓Redis服務:
redis-cli -p 6379
正常關閉,數據會進行保存
在redis命令行中使用shutdown
命令關閉。
非正常關閉,易導致數據丟失
斷電、手動kill掉redis進程等。
幾個其他的redis命令
四、Redis的幾個小知識
Redis是一個單進程,使用單進程模型來處理客戶端的請求。對讀寫等事件的響應是通過對epoll函數的包裝來做到的。Redis的實際處理速度完全依靠主進程的執行效率。
epoll是Linux內核爲處理大批量文件描述符而作了改進的epoll,是Linux下多路複用IO接口select/poll的增強版本,它能顯著提高程序在大量併發連接中只有少量活躍的情況下的系統CPU利用率。
-
Redis默認有16個數據庫,下標從零開始,初始默認使用零號庫,可以使用
SELECT <dbid>
命令連接上指定數據庫。
-
dbsize
指令可以查看當前數據庫的key的數量,keys *
查看所有的key。
-
flushdb
:清空當前庫(慎用) -
Flushall
:清空全部庫(慎用) -
統一密碼管理,16個庫都是同樣密碼,要麼都OK要麼一個也連接不上。
-
Redis索引都是從零開始
-
Redis默認端口是6379