1、nosql:非關係型數據庫;關係型的數據庫代表是mysql;
關係型的數據庫代表是mysql,可以使用sql語句(create insert update select)等,是需要把數據庫存放到庫-表-行-字段裏,查詢的是也一行一行去匹配,當查詢量非常大的時候很耗費資源;
nosql的存儲原理非常簡單(數據類型爲k-v),一個鍵對應一個值,不存在繁瑣的關係鏈,比如mysql查詢的時候,需要找到庫-表-多個字段;
nosql數據可以存儲在內存中,查詢速度非常快;
nosql在性能雖然關係型數據庫,但是並不能完全代替關係型數據庫;比如:部署了論壇後,用戶訪問量太大,數據庫扛不住了,這個時候可以加一層緩存進來(內存裏),也就是nosql,可以減輕數據庫的壓力,
比如查詢完一個帖子後,先放到內存裏(帖子ID對應帖子內容)及是(key對應value)一條一條把論壇的帖子內容緩存到內存裏,當用戶再訪問的時候就不查詢mysql,直接查看緩存,減輕數據庫的壓力,這是最典型的用法了;
nosql沒有複雜的數據結構,擴展非常容易,支持分佈式;如:本來商品存在的A服務器,而A服務器有瓶頸了,那怎麼在B服務器上查詢A服務器的數據呢,mysql數據庫做不到,只有nosql可以增加服務器橫向擴展;
2、常見的nosql數據庫:
鍵值數據庫(k-v);memcached、redis適合存儲用戶信息,比如用戶會話(session)、參數、購物車,這些信息一般都和ID(鍵)掛鉤,這種情況下鍵值數據庫是一個很好的選擇;
用戶會話(session):用戶登錄信息,用來做session共享;
文檔數據庫:mongodb,將數據以文檔的形式存儲,多個key-value組成的文檔,每個文檔都是一系列數據項的集合,每個數據項都有一個名詞與對應的值,值可以是簡單的數據類型,如字符串、數字、日期,也可以是複雜的類型,如有序列表和關聯對象,存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的; 列存儲:Hbase
3、memcached:是國外社區網站Livejournal團隊開發,目的是爲了通過緩存數據庫查詢結果,減少數據庫訪問次數,從而提高動態web站點性能;
官網:www.memcached.org
數據結構簡單(key-value),數據存放在內存裏;不支持持久化(一重啓服務,數據會丟失);
多線程,基於C/S架構;
語句libevent的事件處理,自主內存存儲處理;slab allowcation
數據過期方式;Laze expiration LRU
4、memcache的數據流向;
5:slab allcation:
Slab Allocation的原理
將分配的內存分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱爲slab。
Memcached的內存分配以Page爲單位,Page默認值爲1M,可以在啓動時通過-I參數來指定。
Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。
6:Growth factor:來決定thunk的大小;
Memcached在啓動時通過-f選項可以指定 Growth Factor因子。該值控制chunk大小的差異。默認值爲1.25。
通過memcached-tool命令查看指定Memcached實例的不同slab狀態,可以看到各Item所佔大小(chunk大小)差距爲1.25
命令:# memcached-tool 127.0.0.1:11211 display
7:數據的過期方式;兩種: Lazy expiration LRU
Lazy expiration : memcached內部不會監視記錄是否過期,而是在get時查看時間戳,檢查記錄是否過期,這種技術成爲Lazy expriation(懶惰的過期),不會在是否過期監視上耗費CPU時間;
LRU:memecache會優先使用已超時的記錄空間,當即便如此,也會發生追加新記錄時空間不足的情況,此時就需要使用LRU(least recently used)刪除最近最少使用的空間,因此,當內存空間不足或者無法從slab獲取到新得空間時,就會從最近未使用的記錄中搜索,並將其分配給新的記錄,從緩存實用角度來看,該模型十分理想;存進去數據後一直未使用的,會隔一段時間去查詢下並標記,會讓下次覆蓋;
8:安裝memcached;
安裝:yum install -y memcached libmemcached libevent
啓動:systemctl start memcache
[root@localhost_001 ~]# yum list |grep memcached
libmemcached.x86_64 1.0.16-5.el7 base
libmemcached-devel.x86_64 1.0.16-5.el7 base
memcached.x86_64 1.4.15-10.el7_3.1 base
memcached-devel.x86_64 1.4.15-10.el7_3.1 base [root@localhost_001 yum.repos.d]# yum install -y memcached libmemcached libevent
[root@localhost_001 yum.repos.d]# systemctl start memcached
[root@localhost_001 yum.repos.d]# ps aux |grep memcached
memcach+ 1444 0.0 0.0 325604 1200 ? Ssl 18:59 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 1451 0.0 0.0 112720 968 pts/0 R+ 18:59 0:00 grep --color=auto memcached
[root@localhost_001 yum.repos.d]# netstat -lnpt |grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 1444/memcached
tcp6 0 0 :::11211 :::* LISTEN 1444/memcached
註釋:如上圖例,-u指定以memcache用戶運行,-p監聽的端口號,-m指定內存大小, -c指定併發數(concurrency);
註釋:如上圖例,memcache的監聽端口是11211,
9:那麼如果想自定義監聽端口或者內存大小併發數等;有如下兩種方法:(memcached沒有配置文件)
1:加上這個參數去啓動;/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
[root@localhost_001 yum.repos.d]# /usr/bin/memcached -u memcached -p 11211 -m 128 -c 2048
[root@localhost_001 yum.repos.d]# ps aux |grep memcached
memcach+ 1494 0.0 0.0 325604 1200 pts/0 Tl 19:06 0:00 /usr/bin/memcached -u memcached -p 11211 -m 128 -c 2048
root 1501 0.0 0.0 112720 968 pts/0 R+ 19:07 0:00 grep --color=auto memcached
2:編輯/etc/sysconfig/memcached這個配置文件;
[root@localhost_001 yum.repos.d]# vim /etc/sysconfig/memcached
cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
註釋:OPTIONS="" 表示監聽的主機; -l 指定監聽IP, -d 後臺啓動;
註釋:平時基本修改-m就可以了;
10:查看memcached的狀態; memcache-tool IP:端口 stats
memcached-tool 127.0.0.1:11211 stats
[root@localhost_001 ~]# memcached-tool 127.0.0.1:11211 stats
#127.0.0.1:11211 Field Value
accepting_conns 1
auth_cmds 0
auth_errors 0
bytes 0
bytes_read 7
bytes_written 0
cas_badval 0
cas_hits 0
cas_misses 0
cmd_flush 0
cmd_get 0
cmd_set 0
cmd_touch 0
conn_yields 0
connection_structures 11
curr_connections 10
curr_items 0
decr_hits 0
decr_misses 0
delete_hits 0
delete_misses 0
evicted_unfetched 0
evictions 0
expired_unfetched 0
get_hits 0
get_misses 0
hash_bytes 524288
hash_is_expanding 0
hash_power_level 16
incr_hits 0
incr_misses 0
libevent 2.0.21-stable
limit_maxbytes 67108864
listen_disabled_num 0
pid 1826
pointer_size 64
reclaimed 0
reserved_fds 20
rusage_system 0.017159
rusage_user 0.012256
threads 4
time 1542199271
total_connections 11
total_items 0
touch_hits 0
touch_misses 0
uptime 344
version 1.4.15
註釋:平時中重點關注兩個參數: cmd_get get_hits
cmd_get 表示總的get次數;
get_hist 表示命中率;
一般用get_hist 除以 cm_get來計算命中率;
(2):還可以使用nc命令: 安裝: yum install -y nc
echo stats |nc 127.0.0.1 11211
[root@localhost_001 ~]# echo stats |nc 127.0.0.1 11211
STAT pid 1826
STAT uptime 832
STAT time 1542199759
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.027198
STAT rusage_system 0.024725
STAT curr_connections 10
STAT total_connections 12
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 13
STAT bytes_written 1024
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
可以看到 nc 命令查詢的結果和memcache查詢的結果是一樣子的;
如果查看libmemcached這個包後,還可以查詢它的服務狀態;
memstat --servers=127.0.0.1:11211
[root@localhost_001 ~]# memstat --servers=127.0.0.1:11211
Server: 127.0.0.1 (11211)
pid: 1826
uptime: 1101
time: 1542200028
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.039654
rusage_system: 0.027262
curr_connections: 10
total_connections: 13
connection_structures: 11
reserved_fds: 20
cmd_get: 0
cmd_set: 0
cmd_flush: 0
cmd_touch: 0
get_hits: 0
get_misses: 0
delete_misses: 0
delete_hits: 0
incr_misses: 0
incr_hits: 0
decr_misses: 0
decr_hits: 0
cas_misses: 0
cas_hits: 0
cas_badval: 0
touch_hits: 0
touch_misses: 0
auth_cmds: 0
auth_errors: 0
bytes_read: 30
bytes_written: 2068
limit_maxbytes: 67108864
accepting_conns: 1
listen_disabled_num: 0
threads: 4
conn_yields: 0
hash_power_level: 16
hash_bytes: 524288
hash_is_expanding: 0
bytes: 0
curr_items: 0
total_items: 0
expired_unfetched: 0
evicted_unfetched: 0
evictions: 0
reclaimed: 0
註釋:有三種方法可以查詢memcache的狀態;
memcached-tool 127.0.0.1:11211 stats
echo stats |nc 127.0.0.1 11211
memstat --servers=127.0.0.1:11211