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