存儲系統有三類:
RDBMS
oracle,dh2,postgresql,mysql,sql server
NoSQL:
KV NoSQL:redis,memcached
列式Column Family NoSQL: HBase,每一行每一字段能夠保留n份,也是按照字段存儲
文檔Documentation NoSQL: MongoDB
圖式Graph NoSQL: Neo4j
NewSQL
aerospike,foundationDB,rethinkDB...html
redis是一個開源的使用ANSI C 語言編寫、支持網絡、可基於內存便可持久化的日誌型,key-value數據庫(是一個key-value存儲系統),支持多種語言的APImysql
它是一個高級key-value數據庫,跟memcached相似,可是redis的數據能夠持久化,而且支持數據類型更豐富,同時還支持服務端的計算集合的並、交、和補集等,支持多種排序功能。 nginx
經常使用來和memcache作比較,但redis是nosql,基於key-value(鍵值)的數據結構的存儲,能夠存儲鍵值,字典,圖表
徹底工做在內存中,數據保存在內存,性能不錯,數據週期性備份到硬盤,(持久化)的單線程服務器
能夠經過lua腳本擴展
支持sentinel主從架構高可用
分佈式 web
雖然是單線程,kv是一個單純簡單的存儲cpu一般不會造成瓶頸的,官方測試50個併發請求10w次,寫的速度是110000次/s,讀的速度是81000次/s,讀寫大小爲256bytes的字符串; redis
RDB: snapshot,二進制格式;按事先定製的策略,週期性地將數據保存至磁盤;數據文件默認爲dump.rdb;
客戶端也可顯式使用SAVA或BGSAVE命令啓動快照保存機制;
SAVE: 同步,在主線程中保存快照;此時會阻塞全部客戶端請求;
BGSAVE:異步,
AOF:Append Only File
記錄每一次寫操做至指定的文件尾部實現持久化;當redis重啓時,可經過從新執行文件中的命令在內存重建數據庫;
BGREWRITEAOF:AOF文件重寫;
不會讀取正在使用AOF文件,而經過將內存中的數據以命令的方式保存到臨時文件中,完成以後替換原來的AOF文件;sql
String字符串, List鏈表, Hash哈希, Set集合, Sorted Set有序集合, Bitmap, HyperLoglogmongodb
Strings:
SET key value [EX #] [NX|XX]
GET
INCR
DECR
EXIST數據庫
Lists:
LPUSH
RPUSH
LPOP
RPOP
LINDEX
LSETvim
Sets:
SADD
SINTER
SUNION
SPOP
SISMEMBER緩存
Sorted Sets:
ZADD
ZRANGE
ZCARD
ZRANK
Hashes:
HSET
HSETNX
HGET
HKEYS
HVALS
HDEL
Bitmaps, HyperLogLog
監聽端口爲6379/tcp
常見數據庫功能對比
名稱 | 數據庫類型 | 數據存儲選項 | 操做類型 | 備註 |
redis | 內存存儲,nosql數據庫 | 支持字符串、列表、集合、散列標、有序集合 | 增、刪、修改、更新 | 支持分佈式存儲,主從同步及高可用,單線程 |
memcached | 內存緩存數據庫 | 鍵值之間得映射 | 增、刪、修改、更新 | 支持多線程 |
mysql | 典型關係數據庫,RDBMS | 數據庫由多表組成,每張表包含多行 | 增、刪、修改、更新 | 支持ACID性質 |
postgresql | 典型關係數據庫,RDBMS | 數據庫由多表組成,每張表包含多行 | 增、刪、修改、更新 | 支持ACID性質 |
mongodb | 硬盤存儲,nosql數據庫 | 數據庫包含多個表 | 增、刪、修改、更新 | 主從複製,分片,副本集、空間索引 |
redis不只僅支持簡單的kv類型數據,還支持list,set,hash等數據結構
redis支持數據備份
redis支持數據持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠在加載使用
集羣,memcache不支持集羣,多臺memcache 共處
支持一個master多個slave
slave能夠介紹其餘slave的連接來替代他連接master
複製在master是非阻塞的,在slave是阻塞的
複製被利用來提供擴展性,在slave端只提供查詢功能及數據的冗餘
緩存(數據查詢,短鏈接、新聞內容、商品內容等)
分佈式集羣架構中session分離
聊天室在線好友列表
任務隊列(秒殺、搶購、12306)
應用排行
網站訪問統計
數據統計
爲了解決高併發、高可用、高可擴展,大數據存儲等一系列問題而產生的數據庫解決方案
redis持久化解決了redis服務重啓後可以將硬盤的持久化數據恢復到內存中,但當redis服務器硬盤壞掉就會致使數據丟失,爲了不這種單點故障就有了主從複製工做機制
一主多從結構
主從複製不會阻塞master,在同步數據時,master能夠繼續處理client請求
一個redis便可以是主也能夠是從
http://download.redis.io/releases/redis-5.0.4.tar.gz
若是源碼安裝下載源碼
若是yum安裝請配置源
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
直接yum install redis
systemctl enable redis
systemctl start redis
Dependencies Resolved #一些依賴 ==================================================================================================================== Package Arch Version Repository Size ==================================================================================================================== Installing: redis x86_64 3.2.12-2.el7 epel 544 k Installing for dependencies: jemalloc x86_64 3.6.0-1.el7 epel 105 k Transaction Summary ==================================================================================================================== Install 1 Package (+1 Dependent package)
Complete! [root@web1 ~]# systemctl start redis [root@web1 ~]# systemctl enable redis Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service. [root@web1 ~]# netstat -untlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master tcp6 0 0 :::22 :::* LISTEN 875/sshd tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2035/master udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm udp6 0 0 ::1:323 :::* 2334/chronyd udp6 0 0 :::177 :::* 890/lightdm [root@web1 ~]#
解壓-->編譯-->copy-->啓動
此次編譯安裝一個新版本 mkdir /data cd /data #上傳下載的包到此目錄 redis-5.0.4.tar.gz tar redis-5.0.4.tar.gz cd rredis-5.0.4 make
mkdir /data/redis2 cp redis.conf /data/redis2 cp src/redis-server /data/redis2 cd /data/redis2/
由於有#號開的行能夠先過濾掉
sed -ri '/#|^$/d' redis.conf
開始編輯配置文件,修改下面幾項
vim redis.conf
port 6380 //監聽端口
appendonly no yes //日誌開關,不是包報錯的日誌,是二進制,記錄數據變化
pidfile /var/run/redis_6380.pid //pid名字 logfile "/data/redis2/redis.log" //log日誌 daemonize yes //後臺啓動
dbfilename dump.rbd //持久化數據文件
標紅的就是一個yum安裝的實例,一個編譯安裝的實例,這個就是多實例了
[root@web1 redis2]# ./redis-server ./redis.conf [root@web1 redis2]# netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/redis-server 1 tcp 0 0 192.168.216.51:6380 0.0.0.0:* LISTEN 15434/./redis-serve tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master tcp6 0 0 :::22 :::* LISTEN 875/sshd tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2035/master udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm udp6 0 0 ::1:323 :::* 2334/chronyd udp6 0 0 :::177 :::* 890/lightdm [root@web1 redis2]#
[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6380 192.168.216.51:6380> 192.168.216.51:6380> 192.168.216.51:6380> 192.168.216.51:6380> set home zxg //賦值 OK192.168.216.51:6380> get home //取值 "zxg" 192.168.216.51:6380> get abc 123 (error) ERR wrong number of arguments for 'get' command 192.168.216.51:6380> set abc 123 OK 192.168.216.51:6380> get abc "123"192.168.216.51:6380> KEYS * //查看全部的key 1) "abc" 2) "home" 192.168.216.51:6380>
192.168.216.51:6380> SHUTDOWN //正常關閉,非正常關閉就是kill了
redis主從配置很是簡單,只須要把從服務器改一個配置便可
vim redis.conf
slaveof 192.168.216.51 6379
[root@web2 ~]# systemctl start redis
[root@web2 ~]# systemctl enable redis
[root@web1 redis2]# redis-cli -h 192.168.216.51 -p 6379 192.168.216.51:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=192.168.216.52,port=6379,state=online,offset=99,lag=0 master_repl_offset:99 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:98 192.168.216.51:6379>
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.216.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:253
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
注意1:從服務器只讀
master新建key test zxg
192.168.216.51:6379> set test zxg OK 192.168.216.51:6379> get test "zxg" 192.168.216.51:6379>
slave查看有沒有值
127.0.0.1:6379> get test "zxg" 127.0.0.1:6379>