一、Redis基本概念
1.1 Redis簡介
Redis(遠程字典服務器) 是一個開源的、使用 C 語言編寫的 NoSQL 數據庫。
Redis 基于內存運行并支持持久化,采用key-value(鍵值對)的存儲形式,是目前分布式架構中不可或缺的一環。
Redis服務器程序是單進程模型,也就是在一臺服務器上可以同時啟動多個Redis進程,Redis的實際處理速度則是完全依靠于主進程的執行效率。若在服務器上只運行一個Redis進程,當多個客戶端同時訪問時,服務器的處理能力是會有一定程度的下降;若在同一臺服務器上開啟多個Redis進程,Redis在提高并發處理能力的同時會給服務器的CPU造成很大壓力。即:在實際生產環境中,需要根據實際的需求來決定開啟多少個Redis進程。若對高并發要求更高一些,可能會考慮在同一臺服務器上開啟多個進程。若CPU資源比較緊張,采用單進程即可。
1.2 Redis的優點
1)具有極高的數據讀寫速度:數據讀取的速度最高可達到 110000 次/s,數據寫入速度最高可達到 81000 次/s;
2)支持豐富的數據類型:支持 key-value、Strings、Lists、Hashes、Sets 及 Sorted Sets 等數據類型操作;
3)支持數據的持久化:可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用;
4)原子性:Redis 所有操作都是原子性的;
5)支持數據備份:即 master-salve 模式的數據備份。
1.3 使用場景
Redis作為基于內存運行的數據庫,是一個高性能的緩存,一般應用在Session緩存、隊列、排行榜、計數器、最近最熱文章、最近最熱評論、發布訂閱等。
Redis 適用于數據實時性要求高、數據存儲有過期和淘汰特征的、不需要持久化或者只需要保證弱一致性、邏輯簡單的場景。
我們通常會將部分數據放入緩存中,來提高訪問速度,然后數據庫承擔存儲的工作。
1.4 適合放入緩存中的數據
●即時性。例如查詢最新的物流狀態信息。
●數據一致性要求不高。例如門店信息,修改后,數據庫中已經改了,五分鐘后緩存中才是最新的,但不影響功能使用。
●訪問量大且更新頻率不高,例如網站首頁的廣告信息,訪問量大,但是不會經常變化。
1.5 Redis快速的原因
1)redis基于內存運行,數據操作都是內存中完成的;
2)數據讀寫采用單線程模式,避免了多線程切換的CPU性能消耗,同時也不用考慮各種鎖的問題;
3)采用IO多路復用模型,可以使線程處理更多的網絡連接請求,提高并發能力。
1.6 Redis數據類型
字符型(string): 普通字符串
哈希(hash): 鍵值對的 鍵值對
列表 (linked lists): 類似于 數組
集合(set): 無序
有序集合(sorted set): 排行榜
二、Redis安裝部署
環境準備
#開機自動關閉防火墻
systemctl disable firewalld --now#永久關閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
修改內核參數
vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 2048#vm.overcommit_memory:該配置項用于設置內存超額分配策略。
#當值為 0 時,表示內核會根據實際情況動態分配內存,但這可能導致內存超額分配,當系統內存不足時,可能會引發OOM(Out of Memory)錯誤。
#將其設置為 1 可以禁用內存超額分配,確保只有在內存充足的情況下才能進行內存分配。這對于確保系統穩定性和可靠性是有幫助的。#net.core.somaxconn:該配置項用于設置系統中允許的最大掛起連接數。
#當系統接收到大量并發連接請求時,如果系統的連接隊列已滿,則新的連接請求會被拒絕。
#通過增加 net.core.somaxconn 的值,可以增加系統的連接隊列大小,從而提高系統處理并發連接請求的能力。sysctl -p
#刷新配置文件
安裝redis
1)安裝依賴
[root@centos7 ~]#yum -y install gcc jemalloc-devel
#安裝依賴包centos
[root@centos7 ~]#yum -y install gcc jemalloc-devel systemd-devel
#如果支持systemd需要安裝下面包
ubentu
[root@ubuntu1804 ~]#apt -y install make gcc libjemalloc-dev libsystemd-dev2)下載安裝包
[root@localhost ~]#cd /data
[root@localhost ~]#wget http://download.redis.io/releases/redis-5.0.7.tar.gz3)解壓
[root@centos7 ~]#tar xvf redis-5.0.7.tar.gz4)編譯安裝
[root@centos7 ~]#cd redis-5.0.7/[root@centos7 redis-5.0.7]#make PREFIX=/apps/redis install #指定redis安裝目錄[root@centos7 redis-5.0.7]#make USE_SYSTEMD=yes PREFIX=/apps/redis install
#如果支持systemd,需要執行下面5)配置變量
[root@centos7 ~]#echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
[root@centos7 ~]#. /etc/profile.d/redis.sh6)準備配置文件及目錄
[root@centos7 ~]#mkdir /apps/redis/{etc,log,data,run}
#創建配置文件、日志、數據等目錄[root@centos7 redis-5.0.7]#cp redis.conf /apps/redis/etc/
#源碼包中自帶 配置文件7)準備用戶 修改權限
[root@centos7 ~]#useradd -r -s /sbin/nologin redis[root@centos7 ~]#chown -R redis.redis /apps/redis/
#設置目錄權限
[root@centos7 ~]#ln -sv /apps/redis/bin/redis-* /usr/bin/
#設置軟連接8)準備service文件
[root@centos7 ~]#vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
#Type=notify 如果支持systemd可以啟用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755[Install]
WantedBy=multi-user.target9)啟動redis
[root@centos7 ~]# systemctl daemon-reload
[root@centos7 ~]# systemctl start redis
redis配置文件修改
vim /apps/redis/etc/redis.confbind 127.0.0.1
0.0.0.0 #69行 ,添加監聽的主機地址,0.0.0.0表示監聽任意地址
protected-mode no
#89行,將本機訪問保護模式設置no。如果開啟了,那么在沒有設定bind ip且沒有設密碼的情況下,Redis只允許接受本機的響應
port 6379 #93行,Redis默認的監聽6379端口
daemonize yes #137行,設置為守護進程。后臺啟動
pidfile /apps/redis/run/redis_6379.pid
#159行,指定PID文件
logfile /apps/redis/log/redis6379.log
#172行,指定日志文件
dir /apps/redis/data
#264行,指定持久化文件所在目錄
requirepass abc123
#508行,增加一行,設置redis密碼
ss -natp |grep redis
三、Redis基礎命令
3.1 set和get命令
set
和get
命令用于設置和獲取鍵值對的。
set用于存放數據
set key value [EX seconds] [PX milliseconds] [NX|XX]#key 為鍵名
#value為鍵值
127.0.0.1:6379> set name cxk
get用于獲取數據
127.0.0.1:6379> get name
3.2 keys 命令
keys命令用于查詢鍵,支持通配符*
和?。
#先賦值
127.0.0.1:6379> set k1 1
127.0.0.1:6379> set k2 2
127.0.0.1:6379> set k3 3
127.0.0.1:6379> set k4 4
#查看當前數據庫中所有鍵
keys *
127.0.0.1:6379> KEYS k*
#查看當前數據庫中以 k 開頭的數據127.0.0.1:6379> KEYS k?
#查看當前數據庫中以 k 開頭后面包含任意一位的數據127.0.0.1:6379> KEYS k??
#查看當前數據庫中以 k 開頭 k 開頭后面包含任意兩位的數據
3.3 del命令
刪除當前數據庫的指定鍵。
127.0.0.1:6379> del k1127.0.0.1:6379> get k1
3.4 exists命令
判斷鍵是否存在,1表示鍵存在,0表示鍵不存在。
3.5 type命令
查看鍵的數據類型。
3.6 expire 命令
為已存在的鍵設置過期時間。
3.7 ttl 命令
查看鍵的生命周期時間,-1表示永不過期,-2表示已過期。
3.8 rename 命令
重命名鍵名,會覆蓋已存在的鍵的值。
#命令格式
rename 源key 目標key
3.9 renamenx 命令
重命名鍵名,如果新鍵已存在則不執行重命名操作即不會覆蓋。
#命令格式
renamenx 源key 目標key
3.10 dbsize 命令
統計當前庫的鍵的數量。
3.11? FLUSHALL
強制清空當前redis服務器所有數據庫中的所有key,即刪除所有數據,此命令慎用!
127.0.0.1:6379> FLUSHALL OK#生產建議修改配置 /etc/redis.conf
rename-command FLUSHALL ""
#rename-command 在6.2.4版淘汰了
3.11?SHUTDOWN
# 停止所有客戶端
如果有至少一個保存點在等待,執行 SAVE 命令
如果 AOF 選項被打開,更新 AOF 文件
關閉 redis 服務器(server)
如果持久化被打開的話, SHUTDOWN 命令會保證服務器正常關閉而不丟失任何數據。
另一方面,假如只是單純地執行 SAVE 命令,然后再執行 QUIT 命令,則沒有這一保證 —— 因為在執行SAVE 之后、執行 QUIT 之前的這段時間中間,其他客戶端可能正在和服務器進行通訊,這時如果執行 QUIT 就會造成數據丟失。