內存數據庫專題-4
------------內存數據庫專題---------------
為什麽要把數據存入內存?
快
常見的內存數據庫:
MemCached:看成Redis前身,嚴格來說,MemCached不能叫數據庫,只能叫緩存
不支持持久化。如果內存停電,數據丟失。
Redis:內存數據庫,支持持久化,支持HA
Oracle TimesTen
session一致性
MemCached + keepalive實現
一、Memcached
1、基本原理和體系架構
(*)在內存中,維護了一張巨大的Hash表
(*)通過路由算法來決定數據存儲的位置。---> 客戶端路由
2、安裝配置MemCached
前提:
(1)gcc編譯器
(2)libevent庫
776 tar -zxvf libevent-2.0.21-stable.tar.gz
777 cd libevent-2.0.21-stable
779 ./configure --prefix=/usr/local/libevent
780 make
781 make install
787 tar -zxvf memcached-1.4.25.tar.gz
788 cd memcached-1.4.25
791 ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
793 make install
796 cd bin/
798 ./memcached -u root -d -m 128 -p 11211
799 ./memcached -u root -d -m 128 -p 11212
800 ./memcached -u root -d -m 128 -p 11213
801 ps -ef | grep memcached
3、操作MemCached
(*)命令行
telnet 192.168.109.133 11211
保存數據:
set 如果key存在,替換原來的值
set key1 0 0 4
key名字 標識位 數據過期時間0表示不過期 value的長度
abcd
get key1
統計命令
stats items
stats
4、MemCached路由算法
二、Redis
1、Redis簡介
(1)Redis的前身:Memcached
(2)和Memcached區別“
(*)支持持久化:RDB快照、AOF日誌
(*)支持豐富的數據類型
2、安裝Redis
833 tar -zxvf redis-3.0.5.tar.gz
839 cd redis-3.0.5/
841 make
842 make PREFIX=/usr/local/redis install
redis-benchmark Redis提供的壓力測試工具。模擬產生客戶端的壓力
redis-check-aof 檢查aof日誌文件
redis-check-dump 檢查rdb文件
redis-cli Redis客戶端腳本
redis-sentinel 哨兵
redis-server Redis服務器腳本
核心配置文件:redis.conf
42 daemonize yes
50 port 6379
啟動redis ./bin/redis-server conf/redis.conf
3、操作Redis
(1)命令行
redis-cli
./bin/redis-cli
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> keys *
1) "key1"
對數據的操作:
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> incr money
(integer) 101
127.0.0.1:6379> get money
"101"
127.0.0.1:6379> incrby money 1000
(integer) 1101
(2)Java Api
4、Redis的事務:不是真正的事務,是一種模擬
(1)復習:事務(關系型數據庫)
(*)什麽是事務?
事務有一組DML語句組成。DML 插入更新刪除操作
(*)事務的特點
要麽都成功,要麽都失敗
(*)Oracle中事務的本質:將事務的DML操作寫入日誌。日誌寫入成功,則事務執行成功。
(2)Redis事務的本質:將一組操作放入隊列中,一次執行(批處理)。
(3)對比Oracle和Redis事務的區別
Oracle Redis
開啟事務: 自動開啟 命令:multi
執行語句: DML Redis命令
提交事務: 顯式提交:commit 隱式提交:DDL語句(create table) 命令:exec 執行放在multi裏面的操作
回滾事務: 顯式回滾:rollback 隱式回滾:系統掉電,客戶端退出 命令:discard命令 把隊列中的操作廢棄掉
註意:不是真正的事務,只是一種模擬。
(4)舉例:模擬銀行轉賬
set tom 1000
set mike 1000
tom --> mike 轉賬操作必須在事務中,要麽都成功,要麽都不成功
multi
decrby tom 100
incrby mike 100
exec
127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set mike 1000
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 100
QUEUED
127.0.0.1:6379> incrby mike 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 900
2) (integer) 1100
(5)舉例:買票
set tom 1000
set ticket 1
multi
decrby tom 500
decr ticket
exec
在exec前,從另一個窗口,decr ticket
127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 500
QUEUED
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> exec
1) (integer) 500
2) (integer) -1
5、Redis鎖機制:執行事務操作的時候,如果監視的值發生了變化,則提交失敗。
命令:watch
舉例:買票
set tom 1000
set ticket 1
watch ticket -----> 相當於給ticket加了鎖。認為在下面執行事務的時候,值不會變。
multi
decrby tom 500
decr ticket
exec
127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 500
QUEUED
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get tom
"1000"
nil 代表操作沒有執行或者執行失敗。
6、Redis的消息機制:消息系統
(1)消息的類型
(*)Queue消息:隊列,點對點。
(*)Topic消息:主題,群發:發布消息,訂閱消息
(2)Redis消息機制:
只支持Topic消息。
命令:發布消息 publish
訂閱:subscribe
psubscribe 訂閱消息 可以用通配符來訂閱消息
(3)常用的消息系統:
Redis 只支持 Topic
Kacka 只支持Topic 需要Zookeeper支持。
JMS Java Messging Service java消息服務標準。支持Queue Topic
產品:Weblogic
7、Redis持久化
本質:備份和恢復
(1)RDB快照:默認
(*)看成一種快照,備份。每隔段時間,將內存匯總的數據保存到硬盤上。產生RDB文件。
(*)RDB 生成策略:
147 save 900 1 900秒內,有1個key發生變化
148 save 300 10 300內,如果有10個key發生變化,執行RDB
149 save 60 10000 60秒內,如果有10000個key發生變化,執行RDB
save 時間 發生變化的key的個數
(*)其他參數
164 stop-writes-on-bgsave-error yes 當後臺寫進程出錯時,禁止寫入新的數據
170 rdbcompression yes 是否壓縮。如果看重性能,設置成no
壓縮會節省空間,但會影響備份和恢復性能
182 dbfilename dump.rdb
192 dir ./
(*)RDB的優點和缺點
優點:快 恢復速度快
缺點:在兩次RDB之間,可能會造成數據的丟失。
解決:AOF
(2)AOF日誌
客戶端在操作Redis時,把操作記錄到文件中,如果發生崩潰,讀取日誌,把操作完全執行一遍。
(*)默認是禁用。
509 appendonly no 參數修改成yes
(*)AOF記錄策略
538 # appendfsync always 每個操作都記錄日誌:優點安全 缺點:慢
539 appendfsync everysec
540 # appendfsync no 由操作系統來決定記錄日誌的方式。不會用的到。
(*)AOF日誌重寫:overwrite
舉例:
set money 0
incr money
..100次
set money 100
./redis-benchmark -n 100000
模擬客戶端100000次請求
(*)參數設置
561 no-appendfsync-on-rewrite no 執行重寫的時候,不寫入新的日誌
581 auto-aof-rewrite-min-size 64mb 執行重寫的文件大小。到64M觸發重寫。
(3)當兩個同時存在時,優先執行哪個?
504 # If the AOF is enabled on startup Redis will load the AOF, that is the file
505 # with the better durability guarantees.
AOF開啟時,優先使用AOF
8、Redis的主從復制
1、Redis主從復制集群:
作用:
主從復制,主從備份,防止主節點down機
任務分離:分攤主節點壓力。讀寫分離。
Memcacached 主主復制
Redis 主從復制
Redis集群兩種部署方式
星型模型:
優點:效率高,兩個slave地位一樣,可以直接從主節點取出信息
缺點:HA比較麻煩
線性模型:
優點:HA簡單
缺點:效率不如星型模型
cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf
主節點:關閉rdb aof
509 appendonly no
147 #save 900 1
148 #save 300 10
149 #save 60 10000
從節點
改端口號
50 port 6380
改aof rdb文件名:
182 dbfilename dump6380.rdb
513 appendfilename "appendonly6380.aof"
211 slaveof 192.168.109.133 6379
[email protected] redis]# ./bin/redis-server ./conf/redis6379.conf
[[email protected] redis]# ./bin/redis-server ./conf/redis6380.conf
[[email protected] redis]# ./bin/redis-server ./conf/redis6381.conf
[[email protected] redis]# ps -ef | grep redis
root 4830 1 1 22:56 ? 00:00:00 ./bin/redis-server *:6379
root 4834 1 2 22:56 ? 00:00:00 ./bin/redis-server *:6380
root 4840 1 2 22:56 ? 00:00:00 ./bin/redis-server *:6381
root 4846 1378 0 22:56 pts/1 00:00:00 grep redis
[[email protected] redis]# ./bin/redis-cli -p 6379
127.0.0.1:6379> set tom 10000
OK
127.0.0.1:6379> quit
[[email protected] redis]# ./bin/redis-cli -p 6380
127.0.0.1:6380> get tom
"10000"
默認情況下,從節點只讀。
註意:一次性啟動從節點不要太多。
內存數據庫專題-4