一個機構化的數據庫,建立在關係模型基礎上,通常面向於記錄
包括oracle、mysql、sqlserver、db2mysql
除了主流的關係型數據庫意外的數據庫,都人爲是非關係型的
包括redis、mongdb、hbase、couhdbc++
- 對數據庫高併發讀寫需求
- 對海量數據高效存儲與訪問需求
- 對數據庫高可擴展性與高可用需求
Redis基於內存運行並支持持久化redis
採用key-value(鍵值對)的存儲形式算法
- 具備極高的數據讀寫速度
- 支持豐富的數據類型
- 支持數據的持久化
- 原子性
- 支持數據備份
[root@localhost ~]# yum install gcc gcc-c++ make -y ##安裝環境組件 [root@localhost ~]# mkdir /mnt/tools [root@localhost ~]# mount.cifs //192.168.100.100/tools /mnt/tools/ ##掛載 Password for root@//192.168.100.100/tools: [root@localhost ~]# cd /mnt/tools/redis/ [root@localhost redis]# ls redis-5.0.7.tar.gz [root@localhost redis]# tar xf redis-5.0.7.tar.gz -C /opt/ ##解壓 [root@localhost redis]# cd /opt/ [root@localhost opt]# ls redis-5.0.7 rh [root@localhost opt]# cd redis-5.0.7/ [root@localhost redis-5.0.7]# make #編譯 ..........//省略過程 [root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis/ install ##安裝 ..........//省略過程
[root@localhost redis-5.0.7]# cd utils/ [root@localhost utils]# ./install_server.sh ##執行腳本進行配置 Welcome to the redis service installer This script will help you easily set up a running redis server Please select the redis port for this instance: [6379] ##默認端口 Selecting default: 6379 Please select the redis config file name [/etc/redis/6379.conf] ##配置文件 Selected default - /etc/redis/6379.conf Please select the redis log file name [/var/log/redis_6379.log] ##日誌文件 Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] ##數據文件 Selected default - /var/lib/redis/6379 Please select the redis executable path [] /usr/local/redis/bin/redis-server ##可執行文件路徑 Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/redis/bin/redis-server Cli Executable : /usr/local/redis/bin/redis-cli Is this ok? Then press ENTER to go on or Ctrl-C to abort. Copied /tmp/6379.conf => /etc/init.d/redis_6379 Installing service... Successfully added to chkconfig! Successfully added to runlevels 345! Starting Redis server... Installation successful! [root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/ ##便於系統識別 [root@localhost utils]# netstat -ntap | grep 6379 ##查看監聽端口 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 18004/redis-server [root@localhost utils]# /etc/init.d/redis_6379 stop ##關閉redis Stopping ... Redis stopped [root@localhost utils]# netstat -ntap | grep 6379 ##查看監聽端口 tcp 0 0 127.0.0.1:6379 127.0.0.1:33970 TIME_WAIT - [root@localhost utils]# /etc/init.d/redis_6379 start ##開啓redis Starting Redis server... [root@localhost utils]# netstat -ntap | grep 6379 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 18091/redis-server tcp 0 0 127.0.0.1:6379 127.0.0.1:33970 TIME_WAIT - [root@localhost utils]# [root@localhost utils]# vim /etc/redis/6379.conf ##修改配置文件 bind 127.0.0.1 192.168.52.149 ##設置監聽地址 [root@localhost utils]# /etc/init.d/redis_6379 restart ##重啓redis服務 Stopping ... Redis stopped Starting Redis server... ###Redis數據庫基礎操做 [root@localhost utils]# redis-cli -h 192.168.52.149 -p 6379 ##登陸redis 192.168.52.149:6379> help @list ##獲取幫助列表 BLPOP key [key ...] timeout summary: Remove and get the first element in a list, or block until one is available since: 2.0.0 ...............................//省略部份內容 RPUSHX key value summary: Append a value to a list, only if the list exists since: 2.2.0 192.168.52.149:6379> help set ##help幫助 SET key value [expiration EX seconds|PX milliseconds] [NX|XX] summary: Set the string value of a key since: 1.0.0 group: string 192.168.52.149:6379> set name zhangsan ##設置鍵值對 OK 192.168.52.149:6379> set net www OK 192.168.52.149:6379> KEYS * ##查看全部的鍵 1) "name" 2) "net" 192.168.52.149:6379> KEYS n?? ##查看鍵是n開頭後面是兩個字符的 1) "net" 192.168.52.149:6379> KEYS n* ##查看鍵是n開頭的 1) "name" 2) "net" 192.168.52.149:6379> GET net ##查看鍵的值 "www" 192.168.52.149:6379> EXISTS net ##查看鍵是否存在 (integer) 1 ##1是存在,0是不存在 192.168.52.149:6379> EXISTS nat (integer) 0 192.168.52.149:6379> del net ##刪除鍵 (integer) 1 192.168.52.149:6379> KEYS * 1) "name" 192.168.52.149:6379> type name ##查看鍵的類型 string 192.168.52.149:6379> rename name n1 ##給鍵重命名 OK 192.168.52.149:6379> KEYS * 1) "n1" 192.168.52.149:6379> get n1 "zhangsan" 192.168.52.149:6379> hset person score 80 ##用hash方式創建鍵值對 (integer) 1 192.168.52.149:6379> hset person name zhangsan ##用hash方式創建鍵值對 (integer) 1 192.168.52.149:6379> hset person age 30 ##用hash方式創建鍵值對 (integer) 1 192.168.52.1490:6379> KEYS * 1) "person" 192.168.52.149:6379> hget person name ##獲取鍵的值 "zhangsan" 192.168.52.149:6379> hget person age ##獲取鍵的值 "30" 192.168.52.149:6379> set name lisi ##獲取鍵的值 OK 192.168.52.149:6379> KEYS * 1) "name" 2) "person" 192.168.52.149:6379> EXPIRE name 10 ##設置鍵的自動刪除時間10s (integer) 1 192.168.52.149:6379> KEYS * ##10s內查看全部鍵 1) "name" 2) "person" 192.168.52.149:6379> KEYS * ##10s後查看全部鍵 1) "person" 192.168.52.149:6379> exit ##退出
[root@localhost utils]# redis-benchmark -h 192.168.52.149 -p 6379 -c 100 -n 100000 ##併發100,100000個請求 ====== SET ====== 100000 requests completed in 1.14 seconds ##請求花費的時間 100 parallel clients 3 bytes payload keep alive: 1 84.66% <= 1 milliseconds 98.48% <= 2 milliseconds 99.69% <= 3 milliseconds 99.90% <= 18 milliseconds 100.00% <= 18 milliseconds 87642.41 requests per second ====== GET ====== 100000 requests completed in 1.13 seconds 100 parallel clients 3 bytes payload keep alive: 1 [root@localhost utils]# redis-benchmark -h 192.168.52.149 -p 6379 -q -d 100 ##以字節形式指定set/get值的數據大小 SET: 90497.73 requests per second GET: 90991.81 requests per second
[root@localhost utils]# redis-cli -h 192.168.52.149 -p 6379 ##進入Redis 192.168.52.149:6379> KEYS * 1) "mylist" 2) "counter:__rand_int__" 3) "n1" 4) "key:__rand_int__" 5) "myset:__rand_int__" 192.168.52.149:6379> SELECT 10 ##進入第11個庫 OK 192.168.52.149:6379[10]> KEYS * (empty list or set) 192.168.52.149:6379[10]> SELECT 0 ##進入第1個庫 OK 192.168.52.149:6379> MOVE n1 10 ##移動鍵值對到第11個庫 (integer) 1 192.168.52.149:6379> KEYS * 1) "mylist" 2) "counter:__rand_int__" 3) "key:__rand_int__" 4) "myset:__rand_int__" 192.168.52.149:6379> SELECT 10 ##進入第11個庫 OK 192.168.52.149:6379[10]> KEYS * ## 查看鍵 1) "n1" 192.168.52.149:6379[10]> GET n1 "zhangsan" 192.168.52.149:6379[10]> FLUSHDB ##清除庫中數據 OK 192.168.52.149:6379[10]> KEYS * ##查看全部鍵 (empty list or set) 192.168.52.149:6379[10]> SELECT 0 ##切換到第一個庫 OK 192.168.52.149:6379>KEYS * ##查看全部的鍵 1) "myset:__rand_int__" 2) "mylist" 3) "key:__rand_int__" 4) "counter:__rand_int__" 192.168.52.149:6379> exit [root@localhost utils]#
Redis是運行在內存中,內存中的數據斷電丟失
爲了能後重用Redis數據,或者防止系統故障,咱們須要將Redis中的數據寫入到磁盤空間中,即持久化sql
- RDB方式:建立快照的方式獲取某一時刻Redis中全部數據的副本
- AOF方式:將執行的寫命令寫到文件的末尾,以日誌的方式來記錄數據的變化
Redis的默認持久化方式
默認文件名dump.rdb數據庫
- 在指定的時間間隔內,執行指定次數的寫操做(配置文件控制)
- 執行save或者是bgsave(異步)命令
- 執行flushall命令,清空數據庫全部數據
- 執行shutdown命令,保證服務器正常關閉且不丟失任何數據
- 適合大規模的數據恢復
- 若是業務對數據完整性和一致性要求不高,RDB是很好的選擇
- 數據的完整性和一致性不高
- 備份時佔用內存
將dump.rdb文件拷貝到redis的安裝目錄的bin目錄下,重啓redis服務便可vim
[root@localhost utils]# vim /etc/redis/6379.conf #900秒以內至少一次寫操做 save 900 1 #300秒以內至少發生10次寫操做 save 300 10 #60秒以內發生至少10000次寫操做 save 60 10000 #只要知足其一都會觸發快照操做,註釋全部的save項表示關閉RDB #RDB文件名稱 dbfilename dump.rdb #RDB文件路徑 dir /var/lib/redis/6379 #開啓壓縮功能 rdbcompression yes
Redis默認不開啓
彌補RDB的不足(數據的不一致性)
採用日誌的形式來記錄每一個寫操做,並追加到文件中
Redis重啓會根據日誌文件的內容將寫指令從前到後執行一次以完成數據的恢復工做緩存
將appendonly.aof文件拷貝到redis安裝目錄的bin目錄下,重啓redis服務便可服務器
[root@localhost utils]# vim /etc/redis/6379.conf #開啓AOF持久化 appendonly yes #AOF文件名稱 appendfilename "appendonly.aof" #always:同步持久化,每次發生數據變化會馬上寫入磁盤 # appendfsync always #everysec:默認推薦,每秒異步記錄次(默認值) appendfsync everysec #no:不一樣步,交給操做系統決定如何同步 # appendfsync no #忽略最後一條可能存在問題的指令 aof-load-truncated yes
AOF的工做原理是將寫操做追加到文件中,文件的冗餘內容會愈來愈多
當AOF文件的大小超過所設定的閥值時,Redis就會對AOF文件的內容壓縮數據結構
Redis會fork出一條新進程,讀取內存中的數據(並無讀取舊文件),並從新寫到一個臨時文件中,最後替換舊的aof文件
[root@localhost utils]# vim /etc/redis/6379.conf #在日誌進行BGREWRITEAOF時, 若是設置爲yes表示新寫操做不進行同步fsync, #只暫存在緩衝區裏,避免形成磁盤I0操做衝突,等重寫完成後在寫入。redis中默認爲no no-appendfsync-on-rewrite no #當前AOF文件大小是上第二天志重寫時AOF文件大小兩倍時,發生BGREWRITEAOF操做 auto-aof-rewrite-percentage 100 #當前AOF文件執行BGREWRITEAOF命令的最小值, #避免剛開始啓動Reids時因爲文件尺寸較小致使頻繁的BGREWRITEAOF auto-aof-rewrite-min-size 64mb
##查看redis內存使用 [root@localhost utils]# /usr/local/redis/bin/redis-cli 127.0.0.1:6379> info memory
●操系統分配的內存值used_ memory rss除以redis使用的內存值
used _memory計算得出
●內存碎片是由操做系統低效的分配/回收物理內存致使的
不連續的物理內存分配
●跟蹤內存碎片率對理解redis實例的資源性能是很是重要的
內存碎片率稍大於1是合理的,這個值表示內存碎片率比較低
內存碎片率超過1.5,說明redis消耗了實際須要物理內存的150%,其中50%是內存碎片率
內存碎片率低於1的,說明Redis內存分配超出了物理內存,操做系統正在進行內存交換
●redis實例的內存使用率超過可用最大內存,操做系統將開始進行
內存與swap空間交換
●避免內存交換
針對緩存數據大小選擇
儘量的使用Hash數據結構
設置key的過時時間
●保證合理分配redis有限的內存資源
●當內存使用達到設置的最大閥值時,須要選擇一種key的回收策略
默認狀況下回收策略是禁止刪除
redis.conf配置文件中修改maxmemory-policy屬性值
- volatile-lru:使用LRU算法從已設置過時時間的數據集合中淘汰數據
- volatile-ttl:從已設置過時時間的數據集合中挑選即將過時的數據淘汰(建議使用)
- volatile-random:從已設置過時時間的數據集合中隨機挑選數據淘汰
- allkeys-lru:使用LRU算法從全部數據集合中淘汰數據
- allkeys-random:從數據集合中任意選擇數據淘汰
- no-enviction:禁止淘汰數據