key value 鍵值數據庫
內存中心化設計
內存中心化設計是一種進來十分流行的架構,用於解決web2.0時代數據大量讀寫帶來的性能壓力。
實現思路:
增加緩衝層,利用內存的高I/O性能
將大量的實時數據以key_value的形式在內存中處理
通過預讀和合並寫入等技術減少後端數據庫的IO壓力
key-value數據庫簡介
memcached 與redis
什麼是memcached?
memcached 是一個高性能的分佈式內存對象緩存系統,用於動態web應用以減輕數據庫負載。他通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態,數據庫驅動網站的速度。
memcached 基於一個存儲鍵/值對的hashmap。
web
|
memcached
|
mysql
memcached語法
memcached的服務器客戶端通信兵不使用複雜的XML等格式,而是使用簡單的基於文本行的協議。因此也可以用telnet在memcached上保存數據,取得數據。
memcached -d -c 10240 -m 1024 -u root
247 ps -ef|grep memcached
248 telnet 127.0.0.1 11211
249 yum install telnet -y
250 telnet 127.0.0.1 11211
mysql-memcached 之間通常沒有直接聯繫,是通過應用程序或者中間件決定的
mysql5.6中加入了一個全新的memcached插件,通過該插件可以非常方便實現mysql與memcached的組合。使得我們可以用memcached語法操作msyql數據庫,也可以使用SQL語法來操作memcached,實現了mysql對於nosql的支持
memcached Plugin:innodb——memcached、local cache
基於mysql官方插件的memcached的實現
安裝:
如果使用的官方發佈的rpm包安裝的mysql,那麼memcached插件已經附帶mysql-server包中了
如果是源碼包 安裝mysql,則需要在編譯過程中加入對應配置項
另外系統中要安裝libevent包
cmake -DWITH_INNODB_MEMCACHED=ON
以mysql rpm包來講 或者二進制包來講
1,先查看插件存儲目錄,以及文件
mysql> select @@plugin_dir;
+------------------------------+
| @@plugin_dir |
+------------------------------+
| /usr/local/mysql/lib/plugin/ |
+------------------------------+
1 row in set (0.00 sec)
mysql> Ctrl-C -- exit!
Aborted
[root@host1 ~]# ls /usr/local/mysql/lib/plugin/ | grep memcached
libmemcached.so
2,導入表結構
接下來,導入memcached插件所需要的表結構
[root@host1 ~]# find / -name innodb_memcached_config.sql
/usr/local/mysql/share/innodb_memcached_config.sql
mysql -h 127.0.0.1 -p < /usr/local/mysql/share/innodb_memcached_config.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| innodb_memcache | ********
| mysql |
| performance_schema |
| t9 |
| test |
| viewdb |
+--------------------+
mysql> use innodb_memcache
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies |
| config_options |
| containers |
+---------------------------+
3,加載、下載插件命令
之後在mysql中加載插件,使用install命令加載也可以使用uninstall卸載
如果需要重啓插件,則需要先uninstall,然後在install
mysql> install plugin daemon_memcached soname 'libmemcached.so';
Query OK, 0 rows affected (0.25 sec)
mysql>uninsall plugin daemon_memcached;
4,查看插件配置信息
mysql> show variables like '%memcache%';
+----------------------------------+------------------+
| Variable_name | Value |
+----------------------------------+------------------+
| daemon_memcached_enable_binlog | OFF | 是否把memcached操作的數據記錄在binlog中,默認是關閉
| daemon_memcached_engine_lib_name | innodb_engine.so |
| daemon_memcached_engine_lib_path | |
| daemon_memcached_option | |
| daemon_memcached_r_batch_size | 1 |
| daemon_memcached_w_batch_size | 1 |
+----------------------------------+------------------+
6 rows in set (0.00 sec)
5.檢查memcached狀態
[root@host1 ~]# ps axu | grep memcached
root 10783 0.0 0.0 331864 136 ? Ssl Jan20 0:01 memcached -d -c 10240 -m 1024 -u root
root 12570 0.0 0.1 103244 836 pts/2 S+ 01:39 0:00 grep memcached
[root@host1 ~]# netstat -tnlp | grep 11211
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 10783/memcached
tcp 0 0 :::11211 :::* LISTEN 10783/memcached
6,innodb_memcache 庫
導入插件所需要的表結構後,會在數據庫中建一個名爲innodb_memcache的庫,
cache_policies 定義緩衝策略 |
| config_options 定義分隔符 |
| containers 容器
cache_policies :
mysql> select * from cache_policies;
+--------------+-------------+-------------+---------------+--------------+
| policy_name | get_policy | set_policy | delete_policy | flush_policy |
+--------------+-------------+-------------+---------------+--------------+
| cache_policy | innodb_only | innodb_only | innodb_only | innodb_only |
+--------------+-------------+-------------+---------------+--------------+
1 row in set (0.00 sec)
cache_police表
cache_police 定義了緩存策略,包含如下選擇:
innodb_only:只是用innodb作爲數據存儲。
cache_only:只使用傳統的memcached引擎作爲後端存儲、
caching:二者皆使用,如果在memcached裏找,如找不到,就查詢innodb
mysql> update cache_policies set get_policy='caching'; 先查cache,如果沒在查innodb,最後在緩存到cache中
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from cache_policies;
+--------------+------------+-------------+---------------+--------------+
| policy_name | get_policy | set_policy | delete_policy | flush_policy |
+--------------+------------+-------------+---------------+--------------+
| cache_policy | caching | innodb_only | innodb_only | innodb_only |
+--------------+------------+-------------+---------------+--------------+
1 row in set (0.00 sec)
config_options :
config_options定義了分隔符:
separate:memcached只是識別單值,使用此分隔符(|)來連接字段的值
table_map_delimiter:通過此分隔符(.)來確認表和鍵,如:@@table.key
mysql> select * from config_options;
+---------------------+-------+
| name | value |
+---------------------+-------+
| separator | | | 字段分割符號
| table_map_delimiter | . | 表
+---------------------+-------+
containers表
mysql> select * from containers;
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| name | db_schema | db_table | key_columns | value_columns | flags | cas_column | expire_time_column | unique_idx_name_on_key |
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| aaa | test | demo_test | c1 | c2 | c3 | c4 | c5 | PRIMARY |
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
1 row in set (0.00 sec)
memcached 語法簡介-參數
key 用於查找緩存值
flags 可以包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息、
expiration 在緩存中保存鍵值對的時間長度
bytes 在緩存中存儲的字節數
value 存儲的值
語法:
set 用於向緩存添加新的鍵值對。如果已存在,則替換之前新的。
set UId 0 0 5
add 僅當緩存不存在鍵時候,add命令纔會向緩衝中添加一個鍵值對,如果緩存中已經存在鍵,則之前的值將任然保持相同,並且將活動not_stored
get 查詢鍵值對
replace 專門更新現有的鍵值對
delete 用於刪除memcached中飯任何現有的值,如果存在於緩存中,則刪除該值,如果不存在,則返回not_found
高級語法:
gets 返回的信息多、
cas (check & set) 是一個非常便捷的memcached命令,用設置名稱,
flush——all 用於清理緩存中的所有名稱、值對(慎用,和delete一樣會刪除數據庫中數據)
status 狀態
stats命令用於調優緩存的使用
mysql>update cache_policies set flush_policy='cache_only'; 以後在memcached中做flush_all操作的時候,只操作cache,而不操作數據庫的表數據
將某個表加入memcached中:
step1:
擴充原有表的字段,使其符合memcached插件要求
step2:
在containers表中增加新的配置
step3:
檢查結果
step1
使用memcached緩存的表需要附加多個字段,用於存儲memcached數據參數值
alter table t111 add ( flags int , cas_column bigint, extime int );
alter table t111 add primary key(id);
insert into innodb_memcache.containers values( 'users','viewdb','t111','id','name','flags','cas_cloumn','extime','PRIMARY');
select * from innodb_memcache.containers\G;
nc 127.0.0.1 11211
get @@users.1