关于java:Memcached-缓存数据库应用实践

37次阅读

共计 7210 个字符,预计需要花费 19 分钟才能阅读完成。

1.1 数据库比照

缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存

毛病:断电数据失落(双电),用缓存存储数据的目标只是为了应酬大并发的业务。

数据库: mysql(关系型数据库,可能保证数据一致性,保证数据不失落,当因为性能太多,导致性能不高) === 数据参考

缓存数据库: memcache redis(非关系型数据库,性能极高,但不保障数据完整性) === 业务的数据提供者

memcachedb 会将内存的数据写入到磁盘中

redis 次要工作场合是内存中,然而定期备份内存数据到硬盘

1.1.1 数据库的抉择

数据存储,数据仓库抉择 mysql 这种磁盘的数据库

高并发,业务大的利用抉择 memcache 这种内存数据库

1.1.2 数据库分类

关系型数据库 mysql

非关系型数据库(NOSQL)memcached redis MongoDB

1.2 memcached 介绍

Memcached 是一款开源的、高性能的纯内存缓存服务软件。Mem 是内存的意思,cache 是缓存的意思,d 是 daemon 的意思。

memcache 是项目名称,也是一款软件,其架构是 C/S 架构

​ memcached 官网:http://memcached.org/

1.2.1 memcache 长处

① 对于用户来讲,用户拜访网站更快了,体验更好了。

②对网站来说,数据库压力升高了。只有当内存没有数据时才会去申请数据库。第一次写入的数据也会申请数据库。个别公司没有预热,只有当用户读取过数据库才会放到 Memcached 中。

② 晋升了网站的并发拜访,缩小服务器数量。

1.3 Memcached 在企业中应用场景

1.3.1 作为数据库的前端缓存利用

当数据库(mysql)接受不了大并发的申请时,能够将数据缓存到内存中(缓存数据库),而后就能够解决

作为数据库的前端缓存最大目标:缩小数据库被大量拜访的压力

1.3.2 作为集群后端的 session 会话放弃

session 存储在文件,数据库,memcache,或内存等的服务端上,

cookie 寄存在客户端浏览器上。

session 是一个存在服务器上的相似于一个散列表格的文件。外面存有咱们须要的信息,在咱们须要用的时候能够从外面取出来。

session依赖 cookie存在,申请客户端达到服务端后,服务端会随机生成一个字符串,作为该用户的标识,该字符串通过 cookie 返回给客户端,客户端浏览器会以该字符串为 key 放到 session id 外面,随机字符串的 key 外面能够先没有值。如果用户再次提交,申请信息中的用户名明码等用户信息保留在随机字符串的 value 中,申请达到服务端,用户名明码正确,随机字符串会被受权,提一个标记给到 sessionid 中的随机字符串的 value 中,证实该用户曾经是登录状态,客户端再次带着该随机字符串拜访服务端,服务端会晓得该用户曾经登录不需验证,间接返回申请的信息。

session和 cookie区别

1、cookie 数据寄存在用户的浏览器上,session 数据存储在服务器上

2、cookie 在本地的浏览器中,能够被提取剖析,安全性差。为了平安,登录账户等信息能够缓存在 session 中。

3、session 会在肯定工夫内保留在服务器上,访问量增大会给服务器带来压力,能够应用缓存工具,如 memcache 等

1.3.3 网站开发如何判断用户信息

最开始的技术办法:服务器在你的浏览器中写一个 cookies,这个 cookies 就蕴含了你的用户名及登录信息。因为 cookies 是存储在本地浏览器中,所以第三方工具很容易盗取 cookies 信息。

最开始:

cookies cookies 名字:内容(用户名,登录信息)

改良后:

本地浏览器寄存:

cookies cookies 名字:内容(session id 编号)

服务器寄存:

session session id:内容(用户名,登录信息)

支流应用场景:cookies + session

1.3.4 session 共享的不同解决方案

1、session 文件提供 NFS 共享

2、session 文件提供 rsync scp 共享

3、将 session 的内容寄存在数据库(mysql)中,所有的机器都能够通过 ip:port 读取

4、将 session 的内容寄存在缓存数据库中,所有的机器都能够通过 ip:port 读取

益处:利用断电、重启失落数据的个性。定时清理数据;进步并发

1.3.5 memcache 原理长处

启动 Memcached 吋,依据指定的内存大小参数,会被调配一个内存个间。当咱们读取数据库的各类业务数据后,数据会同吋放入 Memcached 缓存中,,下一次用户申请同样的数据,程序间接去 Memcached 取数据返回给用户。

长处:

① 对于用户来讲,用户拜访网站更快了,体验更好了。#

② 对网站来说,数据库压力升高了。只有当内存没有数据时才会去申请数据库。第一次写入的数据 也会申请数据库。个别公司没有预热,只有,用户读取过数据库才会放到 Memcached 中。

③ 晋升了网站的并发拜访,缩小服务器数最。

原理图

1.4 Memcached 分布式缓存集群

memcached 天生不反对分布式集群, 须要通过程序反对分布式存储

1.4.1 Memcached 分布式缓存集群的特点

1. 所有 MC 服务器内存的内容都是不一样的。这些服务器内容加起来靠近数据库的容量。比方 1T 的数据库,一台缓存数据库的内存没有那么大,因而分成 10 台缓存服务器。

2. 通过在客户端 (Web) 程序或者 MC 的负载均衡器上用 HASH 算法,让同一内容都调配到一个 MC 服务器。

3. 一般的 HASH 算法对于节点宕机会带来大量的数据流动(生效),可能会引起雪崩效应。

4. 一致性 HASH 能够让节点宕机对节点的数据流动 (生效) 降到最低。

一般的 hash*算法 *

首先将 key 解决为一个 32 位字符串,取前 8 位,在通过 hash 计算解决成整数并返回,而后映射到其中一台服务器这样失去其中一台服务器的配置,利用这个配置实现分布式部署。在服务器数量不发生变化的状况下,一般 hash 散布能够很好的运作,当服务器的数量发生变化,问题就来了。试想,减少一台服务器,同一个 key 通过 hash 之后,与服务器取模的后果和没减少之前的后果必定不一样,这就导致了,之前保留的数据失落。

一致性 hash*算法 *

一致性哈希算法

长处:在分布式的 cache 缓存中,其中一台宕机,迁徙 key 效率最高

将服务器列表进行排序,依据 mHash($key) 匹配相邻服务器

一致性 hash算法 将数据流动降到最低

参考资料

http://blog.csdn.net/cywosp/article/details/23397179
http://blog.csdn.net/zhangskd/article/details/50256111

第 2 章 memcached 应用

2.1 装置 memcached

2.1.1 环境阐明

[root@cache01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 
[root@cache01 ~]# uname -r
3.10.0-693.el7.x86_64
[root@cache01 ~]# getenforce
Disabled
[root@cache01 ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@cache01 ~]# hostname -I
10.0.0.21 172.16.1.21

2.1.2 装置 memcached

[root@cache01 ~]# yum -y install memcached

2.1.3 查看配置

[root@cache01 ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

2.1.4 查看启动脚本

[root@cache01 ~]# cat /usr/lib/systemd/system/memcached.service 
[Unit]
Description=Memcached 
Before=httpd.service
After=network.target

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS

[Install]
WantedBy=multi-user.target

2.1.5 启动服务

[root@cache01 ~]# systemctl start memcached.service

2.2 治理 memcached

2.2.1 memcached 数据库语法格局

set              key   0        0           10

<command name>  <key> <flags> <exptime> <bytes>\r\n

n 换行且光标移至行首

r 光标移至行首,但不换行

参数 阐明
<flags> 是在取回内容时,与数据和发送块一起保留服务器上的任意 16 位无符号整形(用十进制来书写)。客户端能够用它作为“位域”来存储一些特定的信息;它对服务器是不通明的。
<exptime> 是终止工夫。如果为 0,该项永不过期(尽管它可能被删除,以便为其余缓存我的项目腾出地位)。如果非 0(Unix 工夫戳或以后时刻的秒偏移),达到终止工夫后,客户端无奈再取得这项内容
<bytes> 是随后的数据区块的字节长度,不包含用于分页的“rn”。它能够是 0(这时前面追随一个空的数据区块)。
<data block>rn <data block> 是大段的 8 位数据,其长度由后面的命令行中的 <bytes> 指定。

2.2.2 数据库应用

写入读取数据

[root@cache01 ~]# printf "set key008 0 0 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211
STORED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
VALUE key008 0 10
oldboy0987
END

写入数据长度不合乎,定义过大

[root@cache01 ~]# printf "set key009 0 0 11\r\noldboy0987\r\n"|nc 10.0.0.21 11211
[root@cache01 ~]# printf "get key009\r\n"|nc 10.0.0.21 11211
END

写入数据长度不合乎,定义过小

[root@cache01 ~]# printf "set key010 0 0 9\r\noldboy0987\r\n"|nc 10.0.0.21 11211
CLIENT_ERROR bad data chunk
ERROR
[root@cache01 ~]# printf "get key010\r\n"|nc 10.0.0.21 11211
END

时效性

[root@cache01 ~]# printf "set key011 0 10 10\r\noldboy0987\r\n"|nc 10.0.0.21 11211
STORED
[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211
VALUE key011 0 10
oldboy0987
END
[root@cache01 ~]# printf "get key011\r\n"|nc 10.0.0.21 11211
END

删除数据

[root@cache01 ~]# printf "delete key008\r\n"|nc 10.0.0.21 11211
DELETED
[root@cache01 ~]# printf "get key008\r\n"|nc 10.0.0.21 11211
END

2.3 memcache php 版本客户端装置应用

命令集

# 编译进去 php_mem
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
make
make install
# 激活 php_memcached
sed -i '$a extension=memcache.so' /application/php/lib/php.ini
pkill php
/application/php/sbin/php-fpm -t
/application/php/sbin/php-fpm
/application/php/bin/php -m|grep memcache

查看以后环境

查看 php 的模块

View Code 查看 php 的模块

* 执行过程 *

编译装置

[root@web06 memcache-2.2.5]# make install
Installing shared extensions:     /application/php-5.5.32/lib/php/extensions/no-debug-non-zts-20121212/
[root@web06 memcache-2.2.5]# ls /application/php/lib/php/extensions/no-debug-non-zts-20121212/
memcache.so
[root@web06 memcache-2.2.5]# sed -i '$a extension=memcache.so' /application/php/lib/php.ini
[root@web06 memcache-2.2.5]# pkill php
[root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm -t
[17-Nov-2017 11:39:13] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful

[root@web06 memcache-2.2.5]# /application/php/sbin/php-fpm
[root@web06 memcache-2.2.5]# /application/php/bin/php -m|grep memcache
memcache

2.3.1 编写测试文件

[root@web01 blog]# cat /application/nginx/html/blog/mc.php
<?php
    $memcache = new Memcache;
    $memcache->connect('10.0.0.21', 11211) or die ("Could not connect");
    $memcache->set('key20171117', 'hello,world');
    $get_value = $memcache->get('key20171117');
    echo $get_value;
?>

浏览器拜访

数据库读取测试

[root@cache01 ~]# printf "get key20171117 \r\n"|nc 10.0.0.21 11211 
VALUE key20171117 0 11
hello,world
END

2.4 web 治理 memcached

应用的软件 memadmin

官网:http://www.junopen.com/memadmin/

将程序包放如站点目录,浏览器进行拜访即可

[root@web06 tools]# tar xf memadmin-1.0.12.tar.gz -C /application/nginx/html/blog/

默认用户名明码为 admin

增加一个新的 memcached 服务器

web 界面治理全中文,较为简单

2.5 memcached 数据缓存

通过程序实现

2.5.1 blog 站点实现 memcached 存储

[root@web06 ~]# cat /application/nginx/html/blog/wp-content/object-cache.php

2.6 memcached session 共享

办法 1:

通过程序实现,web01 只须要往 memcahce 写 session,web02 从 memcahce 读 session(更具备通用性)

办法 2:

通过 php 的配置文件,让 php 默认将 session 存储在文件中,批改为存储在 memcached 中

sed -i 's#session.save_handler = files#session.save_handler = memcache#;$a session.save_path ="tcp://10.0.0.21:11211"' /application/php/lib/php.ini

应用这个性能,须要应用 php 的 session 函数

作者:惨绿少年
出处:http://clsn.io

欢送关注公众号【码农开花】一起学习成长
我会始终分享 Java 干货,也会分享收费的学习材料课程和面试宝典
回复:【计算机】【设计模式】【面试】有惊喜哦

正文完
 0