一、安裝
安裝gcc
yum install -y gcc
安裝tcl
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
sudo tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
cd /usr/local/tcl8.6.1/unix/
sudo ./configure
sudo make
sudo make install
安裝redis
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -zxvf redis-4.0.11.tar.gz
mv redis-4.0.11 /usr/local/redis
make MALLOC=libc
cd src && make install
啟動與測試
#啟動
cd /usr/local/redis/src
redis-server
#連接配接redis
cd /usr/local/redis/src
redis-cli

配置背景啟動
mkdir etc && cp ./redis.conf ./etc/
#将136中的daemonize no改為yes
vi ./etc/redis.conf
#指定配置檔案啟動
./redis-server /usr/local/redis/etc/redis.conf
為redis設定環境變量
vim /etc/profile (在檔案的末尾添加這兩行)
切換到任意目錄,執行which redis-server
為用戶端配置密碼
修改redis.conf 其中500行,root為配置的密碼
參考
https://github.com/timespacegroup/docs/blob/master/server-software/Redis-3.2.9-single.md二、持久化
redis支援RDB和AOF兩種持久化機制,持久化功能有效的避免因程序退出造成的資料丢失問題,當下次重新開機時利用之前持久化的檔案即可實作資料恢複。
RDB
RDB持久化是把目前程序資料,生成快照儲存到硬碟的過程。
RDB是redis預設的持久化方案。會在指定目錄下生成一個dump.rdb檔案。
RDB的持久化方案分為手動觸發和自動觸發
配置RDB持久化
配置redis.conf,大緻如下位置
1、15min内有一個key更改;5min内有10個key更改;1min内有10000個key更改會觸發快照持久化。
2、可以選擇注釋是以政策,不進行持久化,也可以使用save ""來進行關閉持久化。
stop-writes-on-bgsave-error yes
參見:
https://blog.csdn.net/hexieshangwang/article/details/47254087RDB觸發時機
1、滿足配置的save政策(自動觸發)
2、手動執行指令save或者是指令bgsave(手動觸發)。
3、執行flushall指令,清空資料庫所有資料,意義不大
4、執行shutdown指令,保證伺服器正常關閉且不丢失任何資料,意義也不大。
save and bgsave
1、save為阻塞,bgsave為異步,一般使用bgsave。
操作示範
AOF
1、AOF采用日志的形式來記錄每個寫操作,已文本的形式存儲每條寫指令。
2、redis重新開機的會根據日志檔案,從頭至尾執行一次指令以完成資料的恢複
配置AOF
appendonly no
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
AOF重寫
AOF的工作原理是将寫操作記錄到檔案,随着寫操作越來越多,檔案的備援内容會越來越多,所有redis增加了AOF重寫機制。
當AOF檔案大小超過設定的門檻值時,redis就會對AOF檔案進行壓縮。
重寫的原理是:fork出新的程序,将目前記憶體的資料寫入臨時檔案中,然後以臨時檔案替換龐大的舊的AOF檔案。
參考:
https://segmentfault.com/a/1190000012908434 https://www.cnblogs.com/itdragon/p/7906481.html三、事務
嚴格意義來講,redis事務和我們了解的傳統資料庫的事務是不一樣的。redis的事務實質上是指令的集合,在一個事務中要麼所有的指令都被執行,要麼所有的指令都不執行。一個事務從開始到執行會經曆以下三個階段:開始事務、指令入列、執行事務。redis事務涉及的指令有:MULTI、EXEC、DISCARD、WATCH。
MULTI
MULTI指令的執行标記着事務的開始,這個指令唯一的作用就是,将用戶端的REDIS_MULTI選項打開,讓用戶端從非事務狀态切換到事務狀态。
127.0.0.1:6379> multi
OK
指令入列
當用戶端處于非事務狀态時,所有發送給伺服器端的指令都會立即被伺服器執行。
但是,當用戶端進入事務狀态後,伺服器在收到來自用戶端的指令時,不會立即執行指令,而是将這些指令全部放進一個事務隊列裡,然後傳回QUEUED,表示指令已入隊列。
[root@k8s-master-101 ~]# redis-cli -a root
Warning: Using a password with '-a' option on the command line interface may not be safe.
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a a
QUEUED
127.0.0.1:6379> set b b
QUEUED
127.0.0.1:6379> get a
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "a"
127.0.0.1:6379> get a
"a"
127.0.0.1:6379> get b
"b"
127.0.0.1:6379>
執行事務
如果用戶端處于事務狀态, 在EXEC 指令執行時, 伺服器根據用戶端所儲存的事務隊列, 以先進先出(FIFO)的方式執行事務隊列中的指令: 最先入隊的指令最先執行, 而最後入隊的指令最後執行。
相反的,DISCARD指令會清空隊列取消指令的執行。
前面說到, 當用戶端進入事務狀态之後, 用戶端發送的指令就會被放進事務隊列裡。
但其實并不是所有的指令都會被放進事務隊列, 其中的例外就是 EXEC 、 DISCARD 、 MULTI 和 WATCH 這四個指令 —— 當這四個指令從用戶端發送到伺服器時, 它們會像用戶端處于非事務狀态一樣, 直接被伺服器執行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a a
QUEUED
127.0.0.1:6379> set b b
QUEUED
127.0.0.1:6379> get a
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "a"
127.0.0.1:6379> get a
"a"
127.0.0.1:6379> get b
"b"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a aa
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get a
"a"
127.0.0.1:6379>
WATCH
WATCH 指令用于在事務開始之前監視任意數量的鍵: 當調用 EXEC 指令執行事務時, 如果任意一個被監視的鍵已經被其他用戶端修改了, 那麼整個事務不再執行, 直接傳回失敗。
127.0.0.1:6379> WATCH a
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET a "aaa"
QUEUED
127.0.0.1:6379> exec
(nil)
在執行EXEC前,使用另一用戶端執行set a a。
127.0.0.1:6379> set a a
OK
https://redisbook.readthedocs.io/en/latest/feature/transaction.html?from=singlemessage docker pull redis:5.0.3
docker run -d -p 6379:6379 --name redis redis:5.0.3
#-p 6379:6379 将主控端的端口映射到容器
#-v /root/redis/data:/data 将本地目錄挂載到容器的/data目錄,redis使用此目錄持久化
#-v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf 映射配置檔案
# --name redis redis:5.0.3 使用redis redis:5.0.3鏡像建立name為redis的容器
#redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "123456" 在容器中啟動以指定的配置檔案啟動redis,密碼為123456
docker run -d --privileged=true -p 6379:6379 -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis redis:5.0.3 redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "123456"
#使用redisClient 連接配接容器的redis,建立key=dd value=dd的string類型的鍵值對
#進入容器 連接配接上redis,檢視dd的值
[root@localhost ~]# docker exec -it redis redis-cli -a '123456'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get dd
"dd"