
當(dāng)客戶端調(diào)用getUser接口的查詢用戶信息的時(shí)候,執(zhí)行順序1、2、3、4;由于用戶信息存放在DB中,所以2、3就有一次磁盤(pán)IO;這個(gè)看似非常簡(jiǎn)單業(yè)務(wù)邏輯,但是當(dāng)你做架構(gòu)設(shè)計(jì)的時(shí)候往往要考慮最壞的場(chǎng)景,或者當(dāng)成千上萬(wàn)的用戶頻繁的調(diào)用這個(gè)接口應(yīng)該怎么處理?如果按照上圖這樣的架構(gòu)處理,這個(gè)看似簡(jiǎn)單業(yè)務(wù)的接口會(huì)使整個(gè)系統(tǒng)變慢,這樣用戶的請(qǐng)求就會(huì)長(zhǎng)時(shí)間得不到響應(yīng).

當(dāng)用客戶端調(diào)用getUser接口查詢用戶信息的時(shí)候,getUser接口直接去redis中查詢,如果redis中有該用戶信息,直接返回,避免查詢DB,從而避免了磁盤(pán)IO操作;如果redis中沒(méi)有該用戶信息,則從DB查詢,并且把該用戶信息存放到redis中;這樣在服務(wù)接口(getUser)和DB中間,增加了一個(gè)緩存層;看似邏輯增加了,其實(shí)當(dāng)面對(duì)高并發(fā)的時(shí)候,比如上邊提到的頻繁查詢用戶信息的情況,只有第一次查詢有磁盤(pán)IO操作,以后只要redis中存在就沒(méi)必要再查詢數(shù)據(jù)庫(kù)了;由于沒(méi)有了磁盤(pán)IO操作,并且redis所有數(shù)據(jù)都在內(nèi)存操作,所以速度回大大提升。
redis相對(duì)于memcache提供了更豐富的數(shù)據(jù)類型,根據(jù)不同的業(yè)務(wù)場(chǎng)景可以選在不同的數(shù)據(jù)類型;redis本身也提供了主從模式、集群模式;也有第三方的比如codis提供了redis集群解決方案。
下載說(shuō)明:
在https://redis.io/download下載需要的redis版本,目前5.0版本是比較穩(wěn)定的,4.0版本目前是經(jīng)過(guò)生產(chǎn)驗(yàn)證最多的版本
下載完后,復(fù)制到要安裝的機(jī)器上進(jìn)行以下操作:
(1.解壓安裝包:
[root@mini ~]# tar xf redis-4.0.11.tar.gz -C /usr/local? ? ///解壓到你指定的路徑
(2.進(jìn)入解壓的文件中編譯安裝:
[root@mini ~]# cd /usr/local/redis-4.0.11/
[root@mini redis-4.0.11]# make -j 4? ? ?///4表示cpu數(shù),實(shí)際據(jù)服務(wù)器配置決定
問(wèn)題:
redis編譯報(bào)致命錯(cuò)誤:jemalloc/jemalloc.h:沒(méi)有那個(gè)文件或目錄
解決:編譯時(shí)加一個(gè)參數(shù):
make MALLOC=libc
(3.啟動(dòng)服務(wù):
[root@mini redis-4.0.11]# ./src/redis-server /usr/local/redis-4.0.11/redis.conf &? //注意安裝路徑

(4.打開(kāi)操作界面:
[root@mini redis-4.0.11]# ./src/redis-cli -h 172.0.0.0.1? ? ? ?////后面寫(xiě)本機(jī)ip
(5.配置文件:
[root@mini redis-4.0.11]# vim /usr/local/redis-4.0.11/redis.conf
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
# 默認(rèn)情況下 redis 不是作為守護(hù)進(jìn)程運(yùn)行的,如果你想讓它在后臺(tái)運(yùn)行,你就把它改成 yes。
# nothing bad happens, the server will start and run normally.
pidfile /var/run/redis_6379.pid
# 當(dāng)redis作為守護(hù)進(jìn)程運(yùn)行的時(shí)候,它會(huì)把 pid 默認(rèn)寫(xiě)到 /var/run/redis.pid 文件里面,你也可以指定寫(xiě)入的位置
# in order to get the desired effect.
tcp-backlog 511
# TCP 監(jiān)聽(tīng)的最大容納數(shù)量
# 在高并發(fā)的環(huán)境下,你需要把這個(gè)值調(diào)高以避免客戶端連接緩慢的問(wèn)題。
# Examples:
? bind 127.0.0.1 ::1? ??192.168.1.100?
# 默認(rèn)情況下,redis 在 server 上所有有效的網(wǎng)絡(luò)接口上監(jiān)聽(tīng)客戶端連接。
# 你如果只想讓它在一個(gè)網(wǎng)絡(luò)接口上監(jiān)聽(tīng),那你就綁定一個(gè)IP或者多個(gè)IP。
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
# 指定在一個(gè) client 空閑多少秒之后關(guān)閉連接(0 就是不管它)
# Redis default starting with Redis 3.2.1.
tcp-keepalive 0
# tcp 心跳包
# 如果設(shè)置為非零,則在與客戶端缺乏通訊的時(shí)候使用 SO_KEEPALIVE 發(fā)送 tcp acks 給客戶端。
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice
# 定義日志級(jí)別(debug,verbose,notice,warning)
# output for logging but daemonize, logs will be sent to /dev/null
logfile ""
# 指定日志文件的位置
# 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
# 設(shè)置數(shù)據(jù)庫(kù)的數(shù)目。
# 默認(rèn)數(shù)據(jù)庫(kù)是 DB 0,你可以在每個(gè)連接上使用 select 命令選擇一個(gè)不同的數(shù)據(jù)庫(kù),
# 但是 dbid 必須是一個(gè)介于 0 到 databasees - 1 之間的值
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes
# 默認(rèn)情況下,如果 redis 最后一次的后臺(tái)保存失敗,redis 將停止接受寫(xiě)操作,
# 這樣以一種強(qiáng)硬的方式讓用戶知道數(shù)據(jù)不能正確的持久化到磁盤(pán),
# 否則就會(huì)沒(méi)人注意到災(zāi)難的發(fā)生。
# 如果后臺(tái)保存進(jìn)程重新啟動(dòng)工作了,redis 也將自動(dòng)的允許寫(xiě)操作。
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes
# 是否在 dump .rdb 數(shù)據(jù)庫(kù)的時(shí)候使用 LZF 壓縮字符串
# 默認(rèn)都設(shè)為 yes
# 如果你希望保存子進(jìn)程節(jié)省點(diǎn) cpu ,你就設(shè)置它為 no ,
# 不過(guò)這個(gè)數(shù)據(jù)集可能就會(huì)比較大
# tell the loading code to skip the check.
rdbchecksum yes
# 是否校驗(yàn)rdb文件
# The filename where to dump the DB
dbfilename dump.rdb
# 設(shè)置 dump 的文件位置
# Note that you must specify a directory here, not a file name.
dir ./
#指定本地?cái)?shù)據(jù)庫(kù)存放目錄
slaveof <masterip> <masterport>
#設(shè)置當(dāng)本機(jī)為slav服務(wù)時(shí),設(shè)置master服務(wù)的IP地址及端口,在Redis啟動(dòng)時(shí),它會(huì)自動(dòng)從master進(jìn)行數(shù)據(jù)同步
masterauth <master-password>
#當(dāng)master服務(wù)設(shè)置了密碼保護(hù)時(shí),slave服務(wù)連接master的密碼
equirepass foobared
#設(shè)置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時(shí)需要通過(guò)AUTH <password>命令提供密碼,默認(rèn)關(guān)閉
maxclients 10000
#設(shè)置同一時(shí)間最大客戶端連接數(shù),默認(rèn)無(wú)限制,Redis可以同時(shí)打開(kāi)的客戶端連接數(shù)為Redis進(jìn)程可以打開(kāi)的最大文件描述符數(shù),如果設(shè)置 maxclients 0,表示不作限制。當(dāng)客戶端連接數(shù)到達(dá)限制時(shí),Redis會(huì)關(guān)閉新的連接并向客戶端返回max number of clients reached錯(cuò)誤信息
maxmemory <bytes>
#指定Redis最大內(nèi)存限制,Redis在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后,Redis會(huì)先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理 后,仍然到達(dá)最大內(nèi)存設(shè)置,將無(wú)法再進(jìn)行寫(xiě)入操作,但仍然可以進(jìn)行讀取操作。Redis新的vm機(jī)制,會(huì)把Key存放內(nèi)存,Value會(huì)存放在swap區(qū)
appendonly no
指定是否在每次更新操作后進(jìn)行日志記錄,Redis在默認(rèn)情況下是異步的把數(shù)據(jù)寫(xiě)入磁盤(pán),如果不開(kāi)啟,可能會(huì)在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)? redis本身同步數(shù)據(jù)文件是按上面save條件來(lái)同步的,所以有的數(shù)據(jù)會(huì)在一段時(shí)間內(nèi)只存在于內(nèi)存中。默認(rèn)為no
appendfilename "appendonly.aof"
#指定更新日志文件名,默認(rèn)為appendonly.aof
appendfsync everysec
#指定更新日志條件,共有3個(gè)可選值:
no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(pán)(快)
always:表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫(xiě)到磁盤(pán)(慢,安全)
everysec:表示每秒同步一次(折衷,默認(rèn)值)
activerehashing yes
指定是否激活重置哈希,默認(rèn)為開(kāi)啟
include /path/to/local.conf
#指定包含其它的配置文件,可以在同一主機(jī)上多個(gè)Redis實(shí)例之間使用同一份配置文件,而同時(shí)各個(gè)實(shí)例又擁有自己的特定配置文件
以上就是redis的基本配置