一.缓存数据库的概念
传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库(DRDB:Disk-Resident Database)。磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题。
近年来,内存容量不断提高,价格不断下跌,操作系统已经可以支持更大的地址空间(计算机进入了64位时代),同时对数据库系统实时响应能力要求日益提高,充分利用内存技术提升数据库性能成为一个热点。
在数据库技术中,目前主要有两种方法来使用大量的内存。一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问。另一种就是内存数据库(MMDB:Main Memory Database,也叫主存数据库)技术,就是干脆重新设计一种数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用CPU周期和内存,这种技术近乎把整个数据库放进内存中,因而会产生一些根本性的变化。
内存数据库系统带来的优越性能不仅仅在于对内存读写比对磁盘读写快上,更重要的是,从根本上抛弃了磁盘数据管理的许多传统方式,基于全部数据都在内存中管理进行了新的体系结构的设计,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,从而使数据处理速度一般比传统数据库的数据处理速度快很多,一般都在10倍以上,理想情况甚至可以达到1000倍。
而使用共享内存技术的实时系统和使用内存数据库相比有很多不足,由于优化的目标仍然集中在最小化磁盘访问上,很难满足完整的数据库管理的要求,设计的非标准化和软件的专用性造成可伸缩性、可用性和系统的效率都非常低,对于快速部署和简化维护都是不利的。
二.内存数据库历史和发展
1.雏形期
从上个世纪60年代末到80年代初。在这个时期中,出现了主存数据库的雏形。1969年IBM公司研制了世界上最早的数据库管理系统——基于层次模型的数据库管理系统IMS,并作为商品化软件投入市场。在设计IMS时,IBM考虑到基于内存的数据管理方法,相应推出了IMS/VS Fast Path。Fast Path是一个支持内存驻留数据的商业化数据库,但它同时也可以很好地支持磁盘驻留数据。在这个产品中体现了主存数据库的主要设计思想,也就是将需要频繁访问,要求高响应速度的数据直接存放在物理内存中访问和管理。在这个阶段中,包括网状数据库、关系数据库等其他各种数据库技术也都逐渐成型。
2. 技术理论成熟期
1984 年,D J DeWitt 等人发表了《主存数据库系统的实现技术》一文。第一次提出了 Main Memory Database(主存数据库)的概念。预言当时异常昂贵的计算机主存价格一定会下降,用户有可能将大容量的数据库全部保存在主存中,提出了 AVL 树、哈希算法、主存数据库恢复机制等主存数据库技术的关键理论,为主存数据库发展指出了明确的方向 。
1984 年,D J DeWitt 等人提出使用非易逝内存或预提交和成组提交技术作为主存数据库的提交处理方案,使用指针实现主存数据库的存取访问。
1985 年,IBM 推出了 IBM 370 上运行的 OBE 主存数据库。
1986 年,RB Hagman 提出了使用检查点技术实现主存数据库的恢复机制。威斯康星大学提出了按区双向锁定模式解决主存数据库中的并发控制问题。并设计出 MM-DBMS 主存数据库。贝尔实验室推出了 DALI 主存数据库模型。
1987 年,ACM SIGMOD 会议中提出了以堆文件(HEAP FILE)作为主存数据库的数据存储结构。SouthernMethodist 大学设计出 MARS 主存数据库模型。
1988 年普林斯顿大学设计出 TPK 主存数据库。
1990 年普林斯顿大学又设计出 System M 主存数据库。
3.产品发展期和市场成长期
随着互联网的发展,越来越多的网络应用系统需要能够支持大用户量并发访问、高响应速度的的数据库系统,主存数据库市场成熟半导体技术快速发展,半导体内存大规模生产,动态随机存取存储器(DRAM)的容量越来越大,而价格越来越低,这无疑为计算机内存的不断扩大提供了硬件基础,使得主存数据库的技术可行性逐步成熟
1994年美国OSE公司推出了第一个商业化的,开始实际应用的主存数据库产品Polyhedra
1998年德国SoftwareAG推出了Tamino Database。
1999年日本UBIT会社开发出XDB主存数据库产品。韩国Altibase推出Altibase。
2000年奥地利的QuiLogic公司推出了SQL-IMDB。
2001年美国McObject推出eXtremeDB。加拿大Empress公司推出EmpressDB。
4.几种主存技术应用的比较
第一代:用户定制的主存数据库。通过应用程序来管理内存和数据;不支持SQL语句, 不提供本地存储, 没有数据库恢复技术;性能好但很难维护和在别的应用中不能使用;应用在实时领域比如工厂自动化生产。
第二代:简单功能的内存数据库。能够快速处理简单的查询;支持部分的 SQL语句和简单的恢复技术;主要目的是能够快速处理大量事务;针对简单事务处理领域,尤其是交换机, 移动通信等。
第三代:通用的主存数据库。针对传统的商业关系型数据库领域,能够提供更高的性能、通用性以及稳定性;提供不同的接口来处理复杂的SQL语句和满足不同的应用领域;可以应用在计费、电子商务、在线安全领域,几乎包括磁盘数据库的所有应用领域。
5.几种企业中常用的缓存数据库比较
1)Memcached
#1. Memcached简介
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value存储系统
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
#2. Memcached优缺点
优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。
缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高。
2) Redis
#.1 Redis简介
Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。
Redis采用内存(In-Memory)数据集(DataSet) 。
支持多种数据类型。
运行于大多数POSIX系统,如Linux、*BSD、OS X等。
redis就是非关系型数据库的一种,存储方式是:key:value
#2.Redis优缺点
优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高。
缺点:不支持多线程读写,相比Memcached会慢。
3)Tair
#.1 Tair 简介
Tair是由淘宝网自主开发的Key/Value结构数据存储系统,在淘宝网有着大规模的应用。您在登录淘宝、查看商品详情页面或者在淘江湖和好友“捣浆糊”的时候,都在直接或间接地和Tair交互。
Tair是一个Key/Value结构数据的解决方案,它默认支持基于内存和文件的两种存储方式,分别和我们通常所说的缓存和持久化存储对应。
Tair除了普通Key/Value系统提供的功能,比如get、put、delete以及批量接口外,还有一些附加的实用功能,使得其有更广的适用场景。
#.2 Tair 优缺点
优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。
缺点:单机情况下,读写性能较其他两种产品较慢。
4)测试
5)测试结果
Memcached:多核的缓存服务,更加适合于多用户并发访问次数(访问次数较少的应用场景)。
Redis:单核缓存服务,在单节点情况下,更加适合少量用户,多次访问的应用场景。
三、企业级缓存中间件Redis
1.redis简介
Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。
Redis采用内存(In-Memory)数据集(DataSet) 。
支持多种数据类型。
运行于大多数POSIX系统,如Linux、*BSD、OS X等。
redis就是非关系型数据库的一种,存储方式是:key:value
2.redis的作用
1.会话保持(键过期)
2.缓存(放在数据库前面,memcache,mongodb)
3.消息队列(kafka)
3.为什么要用Redis
1.redis功能全面
2.redis企业使用率高
4.redis优点
1.高速读写
将所有数据存储在内存,单线程服务,使用C语言
2.部署简单,使用稳定
3.数据类型丰富
String: 字符串类型
Hash: 哈希类型
List: 列表类型
Set: 集合类型
Sorted set: 顺序集合类型
4.支持持久化
将内存的数据写入磁盘
5.多种内存分配及回收策略
6.支持事物、锁
7.消息队列、消息订阅
8.支持高可用
哨兵模式
9.支持分布式分片集群
10.支持的客户端语言很多
java,php,python,nodejs,C语言
5.redis帮助
官方网站:https://redis.io/
下载网站:http://download.redis.io/releases/
帮助网站:http://redisdoc.com/
6.软件特性
1.透明性
分布式系统对用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时系统,可让用户不必了解内部结构就可以使用。
2.扩展性
分布式系统的最大特点就是可扩展性,他可以根据需求的增加而扩展,可以通过横向扩展使集群的整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升。
3.可靠性
分布式系统不允许单点失效的问题存在,它的基本思想是:如果一台服务器坏了,其他服务器接替它的工作,具有持续服务的特性。
4.高性能
高性能是人们设计分布式系统的一个初衷,如果建立了一个透明,灵活,可靠的分布式系统,但他运行起来像蜗牛一样慢,那这个系统就是失败的。
7.Redis的常用功能
1.高速读写:Redis在运行时,将数据放在内存当中,利用内存的高性能的特性提高自己的服务性能。
2.数据类型丰富:Redis具有丰富的数据类型,可以适用于各种场景。
3.支持持久化:因为Redis的数据是放在内存当中的,当Redis关机或者内存失效时,数据随即丢失,不可找回,为了避免Redis重启时发生类似于雪崩事件,所以Redis官方增加了一个数据持久化的功能。
4.多种内存分配及回收策略:Redis可以通过 maxmemory 参数来限制最大可用内存,主要为了避免Redis内存超过操作系统内存,从而导致服务器响应变慢甚至死机的情况。而回收策略主要是删除过期的key以及内存达到 maxmemory 后的淘汰机制。
5.支持事物:Redis也支持类似于MySQL数据库那样的事务。
6.消息队列、消息订阅: Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性能的优先队列。同时在更高层面上,Redis还支持"发布/订阅"的消息模式,可以基于此构建一个聊天系统。
7.支持高可用:Redis支持两种高可用集群方式。
四、Redis使用场景
1.缓存
放在数据库前面
2.会话保持
登录cookie、session
折扣券,代金券
3.排行榜
4.计数器
论坛帖子点赞点踩
5.社交软件
QQ共同好友,微博共同爱好
6.消息队列
结合ELK做日志收集
五、Redis-6.0.9搭建
1.下载软件包
下载Redis可以去Redis官网获取源码包,下载到服务器上编译。Redis官网(https://redis.io/)。进入下载页面(https://redis.io/download),从左到右分别是最新版、最新稳定版和容器版,我们可以下载最新稳定版的源码包(https://download.redis.io/releases/redis-6.0.9.tar.gz)。
[root@db01 ~]# rz redis-6.0.9.tar.gz
或者
[root@redis01 ~]# wget https://download.redis.io/releases/redis-6.0.9.tar.gz
2.安装依赖
[root@redis01 ~]# yum install -y cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make tcl
3 更新gcc版本
centos7 默认的 gcc 版本小于 5.3 无法编译,需要先安装gcc新版才能编译
[root@redis01 ~]# yum -y install centos-release-scl
[root@redis01 ~]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
#临时生效,退出 shell 或重启会恢复原 gcc 版本
[root@redis01 ~]# scl enable devtoolset-9 bash
#永久生效
[root@redis01 ~]# echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
4 .编译安装
[root@redis01 ~]# tar -zxvf redis-6.0.9.tar.gz
[root@redis01 ~]# mv redis-6.0.9 /usr/local/
[root@redis01 ~]# cd /usr/local/redis-6.0.9
[root@redis01 /usr/local/redis-6.0.9]# make &&make install #默认安装
或者
[root@redis01 ~]# make PREFIX=/usr/local/redis-6.0.9 install #指定目录安装
5.做软连接
[root@redis01 /usr/local/redis-6.0.9]# cd ..
[root@redis01 /usr/local]# ln -s /usr/local/redis-6.0.9 /usr/local/redis
6.修改redis.conf
[root@redis01 /usr/local]# cd redis
[root@redis01 /usr/local/redis]# mkdir /etc/redis/
[root@redis01 /usr/local/redis]# cp redis.conf /etc/redis/
[root@redis01 ~/redis-6.0.9]# vim /etc/redis/redis.conf
bind 127.0.0.1 #根据情况是否需要远程访问去掉注释
requirepass 123456 #修改密码
protected-mode no # 关闭protected-mode模式,此时外部网络可以直接访问
daemonize no #以守护进程模式启动,指定目录安装时改为yes
7. 配置system启动
[root@redis01 /usr/local/redis]# vim /etc/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target
[Service]
#Type=forking
ExecStart=/usr/local/redis-6.0.9/src/redis-server /etc/redis/redis.conf
ExecReload=/usr/local/redis-6.0.9/src/redis-server -s reload
ExecStop=/usr/local/redis-6.0.9/src/redis-server -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
注意Type=forking不注释掉 服务无法启动
使服务自动运行
[root@redis01 ~]# systemctl daemon-reload
[root@redis01 ~]# systemctl enable redis
启动服务
[root@redis01 ~]# systemctl restart redis
[root@redis01 ~]# systemctl status redis
验证服务
[root@redis01 /usr/local/redis]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 12768/redis-server
8.连接redis
#连接
[root@redis01 /usr/local/redis]# redis-cli -p 6379
127.0.0.1:6379> auth 123456 #验证密码
127.0.0.1:6379>
9.关闭redis
[root@redis01 /usr/local/redis]# redis-cli shutdown
或
[root@db01 redis]# redis-cli
127.0.0.1:6379> shutdown
六、redis配置文件
1.配置
#默认的配置文件
[root@redis01 redis]# pwd
/usr/local/redis
[root@redis01 redis]# ll
-rw-rw-r-- 1 root root 46695 Jun 13 2018 redis.conf
#创建reids配置文件目录
[root@redis01 redis]# mkdir /service/redis/6379 -p
#编写配置文件
[root@redis01 redis]# vim /service/redis/6379/redis.conf
bind 172.16.1.51 127.0.0.1 #监听地址
port 6379 #端口
daemonize no #后台启动
pidfile /service/redis/6379/redis_6379.pid #指定pid文件
loglevel notice #指定日志级别
logfile /service/redis/6379/redis_6379.log #指定日志文件
2.指定配置文件启动
[root@redis01 redis]# redis-server /service/redis/6379/redis.conf
七、Redis介绍相关知识
1.端口6379由来
1、Alessia Merz 女演员中的"Merz"在九键键盘中的字母分别对应数字6379.
2.Redis库基本介绍
1、默认16个数据库,类似数组下标从0开始,初始默认使用0号库
2、使用命令 select <dbid>来切换数据库。如: select 8
3、统一密码管理,所有库同样密码。
4、dbsize 查看当前数据库的key的数量
5、flushdb 清空当前库
6、flushall 通杀全部库
3.其他介绍
Redis是单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)
串行 vs 多线程+锁(memcached) vs 单线程+多路IO复用(Redis)
(与Memcache三点不同: 支持多数据类型,支持持久化,单线程+多路IO复用)