一、redis與memcache總體對比
1.性能
Redis:只使用單核,平均每一個核上Redis在存儲小數據時比Memcached性能更高。
Memcached:可以使用多核,而在100k以上的數據中,Memcached性能要高于Redis。
2.內存使用效率
MemCached:使用簡單的key-value存儲,Memcached的內存利用率更高。
Redis:如果采用hash結構來做key-value存儲,由于其組合式的壓縮,其內存利用率會高于Memcached。
3.內存空間和數據量大小
MemCached:可以修改最大內存,采用LRU算法。Memcached單個key-value大小有限,一個value最大只支持1MB。
Redis:增加了VM的特性,突破了物理內存的限制。Redis單個key-value大小最大支持512MB 。
4.數據結構支持
MemCached:數據結構單一,僅用來緩存數據。
Redis:支持更加豐富的數據類型,Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
可以在服務器端直接對數據進行豐富的操作,這樣可以減少網絡IO次數和數據體積。
5.可靠性
Memcached:只是個內存緩存,對可靠性要求低。MemCached不支持數據持久化,斷電或重啟后數據消失,但穩定性是有保證的。
Redis:對可靠性要求高,支持數據持久化和數據恢復,允許單點故障,同時也會影響部分性能。支持數據的備份,即master-slave模式的數據備份。Redis支持數據的持久化,可以將內存中的數據保存到磁盤中,重啟的時候可以再次加載進行使用。
6.應用場景
Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量場景。
Redis:適用于對讀寫效率要求都很高,數據處理業務復雜和對安全性要求較高的系統。
2.實驗案例
1.redis的安裝
先把防火墻關掉
先把防火墻關掉
systemctl stop firewalld
set setenforce 0[root@localhost ~]# yum -y install gcc* zlib-devel
解壓 redis包
[root@localhost ~]# tar xvzf redis-4.0.9.tar.gz
[root@localhost ~]# cd redis-4.0.9/ make
2:查看進程
[root@localhost utils]# netstat -anpt | grep redis
3:redis服務控制
[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.配置參數的修改
[root@localhost ~]#vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.101 //監聽的主機地址
port 6379 //端口
daemonize yes //啟用守護進程
pidfile /var/run/redis_6379.pid //指定 PID 文件
loglevel notice //日志級別
logfile /var/log/redis_6379.log //指定日志文件 [root@localhost~]#/etc/init.d/redis_6379 restart
[root@localhost utils]# netstat -anpt | grep redis
二:Redis 命令工具
? redis-server:用于啟動 Redis 的工具;
? redis-benchmark:用于檢測 Redis 在本機的運行效率;
? redis-check-aof:修復 AOF 持久化文件;
? redis-check-rdb:修復 RDB 持久化文件;
? redis-cli:Redis 命令行工具。
redis常用命令:
set ? ? ? ? 創建
get ? ? ? ? 查看
keys * ? 查看所有
rename (會覆蓋)?
renamenx (檢查有沒有同名,然后再決定是否執行 rename 命令,)
del ? ? ? ?(命令可以刪除當前數據庫的指定 key)
exists ? ?(命令可以判斷鍵值是否存在)
type ? ? ?(使用 type 命令可以獲取 key 對應的 value 值類型)
select ? ?(切換數據庫)
move ? ?(移動數據)
flushdb (清空當前數據庫數據)
flushall ?(清空所有數據庫的數據)
? -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 連接并等待。
五:Redis 持久化
Redis 的所有數據都是保存在內存中,然后不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數據變化都寫入到一個 append only file(aof)里面(這稱為“全持久化模式”)。
由于 Redis 的數據都存放在內存中,如果沒有配置持久化,Redis 重啟后數據就全丟失了。所以,需要開啟 Redis 的持久化功能,將數據保存到磁盤上,當 Redis 重啟后,可以從磁盤中恢復數據。Redis 提供兩種方式進行持久化,一種是 RDB(Redis DataBase) 持久化(原理是將 Reids在內存中的數據庫記錄定時 dump 到磁盤上的 RDB 持久化),另外一種是 AOF(append only file)持久化(原理是將 Reids 的操作日志以追加的方式寫入文件)。
1:RDB 和 AOF 的區別
(1)RDB是什么?
默認采用的方法
RDB持久化是把當前進程數據生成快照保存到硬盤的過程,觸發RDB持久化過程分為手動觸發和自動觸發。
觸發機制:手動觸發分別對應為save和bgsave命令
save命令:阻塞當前Redis服務器,直到RDB過程完成為止,對于內存比較多的實例會造成時間阻塞。線上環境不建議使用。
bgsave命令:Redis進程執行fork(用于創建進程的函數)操作創建子進程,RDB持久化過程由子進程負責,完成后自動結束。阻塞只發生在fork階段。
(2)RDB的優缺點:
RDB的優點:
RDB是一個緊湊壓縮的二進制文件,代表Redis在某一個時間點上的數據快照。非常適用于備份,全量復制等場景。比如每6小時執行bgsave備份,并把RDB文件拷貝到遠程機器或者文件系統中,用于災難恢復。
Redis加載RDB恢復數據遠遠快于AOF方式。
RDB的缺點:
RDB方式數據沒辦法做到實時持久化/秒級持久化。因為bgsave每次運行都有執行fork操作創建子進程,屬于重量級操作,頻繁執行成本過高。
RDB文件使用特定二進制格式保存,Redis版本演進過程中有多個格式的RDB版本,存在老版本Redis服務無法兼容新版RDB格式的問題。
二、AOF是什么
AOF(append only file)持久化:以獨立日志的方式記錄每次寫命令,重啟時再重新執行AOF文件中命令達到恢復數據的目的。AOF的主要作用是解決了數據持久化的實時性,目前已經是Redis持久化的主流
二者選擇的標準:
犧牲一些性能,換取更高的緩存一致性(AOF),
寫操作頻繁的時候,不啟用備份來換取更高的性能,待手動運行 save 的時候,再做備份(RDB)
備注:
如果redies重啟之后,需要加載一個持久化文件,有限會選擇AOF文件。
如果先開啟了RDB,再開啟AOF,RDB先執行了持久化,那么RDB文件中的內容會被AOF覆蓋掉。
3:Redis 持久化配置
(1)RDB 持久化配置
[root@localhost ~]# vim /etc/redis/6379.conf
打開 6379.conf 文件之后,搜索 save,可以看到如下所示配置信息。
- ? save 900 1:在 900 秒(15 分鐘)之后,如果至少有 1 個 key 發生變化,則 dump內存快照。
- ? save 300 10:在 300 秒(5 分鐘)之后,如果至少有 10 個 key 發生變化,則 dump內存快照。
- ? save 60 10000:在 60 秒(1 分鐘)之后,如果至少有 10000 個 key 發生變化,則dump 內存快照。
- dbfilename dump.rdb :RDB文件名稱?????????? ##254行
- dir /var/lib/redis/6379 :RDB文件路徑????????? ##264行
- rdbcompression yes :是否進行壓縮?????????????? ##242行
(2)AOF 持久化配置
在 Redis 的配置文件中存在三種同步方式,它們分別是:
- appendonly yes? :開啟AOF持久化(默認為no)??????????????? ##673行
- appendfilename "appendonly.aof "? :AOF文件名稱??????????? ##677行
- # appendfsync always
- appendfsync everysec
- # appendfsync no
always:同步持久化,每次發生數據變化會立刻寫入磁盤
everysec:默認推薦,每秒異步記錄一次(默認值)
no:不同步,交給操作系統決定如何同步
- aof-load-truncated yes? ??????? ##769行
忽略最后一條可能存在問題的指令
[root@localhost ~]#/etc/init.d/redis_6379 restart
(2)AOF重寫
為了解決 AOF 文件體積不斷增大的問題,用戶可以向 Redis 發送 BGREWRITEAOF命令。BGREWRITEAOF 命令會通過移除 AOF 文件中的冗余命令來重寫(rewrite)AOF文件,使 AOF 文件的體積盡可能地變小。
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
# 在日志進行BGREWRITEAOF時,如果no-appendfsync-on-rewrite設置為yes表示新寫操作不進行同步fsync,只是暫存在緩沖區里,避免造成磁盤IO操作沖突,等重寫完成后再寫入。Redis中默認為no
no-appendfsync-on-rewrite no?
# 當前AOF文件大小是上次日志重寫時AOF文件大小兩倍時,發生BGREWRITEAOF操作
auto-aof-rewrite-percentage 100?
備注:
100指的是aof文件增長比例,指當前aof文件比上次重寫的增長比例大小,100為兩倍
#當前AOF文件執行BGREWRITEAOF命令的最小值,避免剛開始啟動Reids時由于文件尺寸較小導致頻繁的BGREWRITEAOF
auto-aof-rewrite-min-size 64mb
六:性能管理
1:查看內存信息
192.168.9.236:7001> info memory
used_memory:1210776 #已經內存使用的大小,以字節為單位
used_memory_human:1.15M # 帶單位展示,以M為單位
used_memory_rss:7802880 # 從操作系統角度看redis內存占用多少
used_memory_rss_human:7.44M # 帶單位展示
maxmemory:1073741824 # 最大內存大小
maxmemory_human:1.00G # 帶單位展示
2:回收策略
maxmemory-policy:回收策略
? volatile-lru:它允許 Redis 從整個數據集中挑選最近最少使用的 key 進行刪除
? volatile-ttl:按照key的過期時間進行淘汰
? volatile-random:從已設置過期時間的數據集合中隨機挑選數據淘汰;
? allkeys-lru:使用 LRU 算法從所有數據集合中淘汰數據;
? allkeys-random:從數據集合中任意選擇數據淘汰;
? noeviction:禁止淘汰數據(默認值)
備注:
設置key的過期時間
expire v1 10
v1的過期時間為10秒
備注:
當 Redis 由于內存壓力需要回收一個 key 時,Redis 首先考慮的不是回收最舊的數據,而是在最近最少使用的 key 或即將過期的 key 中隨機選擇一個 key,從數據集中刪除
redis設置密碼
一、設置方法
方法一:通過配置文件redis.conf設置密碼
找到requirepass關鍵字,后面就是跟的密碼,默認情況下是注釋掉的,即默認不需要密碼,如下:
? 打開注釋,設置為自己的密碼,重啟即可
方法二:通過命名設置密碼
使用redis-cli連接上redis,執行如下命令
config set requirepass 123456
執行完畢,無需重啟,退出客戶端,重新登錄就需要輸入密碼了
二、連接方法
1、連接時輸入密碼
[root@localhost bin]# ./redis-cli -a 123456
2、先連接再輸入密碼
[root@localhost bin]# ./redis-cli127.0.0.1:6379> auth 123456
三、關閉方法
[root@localhost bin]# ./redis-cli -a 123456 shutdown
四、區別
1)修改配置文件設置的密碼永久生效;使用命令設置的密碼臨時生效,重啟后失效
2)修改配置文件設置的密碼,需要重啟生效;使用命令設置的密碼,退出后再登錄生效,重啟后失效
3)命令的優先級高于配置文件的優先級