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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...