web網(wǎng)站開發(fā)試題成都seo培
一、redis與memcache總體對(duì)比
1.性能
Redis:只使用單核,平均每一個(gè)核上Redis在存儲(chǔ)小數(shù)據(jù)時(shí)比Memcached性能更高。
Memcached:可以使用多核,而在100k以上的數(shù)據(jù)中,Memcached性能要高于Redis。
2.內(nèi)存使用效率
MemCached:使用簡(jiǎn)單的key-value存儲(chǔ),Memcached的內(nèi)存利用率更高。
Redis:如果采用hash結(jié)構(gòu)來做key-value存儲(chǔ),由于其組合式的壓縮,其內(nèi)存利用率會(huì)高于Memcached。
3.內(nèi)存空間和數(shù)據(jù)量大小
MemCached:可以修改最大內(nèi)存,采用LRU算法。Memcached單個(gè)key-value大小有限,一個(gè)value最大只支持1MB。
Redis:增加了VM的特性,突破了物理內(nèi)存的限制。Redis單個(gè)key-value大小最大支持512MB 。
4.數(shù)據(jù)結(jié)構(gòu)支持
MemCached:數(shù)據(jù)結(jié)構(gòu)單一,僅用來緩存數(shù)據(jù)。
Redis:支持更加豐富的數(shù)據(jù)類型,Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
可以在服務(wù)器端直接對(duì)數(shù)據(jù)進(jìn)行豐富的操作,這樣可以減少網(wǎng)絡(luò)IO次數(shù)和數(shù)據(jù)體積。
5.可靠性
Memcached:只是個(gè)內(nèi)存緩存,對(duì)可靠性要求低。MemCached不支持?jǐn)?shù)據(jù)持久化,斷電或重啟后數(shù)據(jù)消失,但穩(wěn)定性是有保證的。
Redis:對(duì)可靠性要求高,支持?jǐn)?shù)據(jù)持久化和數(shù)據(jù)恢復(fù),允許單點(diǎn)故障,同時(shí)也會(huì)影響部分性能。支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存到磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
6.應(yīng)用場(chǎng)景
Memcached:動(dòng)態(tài)系統(tǒng)中減輕數(shù)據(jù)庫負(fù)載,提升性能;做緩存,適合多讀少寫,大數(shù)據(jù)量場(chǎng)景。
Redis:適用于對(duì)讀寫效率要求都很高,數(shù)據(jù)處理業(yè)務(wù)復(fù)雜和對(duì)安全性要求較高的系統(tǒng)。
二、redis與memcache內(nèi)存管理機(jī)制對(duì)比
1. Memcached的內(nèi)存管理機(jī)制
Memcached默認(rèn)使用Slab Allocation機(jī)制管理內(nèi)存,其主要思想是按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長(zhǎng)度的塊以存儲(chǔ)相應(yīng)長(zhǎng)度的key-value數(shù)據(jù)記錄,以完全解決內(nèi)存碎片問題。Slab Allocation機(jī)制只為存儲(chǔ)外部數(shù)據(jù)而設(shè)計(jì),也就是說所有的key-value數(shù)據(jù)都存儲(chǔ)在Slab Allocation系統(tǒng)里,而Memcached的其它內(nèi)存請(qǐng)求則通過普通的malloc/free來申請(qǐng),因?yàn)檫@些請(qǐng)求的數(shù)量和頻率決定了它們不會(huì)對(duì)整個(gè)系統(tǒng)的性能造成影響
2. Redis的內(nèi)存管理機(jī)制
Redis的內(nèi)存管理主要通過源碼中zmalloc.h和zmalloc.c兩個(gè)文件來實(shí)現(xiàn)的。Redis為了方便內(nèi)存的管理,在分配一塊內(nèi)存之后,會(huì)將這塊內(nèi)存的大小存入內(nèi)存塊的頭部。如圖 5所示,real_ptr是redis調(diào)用malloc后返回的指針。redis將內(nèi)存塊的大小size存入頭部,size所占據(jù)的內(nèi)存大小是已知的,為 size_t類型的長(zhǎng)度,然后返回ret_ptr。當(dāng)需要釋放內(nèi)存的時(shí)候,ret_ptr被傳給內(nèi)存管理程序。通過ret_ptr,程序可以很容易的算出 real_ptr的值,然后將real_ptr傳給free釋放內(nèi)存。Redis采用的是包裝的mallc/free,相較于Memcached的內(nèi)存管理方法來說,要簡(jiǎn)單很多。
三、 Redis和Memcached的集群實(shí)現(xiàn)機(jī)制對(duì)比
1. Memcached的分布式存儲(chǔ)
Memcached本身并不支持分布式,因此只能在客戶端通過像一致性哈希這樣的分布式算法來實(shí)現(xiàn)Memcached的分布式存儲(chǔ)。
當(dāng)客戶端向Memcached集群發(fā)送數(shù)據(jù)之前,首先會(huì)通過內(nèi)置的分布式算法計(jì)算出該條數(shù)據(jù)的目標(biāo)節(jié)點(diǎn),然后數(shù)據(jù)會(huì)直接發(fā)送到該節(jié)點(diǎn)上存儲(chǔ)。但客戶端查詢數(shù)據(jù)時(shí),同樣要計(jì)算出查詢數(shù)據(jù)所在的節(jié)點(diǎn),然后直接向該節(jié)點(diǎn)發(fā)送查詢請(qǐng)求以獲取數(shù)據(jù)。
2. Redis的分布式存儲(chǔ)
Redis在服務(wù)器端構(gòu)建分布式存儲(chǔ)。Redis Cluster是一個(gè)實(shí)現(xiàn)了分布式且允許單點(diǎn)故障的Redis高級(jí)版本,它沒有中心節(jié)點(diǎn),具有線性可伸縮的功能。其中節(jié)點(diǎn)與節(jié)點(diǎn)之間通過二進(jìn)制協(xié)議進(jìn)行通信,節(jié)點(diǎn)與客戶端之間通過ascii協(xié)議進(jìn)行通信。在數(shù)據(jù)的放置策略上,Redis Cluster將整個(gè)key的數(shù)值域分成4096個(gè)哈希槽,每個(gè)節(jié)點(diǎn)上可以存儲(chǔ)一個(gè)或多個(gè)哈希槽,Redis Cluster支持的最大節(jié)點(diǎn)數(shù)就是4096。Redis Cluster使用的分布式算法:crc16( key ) % HASH_SLOTS_NUMBER。
為了保證單點(diǎn)故障下的數(shù)據(jù)可用性,Redis Cluster引入了Master節(jié)點(diǎn)和Slave節(jié)點(diǎn)。在Redis Cluster中,每個(gè)Master節(jié)點(diǎn)都會(huì)有對(duì)應(yīng)的兩個(gè)用于冗余的Slave節(jié)點(diǎn)。這樣在整個(gè)集群中,任意兩個(gè)節(jié)點(diǎn)的宕機(jī)都不會(huì)導(dǎo)致數(shù)據(jù)的不可用。當(dāng)Master節(jié)點(diǎn)退出后,集群會(huì)自動(dòng)選擇一個(gè)Slave節(jié)點(diǎn)成為新的Master節(jié)點(diǎn)。
一:redis的安裝
1:安裝
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel
[root@localhost ~]#?tar xvzf redis-4.0.9.tar.gz
[root@localhost ~]#?cd redis-4.0.9/
[root@localhost redis-4.0.9]# make
注意:
在make的時(shí)候,可能會(huì)出現(xiàn)如下錯(cuò)誤提示:
解決方法1:用make MALLOC=libc指定內(nèi)存分配器為 libc進(jìn)行編譯
解決方法2:make clean && make?distclean
[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost redis-4.0.9]# cd /root/redis-4.0.9/utils/
[root@localhost utils]# ./install_server.sh
備注:
Config file : /etc/redis/6379.conf ???//配置文件路徑
Log file : /var/log/redis_6379.log ???//日志文件路徑
Data dir : /var/lib/redis/6379 ???//數(shù)據(jù)文件路徑
Executable : /usr/local/redis/bin/redis-server ???//可執(zhí)行文件路徑
Cli Executable : /usr/local/redis/bin/redis-cli ???//客戶端命令行工具
2:查看進(jìn)程
[root@localhost utils]# netstat -anpt | grep redis
3:服務(wù)控制
[root@localhost ~]#/etc/init.d/redis_6379 stop
[root@localhost ~]#/etc/init.d/redis_6379 start
[root@localhost ~]#/etc/init.d/redis_6379 restart
[root@localhost ~]#/etc/init.d/redis_6379 status
4:配置參數(shù)的修改
[root@localhost ~]#vim /etc/redis/6379.conf
bind 127.0.0.1?192.168.10.101 ?? //監(jiān)聽的主機(jī)地址
port 6379 //端口
daemonize yes //啟用守護(hù)進(jìn)程
pidfile /var/run/redis_6379.pid //指定 PID 文件
loglevel notice //日志級(jí)別
logfile /var/log/redis_6379.log //指定日志文件
[root@localhost~]#/etc/init.d/redis_6379 restart
[root@localhost utils]# netstat -anpt | grep redis
二:Redis 命令工具
? redis-server:用于啟動(dòng) Redis 的工具;
? redis-benchmark:用于檢測(cè) Redis 在本機(jī)的運(yùn)行效率;
? redis-check-aof:修復(fù) AOF 持久化文件;
? redis-check-rdb:修復(fù) RDB 持久化文件;
? redis-cli:Redis 命令行工具。
1:redis-cli 命令行工具
(1)連接本機(jī)redis
[root@localhost ~]# redis-cli
127.0.0.1:6379>
(2)測(cè)試redis服務(wù)是否啟動(dòng)
127.0.0.1:6379> ping
PONG
(3)遠(yuǎn)程連接
[root@localhost ~]#redis-cli -h 192.168.10.101 -p 6379
2:獲取幫助
? help @<group>:獲取<group>中的命令列表;
? help <command>:獲取某個(gè)命令的幫助;
? help <tab>:獲取可能幫助的主題列表。
備注:
? help <tab>:獲取可能幫助的主題列表。
輸入help后,按下tab鍵
(1)查看所有與 List 數(shù)據(jù)類型的相關(guān)命令
127.0.0.1:6379>help @list
(2)查看 set 命令的命令幫助
127.0.0.1:6379>help set
3:redis-benchmark 測(cè)試工具
redis-benchmark 是官方自帶的 Redis 性能測(cè)試工具,可以有效的測(cè)試 Redis 服務(wù)的性能。
? -h:指定服務(wù)器主機(jī)名;
? -p:指定服務(wù)器端口;
? -s:指定服務(wù)器 socket;
? -c:指定并發(fā)連接數(shù);
? -n:指定請(qǐng)求數(shù);
? -d:以字節(jié)的形式指定 SET/GET 值的數(shù)據(jù)大小;
? -k:1=keep alive 0=reconnect;
? -r:SET/GET/INCR 使用隨機(jī) key, SADD 使用隨機(jī)值;
? -P:通過管道傳輸<numreq>請(qǐng)求;
? -q:強(qiáng)制退出 redis。僅顯示 query/sec 值;
? --csv:以 CSV 格式輸出;
? -l:生成循環(huán),永久執(zhí)行測(cè)試;
? -t:僅運(yùn)行以逗號(hào)分隔的測(cè)試命令列表;
? -I:Idle 模式。僅打開 N 個(gè) idle 連接并等待。
(1)測(cè)試請(qǐng)求性能
[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -c 100 -n 100000
備注:
? -h:指定服務(wù)器主機(jī)名;
? -p:指定服務(wù)器端口;
? -c:指定并發(fā)連接數(shù);
? -n:指定請(qǐng)求數(shù);
====== MSET (10 keys) ======
??100000 requests completed in 1.02 seconds
??100 parallel clients ##100個(gè)并發(fā)連接
??3 bytes payload
??keep alive: 1
87.25% <= 1 milliseconds ##87.25%的命令執(zhí)行時(shí)間小于等于1毫秒
99.90% <= 2 milliseconds
100.00% <= 2 milliseconds
97943.19 requests per second #每秒的請(qǐng)求數(shù)
備注:
向 IP 地址為 192.168.10.101、端口為6379 的 Redis 服務(wù)器發(fā)送 100 個(gè)并發(fā)連接與100000 個(gè)請(qǐng)求測(cè)試性能
(2)測(cè)試存取性能
[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -q -d 100
備注:
? -h:指定服務(wù)器主機(jī)名;
? -p:指定服務(wù)器端口;
? -d:以字節(jié)的形式指定 SET/GET 值的數(shù)據(jù)大小;
? -q:強(qiáng)制退出 redis。僅顯示 query/sec 值;
PING_INLINE: 121506.68 requests per second
PING_BULK: 124378.11 requests per second
SET: 121654.50 requests per second
GET: 122100.12 requests per second
INCR: 118764.84 requests per second
LPUSH: 112612.61 requests per second
RPUSH: 118623.96 requests per second
LPOP: 107874.87 requests per second
RPOP: 114416.48 requests per second
SADD: 123304.56 requests per second
HSET: 122249.38 requests per second
SPOP: 128040.97 requests per second
LPUSH (needed to benchmark LRANGE): 116686.12 requests per second
LRANGE_100 (first 100 elements): 40016.00 requests per second
LRANGE_300 (first 300 elements): 11991.85 requests per second
LRANGE_500 (first 450 elements): 7381.71 requests per second
LRANGE_600 (first 600 elements): 5230.67 requests per second
MSET (10 keys): 92421.44 requests per second
備注:
測(cè)試存取大小為 100 字節(jié)的數(shù)據(jù)包的性能
(1)PING_INLINE:每秒完成多少次PING操作
(2)GET:每秒完成多少次GET key vlaue
(3)SET:每秒完成多少次SET key vlaue
(4)INCR:每秒完成多少次原子計(jì)數(shù)
(5)MSET:每秒多個(gè)key vlaue請(qǐng)求次數(shù)
(3)set 與 lpush 操作性能
[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
備注:
? -n:指定請(qǐng)求數(shù);
? -q:強(qiáng)制退出 redis。僅顯示 query/sec 值;
? -t:僅運(yùn)行以逗號(hào)分隔的測(cè)試命令列表;
SET: 121951.22 requests per second
LPUSH: 127226.46 requests per second
備注:
測(cè)試本機(jī)上 Redis 服務(wù)在進(jìn)行 set 與 lpush 操作時(shí)的性能。
Lpush 命令將一個(gè)或多個(gè)值插入到列表頭部
三:Redis 數(shù)據(jù)庫常用命令
? set:存放數(shù)據(jù),基本的命令格式為 set key value。
? get:獲取數(shù)據(jù),基本的命令格式為 get key。
127.0.0.1:6379>set teacher zhanglong
127.0.0.1:6379>get teacher
1.key 相關(guān)命令
在 Redis 數(shù)據(jù)庫中,與 key 相關(guān)的命令主要包含以下幾種。
(1)添加鍵值對(duì)
使用 keys 命令可以取符合規(guī)則的鍵值列表,通常情況可以結(jié)合*、?等選項(xiàng)來使用。
127.0.0.1:6379>set k1 1
OK
127.0.0.1:6379>set k2 2
OK
127.0.0.1:6379>set k3 3
OK
127.0.0.1:6379>set v1 4
OK
127.0.0.1:6379>set v5 5
OK
(2)查看當(dāng)前數(shù)據(jù)庫中所有鍵
127.0.0.1:6379>KEYS??* ?
1) "teacher"
2) "k1"
3) "k2"
4) "k3"
5) "v1"
6) "v5"
127.0.0.1:6379>set v22 5
OK
(3)查看當(dāng)前數(shù)據(jù)庫中以 v 開頭的數(shù)據(jù)
127.0.0.1:6379>KEYS v* ???
1) "v1"
2) "v5"
3) "v22"
(4)查看當(dāng)前數(shù)據(jù)庫中以 v 開頭后面包含任意一位的數(shù)據(jù)
127.0.0.1:6379>KEYS v? ??
1) "v1"
2) "v5"
(5)查看當(dāng)前數(shù)據(jù)庫中以 v 開頭 v 開頭后面包含任意兩位的數(shù)據(jù)
127.0.0.1:6379>KEYS v?? ??
1) "v22"
2:exists
exists 命令可以判斷鍵值是否存在
127.0.0.1:6379>exists teacher
(integer) 1
結(jié)果為1,表示 teacher 鍵是存在
127.0.0.1:6379>exists tea
(integer) 0
結(jié)果為0,表示 tea 鍵不存在
3:del
del 命令可以刪除當(dāng)前數(shù)據(jù)庫的指定 key
127.0.0.1:6379>keys *
1) "teacher"
2) "v1"
3) "v22"
4) "k3"
5) "k1"
6) "k2"
7) "v5"
127.0.0.1:6379> del v5
(integer) 1
127.0.0.1:6379>get v5
(nil)
4:type
使用 type 命令可以獲取 key 對(duì)應(yīng)的 value 值類型
127.0.0.1:6379>type k1
string
備注:
redis支持的數(shù)據(jù)類型
- String:最簡(jiǎn)單的類型,就是普通的set和get,作key value緩存。?
- Hash:類似map的一種結(jié)構(gòu),一般就是可以將結(jié)構(gòu)化的數(shù)據(jù),比如一個(gè)對(duì)象給緩存在redis里
- List:List是有序列表,可以通過list存儲(chǔ)一些列表型的數(shù)據(jù)結(jié)構(gòu),類似粉絲列表、文章的評(píng)論列表之類的東西
- Set:Set是無序集合,自動(dòng)去重。
- Sorted Set:Sorted Set是排序的set,去重但可以排序,寫進(jìn)去的時(shí)候給一個(gè)分?jǐn)?shù),自動(dòng)根據(jù)分?jǐn)?shù)排序。
5:rename
rename 命令是對(duì)已有 key 進(jìn)行重命名
在實(shí)際使用過程中,建議先用 exists 命令查看目標(biāo) key 是否存在,然后再?zèng)Q定是否執(zhí)行 rename 命令,以避免覆蓋重要數(shù)據(jù)
127.0.0.1:6379>keys v*
1) "v1"
2) "v22"
127.0.0.1:6379>rename v22 v2
OK
127.0.0.1:6379>keys v*
1) "v1"
2) "v2"
127.0.0.1:6379>get v1
"4"
127.0.0.1:6379>get v2
"5"
127.0.0.1:6379>rename v1 v2
OK
127.0.0.1:6379>get v1
(nil)
127.0.0.1:6379>get v2
"4"
6:renamenx
renamenx 命令的作用是對(duì)已有 key 進(jìn)行重命名,并檢測(cè)新名是否存在。
使用renamenx 命令進(jìn)行重命名時(shí),如果目標(biāo) key 存在則不進(jìn)行重命名。
127.0.0.1:6379>keys *
1) "teacher"
2) "k3"
3) "k1"
4) "k2"
5) "v2"
127.0.0.1:6379>get teacher
"zhanglong"
127.0.0.1:6379>get v2
"4"
127.0.0.1:6379>renamenx v2 teacher
(integer) 0
127.0.0.1:6379>keys *
1) "teacher"
2) "k3"
3) "k1"
4) "k2"
5) "v2"
127.0.0.1:6379>get teacher
"zhanglong"
127.0.0.1:6379>get v2
"4
7:dbsize
dbsize 命令的作用是查看當(dāng)前數(shù)據(jù)庫中 key 的數(shù)目。
127.0.0.1:6379> dbsize
(integer) 5
四:多數(shù)據(jù)庫常用命令
1:多數(shù)據(jù)庫間切換
Redis 在沒有任何改動(dòng)的情況下默認(rèn)包含 16 個(gè)數(shù)據(jù)庫,數(shù)據(jù)庫名稱是用數(shù)字 0-15 來依次命名的
(1)切換至序號(hào)為 10 的數(shù)據(jù)庫
127.0.0.1:6379>select 10
OK
(2)切換至序號(hào)為 15 的數(shù)據(jù)庫
127.0.0.1:6379[10]>select 15
OK
(3)切換至序號(hào)為 0 的數(shù)據(jù)庫
127.0.0.1:6379[15]>select 0
2:多數(shù)據(jù)庫間移動(dòng)數(shù)據(jù)
Redis 的多數(shù)據(jù)庫在一定程度上是相對(duì)獨(dú)立的,例如在數(shù)據(jù)庫 0 上面存放 k1 的數(shù)據(jù),在其它 1-15 的數(shù)據(jù)庫上是無法查看到的。
127.0.0.1:6379>set k1 100
OK
127.0.0.1:6379>get k1
"100"
127.0.0.1:6379>select 1
OK
127.0.0.1:6379[1]>get k1
(nil)
127.0.0.1:6379[1]>select 0 //切換至目標(biāo)數(shù)據(jù)庫 0
OK
127.0.0.1:6379>get k1 //查看目標(biāo)數(shù)據(jù)是否存在
"100"
127.0.0.1:6379>move k1 1 //將數(shù)據(jù)庫 0 中 k1 移動(dòng)到數(shù)據(jù)庫 1 中
(integer) 1
127.0.0.1:6379>select 1 //切換至目標(biāo)數(shù)據(jù)庫 1
OK
127.0.0.1:6379[1]>get k1 //查看被移動(dòng)數(shù)據(jù)
"100"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1 //在數(shù)據(jù)庫 0 中無法查看到 k1 的值
(nil)
3:清除數(shù)據(jù)庫內(nèi)數(shù)據(jù)
清空當(dāng)前數(shù)據(jù)庫數(shù)據(jù),使用 FLUSHDB
命令實(shí)現(xiàn);清空所有數(shù)據(jù)庫的數(shù)據(jù),使用 FLUSHALL 命令實(shí)現(xiàn)
五:Redis 持久化
Redis 的所有數(shù)據(jù)都是保存在內(nèi)存中,然后不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數(shù)據(jù)變化都寫入到一個(gè) append only file(aof)里面(這稱為“全持久化模式”)。
由于 Redis 的數(shù)據(jù)都存放在內(nèi)存中,如果沒有配置持久化,Redis 重啟后數(shù)據(jù)就全丟失了。所以,需要開啟 Redis 的持久化功能,將數(shù)據(jù)保存到磁盤上,當(dāng) Redis 重啟后,可以從磁盤中恢復(fù)數(shù)據(jù)。Redis 提供兩種方式進(jìn)行持久化,一種是 RDB(Redis DataBase)?持久化(原理是將 Reids在內(nèi)存中的數(shù)據(jù)庫記錄定時(shí) dump 到磁盤上的 RDB 持久化),另外一種是 AOF(append only?file)持久化(原理是將 Reids 的操作日志以追加的方式寫入文件)。
1:RDB 和 AOF 的區(qū)別
(1)RDB是什么?
默認(rèn)采用的方法
RDB持久化是把當(dāng)前進(jìn)程數(shù)據(jù)生成快照保存到硬盤的過程,觸發(fā)RDB持久化過程分為手動(dòng)觸發(fā)和自動(dòng)觸發(fā)。
觸發(fā)機(jī)制:手動(dòng)觸發(fā)分別對(duì)應(yīng)為save和bgsave命令
save命令:阻塞當(dāng)前Redis服務(wù)器,直到RDB過程完成為止,對(duì)于內(nèi)存比較多的實(shí)例會(huì)造成時(shí)間阻塞。線上環(huán)境不建議使用。
bgsave命令:Redis進(jìn)程執(zhí)行fork(用于創(chuàng)建進(jìn)程的函數(shù))操作創(chuàng)建子進(jìn)程,RDB持久化過程由子進(jìn)程負(fù)責(zé),完成后自動(dòng)結(jié)束。阻塞只發(fā)生在fork階段。
(2)RDB的優(yōu)缺點(diǎn):
RDB的優(yōu)點(diǎn):
RDB是一個(gè)緊湊壓縮的二進(jìn)制文件,代表Redis在某一個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)快照。非常適用于備份,全量復(fù)制等場(chǎng)景。比如每6小時(shí)執(zhí)行bgsave備份,并把RDB文件拷貝到遠(yuǎn)程機(jī)器或者文件系統(tǒng)中,用于災(zāi)難恢復(fù)。
Redis加載RDB恢復(fù)數(shù)據(jù)遠(yuǎn)遠(yuǎn)快于AOF方式。
RDB的缺點(diǎn):
RDB方式數(shù)據(jù)沒辦法做到實(shí)時(shí)持久化/秒級(jí)持久化。因?yàn)閎gsave每次運(yùn)行都有執(zhí)行fork操作創(chuàng)建子進(jìn)程,屬于重量級(jí)操作,頻繁執(zhí)行成本過高。
RDB文件使用特定二進(jìn)制格式保存,Redis版本演進(jìn)過程中有多個(gè)格式的RDB版本,存在老版本Redis服務(wù)無法兼容新版RDB格式的問題。
二、AOF是什么
AOF(append only file)持久化:以獨(dú)立日志的方式記錄每次寫命令,重啟時(shí)再重新執(zhí)行AOF文件中命令達(dá)到恢復(fù)數(shù)據(jù)的目的。AOF的主要作用是解決了數(shù)據(jù)持久化的實(shí)時(shí)性,目前已經(jīng)是Redis持久化的主流
二者選擇的標(biāo)準(zhǔn):
犧牲一些性能,換取更高的緩存一致性(AOF),
寫操作頻繁的時(shí)候,不啟用備份來換取更高的性能,待手動(dòng)運(yùn)行 save 的時(shí)候,再做備份(RDB)
備注:
如果redies重啟之后,需要加載一個(gè)持久化文件,有限會(huì)選擇AOF文件。
如果先開啟了RDB,再開啟AOF,RDB先執(zhí)行了持久化,那么RDB文件中的內(nèi)容會(huì)被AOF覆蓋掉。
3:Redis 持久化配置
(1)RDB 持久化配置
[root@localhost ~]# vim /etc/redis/6379.conf
打開 6379.conf 文件之后,搜索 save,可以看到如下所示配置信息。
- ? save 900 1:在 900 秒(15 分鐘)之后,如果至少有 1 個(gè) key 發(fā)生變化,則 dump內(nèi)存快照。
- ? save 300 10:在 300 秒(5 分鐘)之后,如果至少有 10 個(gè) key 發(fā)生變化,則 dump內(nèi)存快照。
- ? save 60 10000:在 60 秒(1 分鐘)之后,如果至少有 10000 個(gè) key 發(fā)生變化,則dump 內(nèi)存快照。
- dbfilename dump.rdb?:RDB文件名稱 ##254行
- dir /var/lib/redis/6379?:RDB文件路徑 ##264行
- rdbcompression yes?:是否進(jìn)行壓縮 ##242行
(2)AOF 持久化配置
在 Redis 的配置文件中存在三種同步方式,它們分別是:
- appendonly yes??:開啟AOF持久化(默認(rèn)為no) ##673行
- appendfilename "appendonly.aof "??:AOF文件名稱 ##677行
- # appendfsync always
- appendfsync everysec
- # appendfsync no
always:同步持久化,每次發(fā)生數(shù)據(jù)變化會(huì)立刻寫入磁盤
everysec:默認(rèn)推薦,每秒異步記錄一次(默認(rèn)值)
no:不同步,交給操作系統(tǒng)決定如何同步
- aof-load-truncated yes?? ##769行
忽略最后一條可能存在問題的指令
[root@localhost ~]#/etc/init.d/redis_6379 restart
(2)AOF重寫
為了解決 AOF 文件體積不斷增大的問題,用戶可以向 Redis 發(fā)送 BGREWRITEAOF命令。BGREWRITEAOF 命令會(huì)通過移除 AOF 文件中的冗余命令來重寫(rewrite)AOF文件,使 AOF 文件的體積盡可能地變小。
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
# 在日志進(jìn)行BGREWRITEAOF時(shí),如果no-appendfsync-on-rewrite設(shè)置為yes表示新寫操作不進(jìn)行同步fsync,只是暫存在緩沖區(qū)里,避免造成磁盤IO操作沖突,等重寫完成后再寫入。Redis中默認(rèn)為no
no-appendfsync-on-rewrite no ?
# 當(dāng)前AOF文件大小是上次日志重寫時(shí)AOF文件大小兩倍時(shí),發(fā)生BGREWRITEAOF操作
auto-aof-rewrite-percentage 100 ?
備注:
100指的是aof文件增長(zhǎng)比例,指當(dāng)前aof文件比上次重寫的增長(zhǎng)比例大小,100為兩倍
#當(dāng)前AOF文件執(zhí)行BGREWRITEAOF命令的最小值,避免剛開始啟動(dòng)Reids時(shí)由于文件尺寸較小導(dǎo)致頻繁的BGREWRITEAOF
auto-aof-rewrite-min-size 64mb
六:性能管理
1:查看內(nèi)存信息
192.168.9.236:7001> info memory
used_memory:1210776 #已經(jīng)內(nèi)存使用的大小,以字節(jié)為單位
used_memory_human:1.15M # 帶單位展示,以M為單位
used_memory_rss:7802880 # 從操作系統(tǒng)角度看redis內(nèi)存占用多少
used_memory_rss_human:7.44M # 帶單位展示
maxmemory:1073741824 # 最大內(nèi)存大小
maxmemory_human:1.00G # 帶單位展示
2:回收策略
maxmemory-policy:回收策略
? volatile-lru:它允許 Redis 從整個(gè)數(shù)據(jù)集中挑選最近最少使用的 key 進(jìn)行刪除
? volatile-ttl:按照key的過期時(shí)間進(jìn)行淘汰?
? volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集合中隨機(jī)挑選數(shù)據(jù)淘汰;
? allkeys-lru:使用 LRU 算法從所有數(shù)據(jù)集合中淘汰數(shù)據(jù);
? allkeys-random:從數(shù)據(jù)集合中任意選擇數(shù)據(jù)淘汰;
? noeviction:禁止淘汰數(shù)據(jù)(默認(rèn)值)
備注:
設(shè)置key的過期時(shí)間
expire v1 10
v1的過期時(shí)間為10秒
備注:
當(dāng) Redis 由于內(nèi)存壓力需要回收一個(gè) key 時(shí),Redis 首先考慮的不是回收最舊的數(shù)據(jù),而是在最近最少使用的 key 或即將過期的 key 中隨機(jī)選擇一個(gè) key,從數(shù)據(jù)集中刪除
redis設(shè)置密碼
一、設(shè)置方法
方法一:通過配置文件redis.conf設(shè)置密碼
找到requirepass關(guān)鍵字,后面就是跟的密碼,默認(rèn)情況下是注釋掉的,即默認(rèn)不需要密碼,如下:
? 打開注釋,設(shè)置為自己的密碼,重啟即可
方法二:通過命名設(shè)置密碼
使用redis-cli連接上redis,執(zhí)行如下命令
config set requirepass 123456
執(zhí)行完畢,無需重啟,退出客戶端,重新登錄就需要輸入密碼了
二、連接方法
1、連接時(shí)輸入密碼
[root@localhost bin]# ./redis-cli -a 123456
2、先連接再輸入密碼
[root@localhost bin]# ./redis-cli127.0.0.1:6379> auth 123456
三、關(guān)閉方法
[root@localhost bin]# ./redis-cli -a 123456 shutdown
四、區(qū)別
1)修改配置文件設(shè)置的密碼永久生效;使用命令設(shè)置的密碼臨時(shí)生效,重啟后失效
2)修改配置文件設(shè)置的密碼,需要重啟生效;使用命令設(shè)置的密碼,退出后再登錄生效,重啟后失效
3)命令的優(yōu)先級(jí)高于配置文件的優(yōu)先級(jí)