【Redis一】Redis配置與優化

目錄

一.關系型數據庫與非關系型數據庫

1.關系型數據庫

2.非關系型數據庫

3.二者區別

4.非關系型數據庫產生背景

5.NoSQL與SQL數據記錄對比

關系型數據庫

非關系型數據庫

二.Redis相關概述

1.簡介

2.五大數據類型

3.優缺點

3.1.優點

3.2.缺點

4.使用場景

5.采用單線程的原因

6.哪些數據適合放入緩存中

7.運行速度快的原因

8.與memcached比較

三.Redis的安裝配置

1.源碼編譯安裝

2.redis服務管理

五.Redis的命令工具

1.redis-cli 命令行工具

2.redis-benchmark 測試工具

2.1.并發連接

2.2.數據包的存取的性能測試

2.3.鍵值對的創建速度測試

六.Redis 數據庫常用命令

1.redis鍵值對的存取?

2.redis鍵值列表的獲取

2.1.獲取全部列表

2.2.獲取以某字符為開頭任意長度的鍵

2.3.獲取以某字符為開頭,后面為指定長度的鍵

3.判斷鍵是否存在?

4.刪除鍵

5.查看鍵存儲的數據類型

6.rename?重命名

7.renamenx 重命名

8.dbsize查看鍵數目?

9.設置和清空密碼

設置和查看密碼

清空密碼

七.Redis 多數據庫操作

1.多數據庫間切換select

2.多數據庫間移動數據

3.清除數據庫內數據(慎用)

八.Redis 常見錯誤與解決方案

1.常見運維故障

2.故障排查


一.關系型數據庫與非關系型數據庫

1.關系型數據庫

2.非關系型數據庫

3.二者區別

SQLNoSQL
存儲結構二維表格結構不是二維表格結構,不同的NoSQL采用不同的存儲方式(比如鍵對值、文檔、索引、圖形結構、時間序列等)
擴展方式縱向擴展(提升單機的硬件性能)橫向擴展(增加服務器節點數量)
事務典型基于ACID原則,對事務控制更穩定,細粒度更高基于BASE原則,對事務控制的穩定性和細粒度不如SQL
典型代表

4.非關系型數據庫產生背景

可用于應對Web2.0純動態網站類型的三高問題

  • High performance —— 對數據庫高并發讀寫需求
  • Hugestorage——對海量數據高效存儲與訪問需求
  • HighScalability&&HighAvailability——對數據庫高可擴展性與高可用性需求

關系型數據庫和非關系型數據庫都有各自的特點與應用場景,兩者的緊密結合將會給Web2.0的數

據庫發展帶來新的思路。讓關系型數據庫關注在關系上和對數據的一致性保障,非關系型數據庫關

注在存儲和高效率上。例如,在讀寫分離的MySQL數據庫環境中,可以把經常訪問的數據存儲在

非關系型數據庫中,提升訪問速度

5.NoSQL與SQL數據記錄對比

關系型數據庫

  • 實例-->數據庫-->表(table)-->記錄行(row)、數據字段(column)

非關系型數據庫

  • 實例-->數據庫-->集合(collection)-->鍵值對(key-value)
  • 非關系型數據庫不需要手動建數據庫和集合(表)

二.Redis相關概述

1.簡介

2.五大數據類型

基礎數據類型包括:string(字符串)、list(列表,雙向鏈表)、hash(散列,鍵值對集合)、set(集合,不重復)和sorted set也可以稱為Zset(有序集合)

結構類型結構存儲的值結構的讀寫能力
String可以是字符串、整數、浮點數對整個字符串或者字符串的其中一部分進行操作,對整數和浮點數執行自增或者自減操作
list一個鏈表,鏈表上每個節點都包含了一個字符串從鏈表的兩端推入或者彈出元素:根據偏移量對鏈表進行修剪:讀取單個或多個元素,根據值查找或者移除元素
set包含字符串的無序收集器,并且被包含的每個字符串都是獨一無二各不相同的添加、獲取、移除單個元素,檢查一個元素是否存在與集合中,計算交集、并集、差集,從集合里面隨機獲取元素
hash包含鍵值對的無序散列表添加、獲取、移除單個鍵值對,獲取所有鍵值對
zset字符串成員與浮點數分值之間的有序映射,元素的排列順序由分值的大小決定添加、獲取、刪除單個元素,根據分值范圍或者成員來獲取元素

3.優缺點

3.1.優點

3.2.缺點

  • 緩存和數據庫雙寫一致性問題
  • 緩存雪崩問題
  • 緩存擊穿問題
  • 緩存的并發競爭問題

4.使用場景

  • Redis作為基于內存運行的數據庫,是一個高性能的緩存,一般應用在Session緩存、隊列、排行榜、計數器、最近最熱文章、最近最熱評論、發布訂閱等
  • Redis 適用于數據實時性要求高、數據存儲有過期和淘汰特征的、不需要持久化或者只需要保證弱一致性、邏輯簡單的場景
  • 通常會將部分數據放入緩存中,來提高訪問速度,然后數據庫承擔存儲的工作

5.采用單線程的原因

首先要明確的是Redis單線程指的是網絡IO和鍵值對讀寫是由一個線程來完成的,但Redis持久

化、集群數據等是由額外的線程執行的。了解Redis使用單線程之前可以先了解一下多線程的開

通常情況下,使用多線程可以增加系統吞吐率或者可以增加系統擴展性,但多線程通常會存在同時

訪問某些共享資源,為了保證訪問共享資源的正確性,就需要有額外的機制進行保證,這個機制首

先會帶來一定的開銷。其實對于多線程并發訪問的控制一直是一個難點問題,如果沒有精細的設

計,比如說,只是簡單地采用一個粗粒度互斥鎖,就會出現不理想的結果。即使增加了線程,大部

分線程也在等待獲取訪問共享資源的互斥鎖,并行變串行,系統吞吐率并沒有隨著線程的增加而增

此外

值得注意的是在Redis6.0中引入了多線程。在Redis6.0之前,從網絡IO處理到實際的讀寫命令處理

都是由單個線程完成的,但隨著網絡硬件的性能提升,Redis的性能瓶頸有可能會出現在網絡IO的

處理上,也就是說單個主線程處理網絡請求的速度跟不上底層網絡硬件的速度。針對此問題,

Redis采用多個IO線程來處理網絡請求,提高網絡請求處理的并行度,但多IO線程只用于處理網絡

請求,對于讀寫命令,Redis仍然使用單線程處理!

6.哪些數據適合放入緩存中

  • 即時性? ?例如查詢最新的物流狀態信息。
  • 數據一致性要求不高? ?例如門店信息,修改后,數據庫中已經改了,五分鐘后緩存中才是最新的,但不影響功能使用。
  • 訪問量大且更新頻率不高? ?例如網站首頁的廣告信息,訪問量大,但是不會經常變化。
    ?

7.運行速度快的原因

  • Redis是基于內存運行,數據的讀寫都是在內存中完成的
  • 數據結構簡單,可以直接使用 鍵值對 的方式存儲數據
  • 數據讀寫采用單線程模型,避免了多線程切換帶來的CPU性能損耗,同時也不用考慮各種鎖的影響
  • 采用IO多路復用模型,非阻塞IO可以使網絡線程處理更多的網絡連接請求,提高了網絡并發能力

8.與memcached比較

三.Redis的安裝配置

1.源碼編譯安裝

---------------------- Redis 安裝部署 ----------------------------------------
//環境準備
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config#修改內核參數
vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 2048sysctl -p//安裝redis
yum install -y gcc gcc-c++ makecd /opt/tar xf redis-7.0.13.tar.gz
cd /redis-7.0.13
make
make PREFIX=/usr/local/redis install
#由于Redis源碼包中直接提供了 Makefile 文件,所以在解壓完軟件包后,不用先執行 ./configure 進行配置,可直接執行 make 與 make install 命令進行安裝。#創建redis工作目錄
mkdir /usr/local/redis/{conf,log,data}cp /opt/redis-7.0.13/redis.conf /usr/local/redis/conf/useradd -M -s /sbin/nologin redis
chown -R redis.redis /usr/local/redis/#環境變量
vim /etc/profile 
PATH=$PATH:/usr/local/redis/bin		#增加一行source /etc/profile//修改配置文件
vim /usr/local/redis/conf/redis.conf
bind 127.0.0.1 192.168.80.108					#87行,添加 監聽的主機地址
protected-mode no					#111行,將本機訪問保護模式設置no。如果開啟了,那么在沒有設定bind ip且沒有設密碼的情況下,Redis只允許接受本機的響應
port 6379										#138行,Redis默認的監聽6379端口
daemonize yes									#309行,設置為守護進程,后臺啟動
pidfile /usr/local/redis/log/redis_6379.pid		#341行,指定 PID 文件
logfile "/usr/local/redis/log/redis_6379.log"	#354行,指定日志文件
dir /usr/local/redis/data						#504行,指定持久化文件所在目錄
requirepass abc123								#1037行,增加一行,設置redis密碼

2.redis服務管理

//定義systemd服務管理腳本
vim /usr/lib/systemd/system/redis-server.service
[Unit]
Description=Redis Server
After=network.target[Service]
User=redis
Group=redis
Type=forking
TimeoutSec=0
PIDFile=/usr/local/redis/log/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target#啟動服務
systemctl start redis-server
systemctl enable redis-servernetstat -lntp | grep 6379

五.Redis的命令工具

redis-server用于啟動redis的工具
redis-benchmark用于檢測redis在本機的運行效率
redis-check-aof修復AOF持久化文件
redis-check-rdb修復RDB持久化文件
redis-cliredis命令行工具
redis-sentinelRedis 哨兵集群使用

1.redis-cli 命令行工具

語法:redis-cli -h host -p port [-a password]
-h :指定遠程主機
-p :指定 Redis 服務的端口號
-a :指定密碼,未設置數據庫密碼可以省略-a 選項
若不添加任何選項表示,則使用 127.0.0.1:6379 連接本機上的 Redis 數據庫redis-cli -h 192.168.80.108 -p 6379 -a 'abc123'  

2.redis-benchmark 測試工具

redis-benchmark 是官方自帶的 Redis 性能測試工具,可以有效的測試 Redis 服務的性能

基本的測試語法:redis-benchmark [選項] [選項值]
-h :指定服務器主機名
-p :指定服務器端口
-s :指定服務器 socket
-c :指定并發連接數
-n :指定請求數
-d :以字節的形式指定 SET/GET 值的數據大小
-k :1=keep alive 0=reconnect 
-r :SET/GET/INCR 使用隨機 key, SADD 使用隨機值
-P :通過管道傳輸<numreq>請求
-q :強制退出 redis。僅顯示 query/sec 值
--csv :以 CSV 格式輸出
-l :生成循環,永久執行測試
-t :僅運行以逗號分隔的測試命令列表
-I :Idle 模式。僅打開 N 個 idle 連接并等待

2.1.并發連接

redis-benchmark -h 192.168.80.108 -p 6379 -a 'abc123' -c 100 -n 100000

2.2.數據包的存取的性能測試

redis-benchmark -h 192.168.80.108 -p 6379 -a 'abc123' -q -d 100

2.3.鍵值對的創建速度測試

redis-benchmark -t set,lpush -a 'abc123' -n 100000 -q

六.Redis 數據庫常用命令

set存放數據
get獲取數據
keys *查看所有的key
keys k?查看k開頭后面任意一位的數據
exists判斷鍵是否存在(存在1,不存在0)
del刪除鍵
type查看鍵對應的value值類型
rename key1 key2改名,不管key2是否存在都會改名成功。如果存在,key1的值會覆蓋key2得值
renamenx key1 key2改名,若key2不存在,可以改名成功。若key2存在則不進行改名
dbsize查看當前數據庫中key的數目

1.redis鍵值對的存取?

set:存放數據,命令格式為 set key valueget:獲取數據,命令格式為 get key

2.redis鍵值列表的獲取

設置鍵值

2.1.獲取全部列表

2.2.獲取以某字符為開頭任意長度的鍵

keys h*

2.3.獲取以某字符為開頭,后面為指定長度的鍵

添加測試數據

keys v??
keys v???
keys v????

3.判斷鍵是否存在?

exists  鍵   #返回結果 為0 則為不存在,返回為1即為存在

4.刪除鍵

del 鍵

5.查看鍵存儲的數據類型

 type 鍵

6.rename?重命名

  • 使用rename命令進行重命名時,無論目標key是否存在都會進行重命名,且源key的值會覆蓋目標key的值
  • 在實際使用過程中,建議先用exists命令查看目標key 是否存在,然后再決定是否執行rename 命令,以避免覆蓋重要數據
命令格式: rename 源key 目標key

7.renamenx 重命名

  • 是對已有 key 進行重命名,并檢測新名是否存在,如果目標 key 存在則不進行重命名。(不覆蓋)
命令格式:renamenx  源key 目標key

8.dbsize查看鍵數目?

dbsize

9.設置和清空密碼

設置和查看密碼

#設置redis的登錄密碼
config set requirepass 123123
#查看redis的密碼
config get requirepass 

清空密碼

#清空密碼config set requirepass '' 

七.Redis 多數據庫操作

  • Redis 支持多數據庫,Redis默認情況下包含16個數據庫,數據庫名稱是用數字0-15來依次命名的
  • 使用redis-cli連接Redis數據庫后,默認使用的是序號為0的數據庫
  • 多數據庫相互獨立,互不干擾

1.多數據庫間切換select

 命令格式:select 序號?#使用redis-cli連接Redis數據庫后,默認使用的是序號為0的數據庫。127.0.0.1:6379>select 10      #切換至序號為10的數據庫?127.0.0.1:6379[10]>select 15  #切換至序號為15的數據庫?127.0.0.1:6379[15]>select 0   #切換至序號為0的數據庫?127.0.0.1:6379[0]>

2.多數據庫間移動數據

move 鍵值 序號(庫的序號)

3.清除數據庫內數據(慎用)

 FLUSHDB:清空當前數據庫數據FLUSHALL:清空所有數據庫的數據,

八.Redis 常見錯誤與解決方案

1.常見運維故障

  • 使用 keys* 把庫堵死。——建議使用別名把這個命令改名
  • 超過內存使用后,部分數據被刪除。——這個有刪除策略的,選擇適合自己的即可
  • 沒開持久化,卻重啟了實例,數據全掉。——記得非緩存的信息需要打開持久化
  • RDB的持久化需要 Vm.overcommit_memory=1 ,否則會持久化失敗
  • 沒有持久化情況下,主從,主重啟太快,從還沒認為主掛的情況下,從會清空自己的數據,人為重啟主節點前,先關閉從節點的同步

2.故障排查

  • 結合Redis 監控查看QPS、緩存命中率、內存使用率等信息
  • 確認機器層面的資源是否有異常
  • 故障時及時上機,使用 redis-cli monitor 打印出操作日志,然后分析(事后分析此條失效)
  • 和研發溝通,確認是否有大Key在堵塞(大Key也可以在日常的巡檢中獲得) 和組內同事溝通,確實是否有誤操作
  • 和運維同事、研發一起排查流量是否正常,是否存在被刷的情況

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36295.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36295.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蘋果應用Testflight上架完整步聚

1.全部選中下圖內容,包含iPhone與iPad屏幕所有旋轉方向 2. 準備App圖標,一定要有152和167這個尺寸,不然后提交不過 3.1024這個尺寸的的圖像不能有透明層,不然提交不通過 4.選中編譯設備為Any iOS Device[arm64] 5.選擇Product下的Archive進行生成 6.在彈出的窗口中選擇Test…

Python之三大基本庫——Numpy(2)

接著上次的內容接著講&#xff0c;連續號都續上哈 七、numpu中random的隨機生成函數 以下總結的是比較常用到的函數&#xff1a; 下面分別介紹一下不用的用法&#xff1a; 首先導入創建函數 import numpy as np np.random.seed(666)1、 rand(d0,d1,d2,...,dn)&#xff1a;返…

JavaWeb系列三: JavaScript學習 下

文章目錄 js數組定義方式數組遍歷 js函數函數入門函數使用方式使用方式一使用方式二 函數注意事項函數練習題 定義對象使用object定義使用{}定義 事件onload事件onclick事件失去焦點事件內容發生改變事件表單提交事件靜態注冊動態注冊表單作業 dom對象文檔對象模型document對象…

JDK-調度線程池

歸檔 GitHub: JDK-調度線程池 使用示例 https://github.com/zengxf/small-frame-demo/blob/master/jdk-demo/simple-demo/src/main/java/test/jdkapi/juc/thread_pool/TestSchedule.java JDK 版本 openjdk version "17" 2021-09-14 OpenJDK Runtime Environment…

邊緣計算VNC智能盒子如何助力HMI設備實現二次開發?

HMI&#xff08;Human-Machine Interface&#xff09;又稱人機界面&#xff0c;是用戶與機器之間交互和通信的媒介。今天帶你了解智能盒子如何助力HMI設備實現二次開發&#xff1f; HMI設備被廣泛應用在工業自動化中&#xff0c;具有顯示設備信息&#xff0c;實時監測&#xf…

python爬蟲--scrapy框架

Scrapy 一 介紹 Scrapy簡介 1.Scrapy是用純Python實現一個為了爬取網站數據、提取結構性數據而編寫的應用框架&#xff0c;用途非常廣泛2.框架的力量&#xff0c;用戶只需要定制開發幾個模塊就可以輕松的實現一個爬蟲&#xff0c;用來抓取網頁內容以及各種圖片&#xff0c;非…

GPT-5對普通人有何影響

這篇文章對ChatGPT的使用方法和提問技巧進行了討論&#xff0c;重點強調了背景信息和具體提問的重要性。文章清晰地傳達了如何提高ChatGPT回答的質量&#xff0c;以及個人在使用ChatGPT時的體會和建議。然而&#xff0c;文章在邏輯組織和表達方面還有一些可以改進的地方&#x…

Spring Boot與分布式事務的最佳實踐

Spring Boot與分布式事務的最佳實踐 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來探討在Spring Boot應用中如何實現分布式事務的最佳實踐。 什么是…

Android Launcher-----MainThreadInitializedObject介紹

MainThreadInitializedObject 是 Android 開發中用于確保對象在主線程上初始化的一種設計模式 一、用途 MainThreadInitializedObject 通常用于確保那些需要在主線程上創建的對象&#xff08;比如UI組件或依賴于主線程環境的對象&#xff09;能夠安全地進行初始化 二、優點 …

LeetCode.438找到字符串中所有字母異位詞

問題描述 給定兩個字符串s和p&#xff0c;找到s中所有p的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 異位詞 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 解題思路1 注意&#xff1a;該解題思路是錯誤的&am…

Microsoft VBA Excel 操控 Access資料表和查詢代碼進行搬運操作

問題場景 Run_NoSource_AddressSource_FileDestination_AddressDestination_FileCopy_IndicatorRun_Start_Time1C:\Users\EP\path\to\FileSSS-1.MDBC:\Users\EP\path\to\FileSSC-1.MDBY2C:\Users\EP\path\to\FileSSS-2.MDBC:\Users\EP\path\to\FileSSC-2.MDBY3C:\Users\EP\pat…

NC參照 根據名稱轉換為主鍵值,如部門、人員等參照根據部門名稱、人員名稱獲取對應的主鍵值

NC參照 根據名稱轉換為主鍵值&#xff0c;如部門、人員等參照根據部門名稱、人員名稱獲取對應的主鍵值 private BillCardPanel getEditBillCardPanel() {return getEditor().getBillCardPanel(); }private BillData getEditorBillData() {return this.getEditor().getBillCard…

靜態庫和動態庫

1、編譯過程 1.預處理&#xff1a;解釋并展開源程序當中的所有的預處理指令&#xff0c;此時生成 *.i 文件。 2.編譯&#xff1a;詞法和語法的分析&#xff0c;生成對應硬件平臺的匯編語言文件&#xff0c;此時生成 *.s 文件。 3.匯編&#xff1a;將匯編語言文件翻譯為對應處理…

便攜式煙氣監測儀的應用主要有哪些?

煙氣分析儀是一種用于檢測和分析煙氣中各種成分和污染物含量的儀器&#xff0c;通過采集和處理煙氣樣品&#xff0c;對其中的各種成分進行定量分析。那么&#xff0c;便攜式煙氣監測儀的應用主要有哪些&#xff1f;為方便大家了解&#xff0c;下面就讓小編來為大家簡單介紹一下…

2-2到2-4

計算出所有人的平均年齡&#xff1a; val lines sc.textFile("/root/data/scala/people/page.txt") val count lines.count() val total lines.map(line > line.split(" ")(1)).map(t>t.trim.toInt).collect().reduce((a,b)>ab) val avgAge …

如何防止SQL注入

為了防止SQL注入攻擊&#xff0c;可以采取以下一系列的安全措施&#xff0c;這些措施結合了多篇參考文章中的關鍵信息和方法&#xff1a; 使用參數化查詢或預編譯語句&#xff1a; 這是防止SQL注入的最常見且最有效的方法之一。通過將用戶輸入的數據作為參數傳遞給SQL查詢語句…

[Python]根據文件路徑獲取文件所在目錄、文件名和后綴名

一、簡介 本文介紹了在python中如何根據文件的路徑名字&#xff08;字符串&#xff09;獲取文件所在目錄名、文件名&#xff08;帶后綴&#xff09;、文件名&#xff08;無后綴&#xff09;和文件后綴名。 二、代碼 假設文件路徑為/home/user/temp.txt&#xff0c;使用以下代…

壓縮pdf文件大小的方法,如何壓縮pdf格式的大小

pdf太大怎么壓縮&#xff1f;當你需要通過電子郵件發送一個PDF文件&#xff0c;卻發現文件太大無法成功發出時&#xff0c;這些情況下&#xff0c;我們都需要找到一種方法來壓縮PDF文件&#xff0c;以便更便捷地進行分享和傳輸。PDF文件的大小通常與其中包含的圖片、圖形和文本…

入門JavaWeb之 Response 下載文件

web 服務器接收到客戶端的 http 請求 針對這個請求&#xff0c;分別創建一個代表請求的 HttpServletRequest 對象&#xff0c;代表響應的 HttpServletResponse 對象 獲取客戶端請求過來的參數&#xff1a;HttpServletRequest 給客戶端響應一些信息&#xff1a;HttpServletRe…

數據庫索引失效的11種情況

MySQL中 提高性能 的一個最有效的方式是對數據表 設計合理的索引。索引提供了高效訪問數據的方法&#xff0c;并且加快查詢的速度&#xff0c;因此索引對查詢的速度有著至關重要的影響。使用索引可以 快速地定位 表中的某條記錄&#xff0c;從而提高數據庫査詢的速度&#xff0…