memcached 缓存数据库应用实践

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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,该项永不过期(虽然它可能被删除,以便为其他缓存项目腾出位置)。如果非0Unix时间戳或当前时刻的秒偏移),到达终止时间后,客户端无法再获得这项内容

<bytes>

是随后的数据区块的字节长度,不包括用于分页的“\r\n”。它可以是0(这时后面跟随一个空的数据区块)。

<data block>\r\n

<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的模块

 1 查看php的模块
 2 [root@web06 ~]# /application/php/bin/php -m
 3 [PHP Modules]
 4 bcmath
 5 Core
 6 ctype
 7 curl
 8 date
 9 dom
10 ereg
11 fileinfo
12 filter
13 ftp
14 gd
15 hash
16 iconv
17 json
18 libxml
19 mbstring
20 mcrypt
21 mhash
22 mysql
23 mysqlnd
24 openssl
25 pcntl
26 pcre
27 PDO
28 pdo_mysql
29 pdo_sqlite
30 Phar
31 posix
32 Reflection
33 session
34 shmop
35 SimpleXML
36 soap
37 sockets
38 SPL
39 sqlite3
40 standard
41 sysvsem
42 tokenizer
43 xml
44 xmlreader
45 xmlrpc
46 xmlwriter
47 xsl
48 zlib
49 
50 [Zend Modules]
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://blog.znix.top

NewSQL 数据库缓存策略:Redis 与 Memcached 集成 于是你在图书馆前台设置了一个小书架,把最热门的书放在上面,读者一来就能快速拿到,这个小书架就相当于数据库缓存。在 NewSQL 数据库中,为了提高数据访问速度,也常常会使用缓存策略,而 Redis 和 Memcached 就是两种常用的“小书架”,它们能帮助 NewSQL 数据库更快地响应数据请求。学习 NewSQL 数据库与 Redis、Memcached 的集成策略,能让你在开发高性能应用时更加得心应手,比如开发电商网站、社交平台等,都能显著提升用户体验。 阅读详情

相关推荐

分布式缓存系统Memcached:简介、实践及前端应用

Memcached是一个高性能的内存缓存系统,通过在内存中存储键值对来加速数据访问。它最初由Brad Fitzpatrick创建,用于解决他的网站LiveJournal的性能问题。现在,Memcached已成为一个开源项目,并被广泛应用于许多大型网站和应用程序。

EipGemms的博客 320

Memcached】一文详解 Memcached

Memcached 是一个开源的,支持高性能,高并发的分布式内存缓存系统,由 C 语言编写,总共 2000 多行代码。从软件名称上看,前 3 个字符Mem就是内存的意思,而接下来的后面 5 个字符cache就是缓存的意思,最后一个字符d,是daemon的意思,代表的是服务器端守护进程模式服务。

Code · Cloud · Think · Repeat 9929

缓存数据库memcached

一.memcached简介,memcached简介,缓存,buffer和cache,memcache安装,memcache的命令和命令特点。memcache文件配置

qq_60787657的博客 3369

数据库篇:常见数据库MySQL、Mariadb、PostgreSQL、MangoDB、Memcached和Redis详细介绍

本篇文章将详细总结下各项典型代表的数据库技术,包括MySQL、Mariadb、PostgreSQL、MangoDB、Memcached和Redis,在应用开发过程中的数据库选型、基本介绍、应用场景和区别对比,比如介绍了Redis和Memcached在功能和特性上的一些区别。Redis支持更多的数据类型和功能,可以实现数据的持久化存储和高可用容灾,但相应地也更加复杂。而Memcached则更加简单和轻量,适用于简单的键值对缓存场景。开发者可以根据具体的需求和场景选择合适的缓存系统。还介绍了MariaDB是

SteveRocket's-Blog 5227

Memcached 数据库介绍

弊端 不能持久化 (不支持存在硬盘里)Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统。

wyq2070857323的博客 1483

深入了解memcached缓存数据库

缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。从性能分析: CPU缓存>内存>磁盘>数据库从性能看:内存是介于CPU和磁盘,在实际中内存是CPU和磁盘的桥梁。buffer和cache是内存的不同的体现。2.buffer和cache。

zcffight的博客 1761

Memcached 缓存数据库应用实践

1.1 数据库对比 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存    缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务。 数据库: mysql(关系型数据库,能够保证数据一致性,保证数据不丢失,当因为功能太多,导致性能不高) ===数据参考 缓存数据库: memcache redis(非关系型数据库,性能极高,但不保证数据完整性) === 业务的数据提供者      memcachedb 会将内存的数据写入到磁盘中        redis 主要工作

qq_40798377的博客 234

PHP缓存技术入门到实践

chapter:1缓存技术介绍 chapter:2文件类缓存 chapter:3内存数据库Memcached chapter:4内存数据库之Redis chapter:5浏览器缓存 chapter:6应用程序缓存 chapter:7缓存技术实践应用 源码 https://www.javaxxz.com/thread-397787-1-1.html ...

qq_38472574的博客 107

memcached 高速缓存服务器软件详解

系统环境 redhat rhel6.5 web架构 lnmp memcached介绍: 越来越多的 Web 应用程序开始使用 memcached 这个高速的缓存服务器软件。然而, memcached 的基础知识远远未能像其他 Web 技术那样普及,memcached 在国内的大规模应用也鲜为人知。而日本的 mixi(http://mixi.jp)则在这方面走在了前面,不仅大规模使用 memcach...

weixin_43273168的博客 806

memcached+magent实现memcached集群

首先说明下memcached存在如下问题   本身没有内置分布式功能,无法实现使用多台Memcache服务器来存储不同的数据,最大程度的使用相同的资源;无法同步数据,容易造成单点故障。(memagent代理实现集群)       在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。   Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多

llettod的专栏 630

Memcached:内存缓存的强大引擎及其深度解析

Memcached 是一个高性能、分布式内存对象缓存系统,用于减轻数据库负载、提高Web应用的响应速度和性能。它通过将数据存储在内存中,减少了对数据库的频繁访问,从而提高了数据读取的速度和效率。本文将详细介绍Memcached的工作原理、使用场景、安装与配置、性能优化及其与其他缓存技术的比较。

1277

分布式缓存系统Memcached入门

维基百科上对 Memcached 的介绍是一个分布式的缓存系统, 但是 Memcachd 到底是什么意思,有什么作用呢?缓存一般用来保存一些经常被存取的数据和资源(例如:浏览器会将访问过的网页会话缓存起来),因为通过缓存来存取数据要比从磁盘存取同样的数据要快得多。所以 Memcached 顾名思义,意味着 “内存缓存”,所有缓存的内容都在服务器的内存中。内存中的这些缓存数据可以通过 API 的方式...

Tableau1的博客 216
上一篇: Shell编程基础篇-上
下一篇: Shell编程基础篇-下
惨绿少年
博客等级 码龄9年 173粉丝 236原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值