1. nosql介绍
- 非关系型数据库也叫Nosql数据库,全称是not noly sql。
- 2009年初,Johan Oskarsson举办了一场关于开源分布式数据库的讨论,Eric Evans在这次讨论中提出了NoSQL一词,用于指代那些非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。Eric Evans使用NoSQL这个词,并不是因为字面上的“没有SQL”的意思,他只是觉得很多经典的关系型数据库名字都叫“**SQL”,所以为了表示跟这些关系型数据库在定位上的截然不同,就是用了“NoSQL“一词。
- 非关系型数据库提出另一种理念,例如,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,用户可以根据需要去添加自己需要的字段,这样,为了获取用户的不同信息,不需要像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。
1.2关系型数据库与非关系型数据库的区别:
- 关系型数据库通过外键关联来建立表与表之间的关系,非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。
2.memrcached介绍
MemCache是一个开源的高性能的分布式的内存对象缓存系统,用于各种动态应用以减轻数据库负担。它通过在内存中缓存数据和对象,来减少读取数据库的次数,从而提高动态、数据库驱动应用速度。MemCache会在内存中开辟一块空间,建立一个统一的巨大的hash表,hash表能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
通常在访问量高的Web网站和应用中使用MemCache,用来缓解数据库的压力,并且提升网站和应用的响应速度。
在应用程序中,我们通常在以下节点来使用MemCached:
- 访问频繁的数据库数据(身份token、首页动态)
- 访问频繁的查询条件和结果
- 作为Session的存储方式(提升Session存取性能)
- 页面缓存
- 更新频繁的非重要数据(访客量、点击次数)
- 大量的hot数据
3.安装memcached
[root@knightlai02 ~]# yum install -y memcached libmemcached libevent
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 8.4 kB 00:00:00
* base: centos.01link.hk
* epel: mirrors.aliyun.com
* extras: centos.01link.hk
* updates: centos.01link.hk
启动memcached
[root@knightlai02 ~]# systemctl start memcached
[root@knightlai02 ~]# systemctl status memcached
● memcached.service - Memcached
Loaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2018-10-30 06:47:45 EDT; 6s ago
编辑配置文件
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="127.0.0.1" //这里是ip地址
其中-m指定memcached分配内存
-c指定最大并发数
-u指定运行memcached服务的用户
4. 查看memcachedq状态
[root@knightlai02 ~]# memcached-tool 127.0.0.1:11211 stats
Usage: memcached-tool <host[:port] | /path/to/socket> [mode]
memcached-tool 10.0.0.5:11211 display # shows slabs
memcached-tool 10.0.0.5:11211 # same. (default is display)
memcached-tool 10.0.0.5:11211 stats # shows general stats
memcached-tool 10.0.0.5:11211 dump # dumps keys and values
5.memcached命令行
可以用telnet命令连接:
[root@knightlai02 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set key2 0 30 2
aa
STORED
get key2
VALUE key2 0 2
aa
END
<flags> 是一个16位的无符号的整数(以十进制的方式表示)。该标志将和需要存储的数据一起存储,并在客户端get数据时返回。客户端可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
<exptime> 为过期的时间。若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)。如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
<bytes> 需要存储的字节数,当用户希望存储空数据时<bytes>可以为0
<data block>需要存储的内容,输入完成后,最后客户端需要加上\r\n(直接点击Enter)作为结束标志。
6. memcached数据导出和导入
6.1数据导出
[root@knightlai02 ~]# memcached-tool 127.0.0.1:11211 dump > data.txt
Dumping memcache contents
Number of buckets: 1
Number of items : 1
Dumping bucket 1 - 1 total items
6.2数据导入
[root@knightlai02 ~]# cat data.txt
add key4 3 1540907680 5
knigh
add key3 3 1540907557 4
adbc
[root@knightlai02 ~]# systemctl restart memcached
[root@knightlai02 ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED
[root@knightlai02 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key3
VALUE key3 3 4
adbc
END
注意:导出的数据是带有一个时间戳的,这个时间戳就是该条数据过期的时间点,如果当前时间已经超过该时间戳,那么是导入不进去的
7. php连接memcached
编译之前查看扩展模块
[root@knightlai02 php-5.6.32]# /usr/local/php-fpm/bin/php -m
[PHP Modules]
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mcrypt
mysql
mysqli
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
7.2 开始编译安装:
先安装php的memcache扩展
cd /usr/local/src/
wget http://pecl.php.net/get/memcache-2.2.3.tgz
tar zxf memcache-2.2.3.tgz
cd memcache-2.2.3
[root@knightlai02 memcache-2.2.3]# /usr/local/php-fpm/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
..........................................................
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20131226/
开始编译安装完成后,会出现这样一个提示“Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20131226/”这样就表示成功了。
[root@knightlai02 memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.ini
;extension=php_openssl.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll
//在这个地方加入以下这行就可以
extension=memcache.so
[root@knightlai02 memcache-2.2.3]# /usr/local/php-fpm/bin/php -m
[PHP Modules]
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mcrypt
memcache
mysql
mysqli
openssl
这里我们就可以看到memcache这个模块加进来了。
7.3测试php连接memcache是否成功
//这里我们有一段试例代码下载下来,如果出现以下数据那就可以编译成功了!
[root@knightlai02 memcache-2.2.3]# curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
[root@knightlai02 memcache-2.2.3]# /usr/local/php-fpm/bin/php 1.php
Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array
(
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
)
<br>Get key1 value: <br>Get key2 value: <br>
8. memcached中存储sessions
[root@knightlai02 memcache-2.2.3]# wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /usr/local/apache2/htdocs/session.php
其中session.php内容可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
curl localhost/session.php