Redis的基本使用


1、NoSQL數據庫基本介紹

1.1、NoSQL數據庫

NoSQL(Not Only SQL ),意即“不僅僅是SQL”,泛指非關系型的數據庫。隨着互聯網web2.0網站的興起,傳統的關系數據庫在處理web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,出現了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,特別是大數據應用難題。

NoSQL有如下優點:易擴展,NoSQL數據庫種類繁多,但是一個共同的特點都是去掉關系數據庫的關系型特性。數據之間無關系,這樣就非常容易擴展。無形之間也在架構的層面上帶來了可擴展的能力。大數據量,高性能,NoSQL數據庫都具有非常高的讀寫性能,尤其在大數據量下,同樣表現優秀。這得益於它的無關系性,數據庫的結構簡單。

 

NoSQL 數據庫特點: 

  • 不遵循SQL標准。
  • 區別於關系數據庫,它們不保證關系數據的ACID特性
  • 遠超於SQL的性能。

 

NoSQL適用場景:

  • 對數據高並發的讀寫
  • 海量數據的讀寫
  • 對數據高可擴展性的

 

NoSQL不適用場景:

  • 需要事務支持
  • 基於sql的結構化查詢存儲,處理復雜的關系,需要即席查詢。(用不着sql的和用了sql也不行的情況,請考慮用NoSql

 

1.2、常見的 NoSQL 數據庫

Memcache

Redis

MongoDB

 

2、Redis的基本介紹

Redis是一個開源的、可基於內存亦可持久化的日志型、高性能的鍵值對(Key-Value)存儲數據庫,並提供多種語言的API。Redis 通常被稱為數據結構服務器,因為值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等類型。

 

Redis 與其他 key - value 緩存產品有以下三個特點:

  • Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
  • Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
  • Redis支持數據的備份,即master-slave模式的數據備份。

 

2.1、Redis的優勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

Redis有着更為復雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。在內存數據庫方面的另一個優點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。

 

3、Redis安裝和啟動關閉

3.1、安裝 Redis

window 版本可參考:https://www.runoob.com/redis/redis-install.html

下面我們安裝 Linux 版本的 Redis。

下載地址:https://redis.io/download,下載完成后將 .tar.gz 安裝包上傳到 Linux 系統上,比如我們上傳至 /usr/mysoft 目錄下。

注意,編譯 Redis 需要C語言編譯器gcc的支持,如果沒有,需要先安裝gcc,我們可以使用 gcc --version 來查看gcc是否安裝:

如果沒有安裝 gcc 的話,可使用 yum install gcc 命令安裝 gcc。

 

解壓安裝包,命令:tar -zxvf redis-6.2.6.tar.gz

進入解壓后目錄,並輸入 make 命令進行編譯:

 如果 gcc 沒有安裝好,編譯可能會報錯:Jemalloc/jemalloc.h:沒有那個文件。此時可以先使用 make distclean 命令來清除臨時文件,然后再執行 make 命令進行再次編譯。

 

運行 make install 命令安裝 Redis:

安裝完成后,Redis 默認會安裝在 /usr/local/bin 目錄下,目錄結構如下:

文件說明:

  • redis-benchmark:性能測試工具,可以在自己本子運行,看看自己本子性能如何
  • redis-check-aof:修復有問題的AOF文件,rdbaof后面講
  • redis-check-dump:修復有問題的dump.rdb文件
  • redis-sentinelRedis集群使用
  • redis-serverRedis服務器啟動命令
  • redis-cli客戶端,操作入口。在啟動 Redis 后,可以使用客戶端來訪問Redis

 

3.2、啟動Redis

啟動 Redis 只需進入到 Redis 的安裝目錄,並執行 redis-server 命令即可:

默認情況下,這里直接執行 Redis-server 啟動的Redis服務,是在前台直接運行的,也就是說,執行完該命令后,如果把當前窗口關閉掉,則Redis服務也會隨即關閉。所以一般情況下,啟動Redis服務需要從后台啟動,也就是讓 Redis 可以在后台運行。

我們可以先拷貝一個 Redis 配置文件到指定目錄下,比如:cp  /usr/mysoft/redis-6.2.6/redis.conf  /usr/mysoft/redis-6.2.6/myredis/redis.conf。然后編譯新拷貝的配置文件,將 daemonize 由 no 改為 yes。

再次啟動redis服務,並指定啟動服務配置文件:/usr/local/bin/redis-server /usr/mysoft/redis-6.2.6/myredis/redis.conf:

由此 Redis 即可運行在后台,即使關閉運行窗口 Redis 也不會被關閉。

 

在啟動 Redis 后,我們可以使用客戶端訪問Redis,直接輸入 /usr/local/bin/redis-cli 命令即可啟動客戶端訪問 Redis:

redis-cli 只是 Redis 的客戶端,如果沒有啟動 Redis 進程的話,啟動 redis-cli 會提示無法連接。

 

 3.3、關閉Redis

單實例關閉,命令:redis-cli shutdown

也可以進入終端后再關閉:

 

多實例關閉,指定端口關閉,命令:redis-cli -p 6379 shutdown

 

4、Redis相關知識

4.1、端口號

Redis  的默認端口號為 6379。(6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字)

 

4.2、Redis的單線程+多路IO復用技術

Redis是單線程+多路IO復用技術。這里“多路”指的是多個網絡連接,“復用”指的是復用同一個線程,采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網絡 IO 的時間消耗)。

 

多路復用:Redis 會使用一個線程來檢查多個文件描述符(socket)的就緒狀態,如果有一個文件描述符(socket)就緒,就返回,否則 Redis 會把當前線程阻塞掉。在得到就緒狀態后進行真正的操作時可以在同一個線程里執行,也可以啟動新線程去執行(線程池),本質上是沒有阻塞的。

 

多路I/O復用模型是利用 select、poll(輪詢)、epoll 可以同時監察多個流的 I/O 事件的能力,在空閑的時候(即沒有IO事件時),會把當前線程阻塞掉。當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,此時程序會輪詢一遍所有的流(epoll 是只輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。

采用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗;

這里我們一直在強調的單線程,只是 Redis 在處理我們的網絡請求(即對 Redis 的數據庫連接)的時候只有一個線程來處理,一個正式的Redis Server運行的時候肯定是不止一個線程的,這里需要大家明確的注意一下!例如Redis進行持久化的時候會以子進程或者子線程的方式執行。

 

4.3、Redis操作的原子性

Redis的所有單個操作都是原子性的,所謂原子操作是指不會被線程調度機制打斷的操作,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。

這種操作一旦開始,就一直運行到結束,中間不會有任何 context switch (切換到另一個線程)。

1)在單線程中, 能夠在單條指令中完成的操作都可以認為是"原子操作",因為中斷只能發生於指令之間。

2)在多線程中,不能被其它進程(線程)打斷的操作就叫原子操作。

Redis單命令的原子性主要得益於Redis的單線程。

 

5、Redis的數據庫

 

5.1、Redis的多個數據庫

Redis 默認提供了 16 個數據庫,每個數據庫都有一個 id, 從 0 開始,0~15, 且默認使用的是0號庫。

每個數據庫的數據是隔離的不能共享。我們可以通過修改 redis 的配置文件的 databases 進行修改數據庫的數量,並且該數量無上限。Redis是一個字典結構的存儲服務器,而實際上一個Redis實例提供了多個用來存儲數據的字典,客戶端可以指定將數據存儲在哪個字典中。這與我們熟知的在一個關系數據庫實例中可以創建多個數據庫類似,所以可以將其中的每個字典都理解成一個獨立的數據庫。

客戶端與Redis建立連接后會自動選擇 0 號數據庫,不過可以隨時使用 select <dbid> 命令更換數據庫。

比如要選擇1號數據庫:

 

Redis 多個數據庫的特點:

  • Redis 不支持自定義數據庫的名字,每個數據庫都以編號命名,開發者必須自己記錄哪些數據庫存儲了哪些數據。
  • Redis 不支持為每個數據庫設置不同的訪問密碼,統一密碼管理,所有庫同樣密碼。所以一個客戶端要么可以訪問全部數據庫,要么連一個數據庫也沒有權限訪問。
  • 多個數據庫之間並不是完全隔離的,比如 FLUSHALL 命令可以清空一個Redis實例中所有數據庫中的數據。

綜上所述,這些數據庫更像是一種命名空間,而不適宜存儲不同應用程序的數據。比如可以使用0號數據庫存儲某個應用生產環境中的數據,使用1號數據庫存儲測試環境中的數據,但不適宜使用0號數據庫存儲A應用的數據而使用1號數據庫B應用的數據,不同的應用應該使用不同的Redis實例存儲數據。由於Redis非常輕量級,一個空Redis實例占用的內存只有1M左右,所以不用擔心多個Redis實例會額外占用很多內存。

 

5.2、數據庫相關命令

數據庫相關常用命令如下:

  • select 數據庫 id:根據id切換數據庫
  • dbsize:查看當前數據庫的key的數量
  • flushdb:清空當前庫的數據
  • flushall:將全部數據庫的數據都清空

 

如何查看當前連接的是幾號數據庫?默認選擇的是 0 號數據庫,當通過 select 命令切換數據庫后,會在命令行后面顯示 [],[] 括號里面的就是當前連接的數據庫號,默認。如下:

 

6、數據庫的鍵

6.1、鍵的過期時間

redis 的鍵默認是永不過期的。一般情況是這樣,當你配置中開啟了超出最大內存限制就寫磁盤的話,那么這些沒有設置過期時間的key可能會被寫到磁盤上。假如沒設置。那么redis將使用LRU機制,將內存中的老數據刪除,並寫入新數據。

當然也可以為 鍵設置過期時間,“expire key 時間” 命令用於設置key 的過期時間,key 過期后將不再可用,單位以秒計。

 

6.2、key 相關命令

Redis 鍵命令用於管理 redis 的鍵。

key 相關常用命令如下:

  • set key value:添加 string 類型的 key,並設置該 key 的 value 值
  • keys *:查看當前庫所有key    (匹配:keys *1)
  • exists key:判斷某個key是否存在。存在返回1,否則返回0
  • type key:查看你的key是什么類型
  • del key:刪除指定的key。刪除成功則輸出1,否則輸出0
  • unlink key:異步刪除。僅將keys從keyspace元數據中刪除,真正的刪除會在后續異步操作。
  • expire key 時間:為給定的key設置過期時間,單位為秒。比如expire key 10,即該 key 在10秒后過期。key 如果不設置過期時間,默認是永不自動過期
  • ttl key:查看還有多少秒過期。該命令返回 key 有效時間的秒數,如果是 -1 則表示永不過期,-2 則表示已過期。

操作示例:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM