Redis系列(一)Redis入門

来源:https://www.cnblogs.com/itzhouq/archive/2020/05/16/redis1.html
-Advertisement-
Play Games

NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。 Redis 系列: 1. Redis系列(一)Redis入門 2. Redis系列(二)Redi... ...


NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。

Redis 系列:

  1. Redis系列(一)Redis入門
  2. Redis系列(二)Redis的8種數據類型
  3. Redis系列(三)Redis的事務和Spring Boot整合
  4. Redis系列(四)Redis配置文件和持久化
  5. Redis系列(五)發佈訂閱模式、主從複製和哨兵模式
  6. Redis系列(六)Redis 的緩存穿透、緩存擊穿和緩存雪崩
  7. Redis命令參考

1、什麼是 NoSQL

NoSQL = Not Only SQL(不僅僅是 SQL)

關係型資料庫:表格,行,列

泛指非關係型資料庫的,隨著 web 2.0 互聯網的誕生!傳統的關係型資料庫很難對付 web 2.0 時代!尤其是超大規模的高併發的社區!暴露出來很多難以剋服的問題 NoSQL 在當今大數據環境下發展的十分迅速,Redis 是發展最快,而且是我們當下必須要掌握的一個技術!

很多的數據類型比如用戶的個人信息,社交網路,地理位置。這些數據類型的存儲不需要一個固定的格式!不需要多餘的操作就可以橫向擴展的。Map<String, Object> 使用鍵值對來控制。

NoSQL 的特點

1、方便擴展(數據之間沒有關係,很好擴展)

2、大數據量高性能(Redis一秒寫8萬次,讀取 11 萬次,NoSQL的緩存記錄級,是一種細粒度的緩存,性能會比較高)

3、數據類型是多樣型的(不需要事先設計資料庫,隨取隨用)

傳統 RDBMS 和 NoSQL的比較

傳統的 RDBS
- 結構化組織
- SQL
- 數據和關係都存在單獨的表中
- 操作語言,資料庫定義語言
- 嚴格的一致性
- 基礎的事務
- ...
NoSQL
- 不僅僅是數據
- 沒有固定的查詢語言
- 鍵值對存儲,列存儲,文檔存儲,圖形資料庫
- 最終一致性
- CAP 定理和 BASE (異地多活)
- 高性能,高可用,高可擴

2、NoSQL 的四大分類

KV 鍵值對:Redis

文檔型資料庫(bson 和 json 一樣):

  • MongoDB:
    • MongoDB 是一個基於分散式文件儲存的資料庫,使用 C++編寫,主要用來處理大量的文檔。
    • MongoDB 是一個介於關係型資料庫和非關係型數據中間的產品!MongoDB 是非關係型數據中功能最豐富,最像關係型資料庫的。
  • ConthDB

列存儲資料庫:

  • HBase
  • 分散式文件系統

圖關係資料庫:

  • 他不是存圖形,放的是關係,比如:朋友圈社交網路,廣告推薦
  • Neo4j、InfoGrid

3、Redis 入門

Redis (Remote Dictionary Server),即遠程字典服務!

是一個開源的使用 ANSI C語言編寫、支持網路、可基於記憶體亦可持久刷的日誌型、key-value 資料庫,並提供多種語言的 API。免費和開源!是當下最熱門的NoSQL 技術之一,也被人們稱之為機構化資料庫。

Redis 的作用

1、記憶體存儲、持久化(RDB 和 AOF)

2、效率高,可以用於高速緩存

3、發佈訂閱系統

4、地圖信息分析

5、計數器、計時器(比如瀏覽量)

Redis 的特征:

1、多樣化的數據類型

2、持久化

3、集群

4、事務

Redis 官網: https://redis.io/

Redis 中文網: http://www.redis.cn/

4、Redis 安裝啟動

到官網下載壓縮包,上傳到伺服器

[root@itzhouc opt]# ll
-rw-r--r-- 1 root root 2002463 Apr 29 00:18 redis-5.0.8.tar.gz
[root@itzhouc opt]# tar -zxvf redis-5.0.8.tar.gz 		# 解壓
[root@itzhouc redis-5.0.8]# yum install gcc-c++			# 增加環境支持
[root@itzhouc redis-5.0.8]# make					   # 安裝
[root@itzhouc redis-5.0.8]# make install
[root@itzhouc redis-5.0.8]# cd /usr/local/bin		    # 進入Redis的預設安裝目錄
[root@itzhouc bin]# ls
jemalloc-config  jeprof            luajit        mcrypt    redis-benchmark  redis-check-rdb  redis-sentinel
jemalloc.sh      libmcrypt-config  luajit-2.0.4  mdecrypt  redis-check-aof  redis-cli        redis-server

拷貝配置文件:

[root@itzhouc bin]# mkdir kconfig
[root@itzhouc bin]# cp /opt/redis-5.0.8/redis.conf kconfig/
[root@itzhouc bin]# cd kconfig/
[root@itzhouc kconfig]# ls
redis.conf

修改配置文件為後臺啟動:

[root@itzhouc kconfig]# pwd
/usr/local/bin/kconfig
[root@itzhouc kconfig]# vim redis.conf 

修改配置項:

  • daemonizeyes

  • 註釋掉 bind 127.0.0.1

  • 修改protected-mode no

啟動 Redis

[root@itzhouc bin]# ls
jemalloc-config  jeprof   libmcrypt-config  luajit-2.0.4  mdecrypt         redis-check-aof  redis-cli       redis-server
jemalloc.sh      kconfig  luajit            mcrypt        redis-benchmark  redis-check-rdb  redis-sentinel
[root@itzhouc bin]# redis-server kconfig/redis.conf #通過特定的配置文件啟動Redis
8178:C 29 Apr 2020 08:43:40.043 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8178:C 29 Apr 2020 08:43:40.043 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=8178, just started
8178:C 29 Apr 2020 08:43:40.043 # Configuration loaded

使用客戶端連接和測試:

[root@itzhouc bin]# redis-cli -p 6379 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name test
OK
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> 

查看 Redis 進程:再開一個視窗

[root@itzhouc ~]# ps -ef|grep redis
root      8179     1  0 08:43 ?        00:00:00 redis-server 127.0.0.1:6379
root      8210  3437  0 08:44 pts/1    00:00:00 redis-cli -p 6379
root      8306  8281  0 08:48 pts/2    00:00:00 grep --color=auto redis

退出Redis:

127.0.0.1:6379> shutdown		# 關閉Redis 
not connected> exit				# 退出
[root@itzhouc bin]# ps -ef|grep redis
root      8330  3437  0 08:49 pts/1    00:00:00 grep --color=auto redis
[root@itzhouc bin]# 

後面可能會用到單機多 Redis 啟動集群測試。

5、Redis 性能測試

redis-benchmark 是官網自帶的壓力測試工具。

序號 選項 描述 預設值
1 -h 指定伺服器主機名 127.0.0.1
2 -p 指定伺服器埠 6379
3 -s 指定伺服器 socket
4 -c 指定併發連接數 50
5 -n 指定請求數 10000
6 -d 以位元組的形式指定 SET/GET 值的數據大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用隨機 key, SADD 使用隨機值
9 -P 通過管道傳輸 請求 1
10 -q 強制退出 redis。僅顯示 query/sec 值
11 --csv 以 CSV 格式輸出
12 -l 生成迴圈,永久執行測試
13 -t 僅運行以逗號分隔的測試命令列表。
14 -I Idle 模式。僅打開 N 個 idle 連接並等待。

使用方式:

# 測試 100 個併發連接,100000 個請求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

分析舉例:

====== SET ======
  100000 requests completed in 1.97 seconds		  # 對 10萬個請求進行寫入測試
  100 parallel clients							# 100 個併發客戶端 
  3 bytes payload								# 每次寫入 3 個位元組
  keep alive: 1									# 只有一臺伺服器來處理這些請求,即單機性能

19.56% <= 1 milliseconds
98.70% <= 2 milliseconds
99.82% <= 3 milliseconds
99.85% <= 9 milliseconds
99.94% <= 10 milliseconds
99.95% <= 126 milliseconds
99.96% <= 127 milliseconds
100.00% <= 127 milliseconds					# 所有請求在127 毫秒處理完成
50761.42 requests per second				# 每秒處理 50761.42 個請求

6、基礎知識

Redis 預設有 16 個資料庫,這個可以在配置文件中查看。

[root@itzhouc bin]# vim kconfig/redis.conf 

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

預設使用的是第 0 個。

使用 select 命令切換資料庫,使用 dbsize查看資料庫大小:

[root@itzhouc bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> select 3		# 切換資料庫
OK
127.0.0.1:6379[3]> dbsize		# 查看資料庫大小
(integer) 0
127.0.0.1:6379[3]> set name jack
OK
127.0.0.1:6379[3]> dbsize
(integer) 1
127.0.0.1:6379[3]> 

查看資料庫中所有的key

127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]> 

清除當前資料庫:

127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> keys *
(empty list or set)

清除所有資料庫:

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)

7、Redis 是單線程的什麼這麼快(面試題)

Redis 是很快的,官方表示,Redis 是基於記憶體操作,CPU 不是 Redis 的性能瓶頸,Redis 的性能瓶頸是機器的記憶體和網路帶寬。既然可以單線程來實現,就使用單線程。

Redis 是 C 語言寫的,官方提供的數據為 100000+ 的 QPS ,完全不比同樣是使用 key-value 的Memecache 差。

Redis 為什麼單線程還這麼快呢?

1、誤區1:高性能的伺服器一定是多線性的?

2、誤區2:多線程一定比單線程的效率高?

要瞭解在執行效率上 CPU > 記憶體 > 硬碟

核心:Redis 是將所有的數據全部放在記憶體中的,所有說使用單線程去操作執行效率就是最高的,多線程在執行過程中需要進行 CPU 的上下文切換,這個是耗時操作。對於記憶體系統來說,如果沒有上下文切換效率就是最高的,多次讀寫都是在一個 CPU 上的,在記憶體情況下,這個就是最佳方案。

redis 採用網路IO多路復用技術來保證在多連接的時候, 系統的高吞吐量。 參考文章

下一篇筆記將介紹 Redis 的五大數據類型和三個特殊類型。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如何在Vmware中創建Linux虛擬機並設置Vmware和虛擬機網路 創建Linux虛擬機 創建虛擬機 配置類型選擇自定義 虛擬機硬體相容性,選擇當前Vmware版本即可 選擇要使用的Linux ISO鏡像文件,鏡像從“阿裡雲鏡像站”下載。 虛擬機命名與虛擬機存放位置 虛擬機CPU核數配置 虛擬機 ...
  • 用戶和組的相關概念 賬號:是一種用來記錄單個用戶或是多個用戶的數據。在Linux 上的賬號可以分成兩類: 用戶賬號 用來儲存單一用戶的數據,你可以使用一個用戶賬號,來儲存某一個用戶的數據。 群組賬號 用來儲存多個用戶的信息,每一個群組賬號可以用來記錄一組用戶的數據。 依照賬號的位置 本機賬號: 儲存 ...
  • 目錄操作 基礎目錄操作 linux 沒有類似windows一樣的盤符之分,所有的目錄都是以“根‘ / ’”開始,linux 是多用戶登陸, 在 /home/ 的目錄下,存放著已添加用戶的用戶目錄。每個用戶一個文件夾,文件夾名為用戶名 // 下文中 $ 表示終端的提示符,不包含在命令當中 $ pwd ...
  • NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。 Redis 系列: 1. Redis系列(一)Redis入門 2. Redis系列(二)Redi... ...
  • NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。 Redis 系列: 1. Redis系列(一)Redis入門 2. Redis系列(二)Redi... ...
  • NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。 Redis 系列: 1. Redis系列(一)Redis入門 2. Redis系列(二)Redi... ...
  • NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。 Redis 系列: 1. Redis系列(一)Redis入門 2. Redis系列(二)Redi... ...
  • NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。 Redis 系列: 1. Redis系列(一)Redis入門 2. Redis系列(二)Redi... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...