NoSQL 開發中或多或少都會用到,也是面試必問知識點,最近這幾天的面試每一場都問到了,但是感徑訓答的并不好,還有很多需要梳理的知識點,這里通過幾篇 Redis 筆記整個梳理一遍,后面再加上面試題,
Redis 系列:
- Redis系列(一)Redis入門
- Redis系列(二)Redis的8種資料型別
- Redis系列(三)Redis的事務和Spring Boot整合
- Redis系列(四)Redis組態檔和持久化
- 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 的五大資料型別和三個特殊型別,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/3169.html
標籤:NoSQL
