1. 程式人生 > >內存數據庫專題-4

內存數據庫專題-4

觸發 3.0.5 主從 持久化 令行 memcached creat mon service

------------內存數據庫專題---------------

為什麽要把數據存入內存?


常見的內存數據庫:

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

792 make
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存在,替換原來的值
add 如果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