NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。 Redis 系列: 1. Redis系列(一)Redis入門 2. Redis系列(二)Redi... ...
NoSQL 開發中或多或少都會用到,也是面試必問知識點。最近這幾天的面試每一場都問到了。但是感覺回答的並不好,還有很多需要梳理的知識點。這裡通過幾篇 Redis 筆記整個梳理一遍,後面再加上面試題。
Redis 系列:
- Redis系列(一)Redis入門
- Redis系列(二)Redis的8種數據類型
- Redis系列(三)Redis的事務和Spring Boot整合
- Redis系列(四)Redis配置文件和持久化
- Redis系列(五)發佈訂閱模式、主從複製和哨兵模式
- Redis系列(六)Redis 的緩存穿透、緩存擊穿和緩存雪崩
- 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
修改配置項:
-
daemonize
為yes
。 -
註釋掉
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 的五大數據類型和三個特殊類型。