目录
前言
许多Web应用都将数据保存到 RDBMS(Relational Database Management System,关系数据库管理系统)中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。
一、NoSQL介绍
1.1 NoSQL产品
NoSQL(非关系型数据库)常见的产品有redis、mongodb、memcached等。我在《Linux系统之关系型数据库与非关系型数据库》这篇博客中有对关系型数据库和非关系型数据库的特点、两者区别简单介绍过,感兴趣的可以去看一下。一般非关系型数据库以键值对**(Key-Value)**的方式存储数据,在实际生产中我们也将NoSQL产品做缓存数据库,从而缓解后端DB压力。
1.2 NoSQL特点
优点:
- 高可扩展性;
- 分布式计算;
- 低成本;
- 架构的灵活性,半结构化数据;
- 没有复杂的关系。
缺点:
- 没有标准化;
- 有限的查询功能(到目前为止)。
二、构建缓存服务器
2.1 Memcached存储
2.1.1 服务框架
2.1.2 缓存原理
- 检查客户端的请求数据是否在memcache中,如有,直接把请求数据返回,不再对数据库进行任何操作,路径操作为:1-2-3-4。
- 如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现),路径操作为:1-2-5-6-4-2。
memcache能存放多少数据,取决于服务器本身的内存有多大。
2.1.3 Memcache特点
-
内置内存存储方式:
为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,重启操作系统会导致全部数据消失。
-
简单key/value存储:
服务器不关心数据本身的意义及结构,存储项由**“键、过期时间、可选的标志及数据”**四个部分组成。
-
不互相通信的分布式:
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,**怎样进行分布式呢?**这完全取决于客户端的实现:首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。
Tokyo Tyrant 是由同一作者开发的 Tokyo Cabinet 数据库网络接口,它拥有Memcached兼容协议。
2.1.4 安装Memcached
(1)安装memcached
[root@memcached ~]# yum install memcached -y
[root@memcached ~]# systemctl start memcached #启动
(2)修改配置文件
[root@memcached ~]# vim /etc/sysconfig/memcached
PORT="11211" #监听的端口。默认11211,可以修改
USER="memcached" #用户
MAXCONN="1024" #默认并发。可以修改,每秒允许1024个连接memcached
CACHESIZE="64" #给的内存。默认是单位是M
OPTIONS="" #监听的网络地址
把ip地址发给开发人员,开发的会使用api接口连接memcached。
(3)测试
[root@memcached ~]# yum install -y telnet #安装telent
[root@memcached ~]# telnet 192.168.246.188 11211
Trying 192.168.246.188...
Connected to 192.168.246.188.
Escape character is '^]'. #到此表明可连接memcached
set name 0 60 9 #设置名称为name的key
hello #给name的值
STORED #出现stored表示已经存储成功。
get name #查询key值
VALUE name 0 9
hello
END
quit #退出
参数解释:
name:key的名字 自己定义
0:key的id号,需要和其他的key不一样
60:缓存过期时间,单位为秒,0为永远
9:字符串最大长度
memcached不足:
存储的数据类型单一,而且数据只能存储在内存中,无法实现数据的持久化,服务器重启,数据将消失,因此在实际生产中很少去用它。
2.2 Redis存储
2.2.1 Redis介绍
Redis是一个开源的、使用C语言编写的、可基于内存也可持久化的Key-Value数据库。redis的官网:redis.io
注:域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地。
2.2.2 Redis的特点
-
丰富的数据结构
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)等数据结构的存储。
-
支持持久化
可通过RDB、AOF实现持久化。
-
支持事务
事务是指:一个完整的动作,要么全部执行,要么全部不执行。
-
支持主从、集群、哨兵
可做主从同步,类似于我们的MySQL主从。
2.2.3 安装Redis
安装单机版Redis
(1)下载并使用make安装
[root@redis-master ~]# mkdir -p /data/application #创建工作目录
[root@redis-master ~]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz #下载redis
[root@redis-master ~]# tar xzf redis-4.0.9.tar.gz -C /data/application/ #解压
[root@redis-master ~]# cd /data/application/
[root@redis-master application]# mv redis-4.0.9/ redis
[root@redis-master application]# cd redis/
[root@redis-master redis]# yum install -y gcc make #安装编译工具
[root@redis-master redis]# make
#注:如果报错请将刚才解压的安装包删除掉,再次重新解压并进行make安装即可。
(2)修改Redis配置文件
[root@redis-master redis]# cp redis.conf redis.conf.bak
[root@redis-master redis]# vim redis.conf #修改如下
bind 192.168.246.202 #只监听内网IP
daemonize yes #开启后台模式将on改为yes
port 6379 #端口号
dir /data/application/redis/data #本地数据库存放持久化数据的目录该目录(需要存在)
[root@redis-master redis]# mkdir /data/application/redis/data #创建存放数据的目录
(3)配置redis为systemctl启动
[root@redis-master redis]# cd /lib/systemd/system
[root@redis-master system]# vim redis.service
[Unit]
Description=Redis
After=network.target
[Service]
ExecStart=/data/application/redis/src/redis-server /data/application/redis/redis.conf --daemonize no
ExecStop=/data/application/redis/src/redis-cli -h 127.0.0.1 -p 6379 shutdown
[Install]
WantedBy=multi-user.target
参数详解:
• [Unit] #表示这是基础信息
• Description #是描述
• After #是在那个服务后面启动,一般是网络服务启动后启动
• [Service] #表示这里是服务信息
• ExecStart #是启动服务的命令
• ExecStop #是停止服务的指令
• [Install] #表示这是是安装相关信息
• WantedBy #是以哪种方式启动:multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
(4)启动Redis服务
[root@redis-master system]# systemctl daemon-reload #重新加载
[root@redis-master system]# systemctl start redis.service
(5)登录Redis
[root@redis-master system]# cd /data/application/redis/src/
[root@redis-master src]# ./redis-cli -h 192.168.139.154 -p 6379
192.168.139.154:6379> ping #测试redis是否可以用
PONG #出现该字样,表明Redis缓存服务器可用
单机版redsi已经部署完成。将ip和端口发给开发就可以了。
总结
以上就是对Memcache和Redis缓存服务器的构建,对非关系型数据库及其相关产品做了简单的介绍,包括常用非关系型数据库缓存原理、特点的介绍以及安装。后续我将会讲Redis如何实现数据持久化、Redis-sentinel(哨兵模式)监控Redis集群等知识点。总结一下Redis和Memcache的区别:
- Redis不仅仅支持简单的k/v类型的数据,同时还提供了list、set、zset、hash等数据结构的存储;
- Redis支持master-slave(主-从)模式应用;
- Redis支持数据的持久化。