一、Redis的特性
???????Redis是一種基于鍵值對(key-value)的NoSQL數據庫,與很多鍵值對數據庫不同的是,Redis中的值可以是由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合),Bitmaps(位圖)等多種數據結構和算法組成,因此Redis可以滿足很多的應用場景,而且因為Redis會將所有數據都存放在內存中,所以他的讀寫性能非常驚人。不僅如此,Redis還可以將內存的數據利用快照和日志的形式保存到硬盤中,這樣在發生類似斷電或者機器故障的時候,內存中的數據不會“丟失”。除了上述功能以外,Redis還提供了鍵過期、發布訂閱、事務、流水線、Lua腳本等附加功能。總之,如果在合適的場景使用好Redis,就會像一把利劍。
???????Redis是一個在內存中存儲數據的中間件,用于作為數據庫,用于作為數據緩存,在分布式系統中能夠大展拳腳。?
1.1 速度快
正常情況下,Redis執行命令的速度非常快,為什么速度快呢??
- Redis的所有數據都是存放在內存中的
- Redis是用C語言實現的,一般來說,C語言實現的程序距離操作系統更近,執行速度相對會更快。(個人不認為,因為MySQL也是用C語言開發的)
- Redis使用單線程,預防了多線程可能產生的競爭問題。(Redis在6.0版本中引入了多線程機制,但是主要也是在處理網絡和IO,不涉及到數據命令,即命令的執行仍然采用了單線程模式)
- Redis的核心功能都是比較簡單的邏輯,核心功能都是比較簡單的操作內存的數據結構
- 從網絡角度上,Redis使用了IO多路復用的方式(epoll)
多線程并不是在所有情況下都是快的!!!!!
???????多線程提高效率的前提是:CPU密集型的任務,使用多個線程可以充分的利用CPU多核資源,但是Redis的核心任務主要是操作內存的數據結構——不會吃很多CPU
1.2 基于鍵值對的數據結構服務器
???????幾乎所有的編程語言都提供了類似字典的功能,例如C++中的map,Java中的map,Python的dict等,類似于這種組織數據的方式叫做基于鍵值對的方式,與很多的鍵值對數據庫不同的是,Redis中的值不僅可以是字符串,而且還可以是具體的數據結構,這樣不僅能便于在許多應用場景的開發,同時也能提供開發效率。
1.3 豐富的功能
除了5種數據結構,Redis還提供了許多額外的功能:
- 提供了鍵過期功能,可以用來使用緩存
- 提供了發布訂閱功能,可以用來實現消息系統
- 支持Lua腳本功能,可以利用Lua創造出新的Redis命令
- 提供了簡單的事務功能,能在一定程序上保證事務特性
- 提供了流水線功能,這樣客戶端能將一批命令一次性傳到Redis,減少了網絡的開銷
1.4 客戶端語言多
???????Redis提供了簡單的TCP通信協議,很多編程語言可以很方便地接入到Redis,并且由于Redis受到了社區和各大公司的廣泛認可,所以支持Redis的客戶端語言也非常多,幾乎涵蓋了主流的編程語言,例如C/C++,Java等。
1.5?持久化
???????通常來說,將數據放在內存中是不安全的,一旦發生斷電或者機器故障,重要的數據可能就會丟失,因此Redis提供了兩種持久化方式:RDB和AOF,即可以使用兩種策略將內存的數據保存到硬盤中,這樣就保證了數據的可持久性。
1.6?主從復制
???????Redis提供了復制功能,實現了多個相同數據的Redis副本,復制功能是分布式Redis的基礎。
1.7?高可用和分布式
???????Redis提供了高可用實現的Redis哨兵,能夠保證Redis節點的故障發現和故障自動轉移,也實現了Redis集群,是真正的分布式實現,提供了高可用,讀寫和容量的擴展性。
二、Redis的使用場景
2.1 Redis可以做什么
緩存
???????緩存機制幾乎在所有大型網站中都有使用,合理地使用緩存不僅可以加速數據的訪問速度,而且能夠有效地降低后端數據源的壓力。Redis提供了鍵值過期時間設置,并且也提供了靈活控制最大內存和內存溢出后的淘汰策略。
session storage?
???????cookie(只是在瀏覽器這邊存儲了一個用戶的身份標識sessionid)=>實現用戶身份信息的保存,需要session配合(session是存放在服務器上的)
如何解決上述問題?
- 想辦法讓負載均衡器把同一個用戶的請求始終打到同一臺機器上(不能輪詢,而是需要通過userid之類的方式來分配機器)
- 把會話數據單獨拎出來,放到一組獨立的機器上存儲(Redis)?
數據庫存儲
???????將Redis當做了數據庫,大多數情況下,考慮到數據存儲優先考慮的是“大”,但是仍然有一些場景考慮的是“快”。例如:搜索引擎對性能的要求非常高,其中沒有使用到MySQL這樣的數據庫,把所有需要檢索的數據存放在內存中,使用類似于Redis這樣的內存數據庫來完成的。
消息隊列系統
???????消息隊列系統可以說是一個大型網站的必備基礎組件,因為其具有業務解耦、非實時業務削峰等特性。Redis提供了發布訂閱功能和阻塞隊列的功能,雖然和專業的消息隊列比還不夠足夠強大,但是對于一般的消息隊列功能基本可以滿足。
2.2 Redis不可以做什么
???????站在數據規模的角度看,數據可以分為大規模數據和小規模數據,我們知道Redis的數據是存放在內存中的,雖然現在內存已經足夠便宜了,但是如果數據量非常大,使用Redis來進行存儲的話,基本是一個無底洞,經濟成本相當高。
???????站在數據冷熱的角度,數據分為熱數據和冷數據,熱數據通常是指需要頻繁操作的數據,反之為冷數據。如果將冷數據放在Redis上,基本上是對于內存的一種浪費,但是對于一些熱數據可以放在Redis中加速讀寫,也可以減輕后端存儲的負載,可以說是事半功倍。
三、Redis的安裝(Ubuntu)
???????安裝Redis5 系列,在Linux中進行安裝,Redis官方是不支持Windows版本的,微軟維護了一個Windows版本的Redis分支。
在Ubuntu中的安裝步驟如下:
- 先切換到root用戶,su命令切換到root
- 使用apt命令來搜索redis相關的軟件包,apt search redis
- 使用apt命令安裝redis,apt install redis
- 需要手動修改配置文件(redis.conf),將ip進行更改
- 重新啟動服務器,service redis-server restart
- 使用redis自帶的客戶端來連接服務器,redis-cli
- 使用ctrl + d 退出客戶端
什么是配置文件?
???????很多軟件都是有配置文件的,一個大的軟件里面包含了很多的功能,有很多可以定制化的操作,就可以通過配置文件選擇開啟/關閉/設定某些功能~
四、Redis客戶端介紹
Redis是一個客戶端-服務器結構的程序!!!(MySQL也是)
Redis的客戶端也有很多種形態:
- 自帶了命令行客戶端:redis-cli
- 圖形化界面的客戶端:桌面程序,web程序(像這樣的圖形化程序,依賴windows系統,而未來會有諸多限制,你的windows上的圖形化界面客戶端能不能連上你們的服務器里的redis,是一個未知數)
- 基于Redis的api自行開發客戶端:非常類似于mysql的C語言和JDBC
我們在來回顧一下Redis的快:
???????我們談到的redis的快是相對于MySQL這樣的關系型數據庫的,但是如果是直接和內存中的操作變量相比,就沒有優勢了,甚至更慢了!!!
- 使用hash map是直接操作內存,使用redis是先通過網絡,在操作內存
我們需要對癥下藥(具體問題具體分析):
- 上述場景中,是否需要使用redis,需要結合實際的需求來確定!!!
- 引入Redis的缺點:會更慢,但是有了Redis之后,我們可以將其擴展為分布式,也可以將數據單獨存儲,后續服務器重啟,不會影響到數據內容。