NoSQL = Not Only SQL(不仅仅是 SQL) ,也解释为 non-relational(非关系型数据库)。在NoSQL 数据库中数据之间是无联系的,无关系的。数据的结构是松散的,可变的。
关系型数据库的瓶颈:
1)无法应对每秒上万次的读写请求,无法处理大量集中的高并发操作。关系型数据的是IO 密集的应用。硬盘 IO 也变为性能瓶颈
2)无法简单地通过增加硬件、服务节点来提高系统性能。数据整个存储在一个数据库中的。多个服务器没有很好的解决办法,来复制这些数据。
3)关系型数据库大多是收费的,对硬件的要求较高。软件和硬件的成本花费比重较大。
(1) 大数据量,高性能
NoSQL 数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。关系型数据库(例如 MySQL)使用查询缓存。这种查询缓存在更新数据后,缓存就是失效了。在频繁的数据读写交互应用中。缓存的性能不高。NoSQL 的缓存性能要高的多。
(2) 灵活的数据模型
NoSQL 无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。尤其在快速变化的市场环境中,用户的需求总是在不断变化的。
(3) 高可用
NoSQL 在不太影响性能的情况,就可以方便的实现高可用的架构。NoSQL 能很好的解决关系型数据库扩展性差的问题。弥补了关系数据(比如 MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。MySQL 和 NoSQL 都有各自的特点和使用的应用场景,两者结合使用。让关系数据库关注在关系上,NoSQL 关注在存储上。
(4) 低成本
这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的 License 成本
(1) 不支持标准的 SQL,没有公认的 NoSQL 标准
(2) 没有关系型数据库的约束,大多数也没有索引的概念
(3) 没有事务,不能依靠事务实现 ACID.
(4) 没有丰富的数据类型(数值,日期,字符,二进制,大文本等)
Redis 是当今非常流行的基于 KV 结构的作为 Cache 使用的 NoSQL 数据库
Remote Dictionary Server(Redis)是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的 Key-Value 数据库. Key 字符类型,其值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型,每种数据类型有自己的专属命令。所以它通常也被称为数据结构服务器。
官网:https://redis.io/
中文:http://www.redis.cn/
1、下载redis-5.0.8.tar.gz
并在linux上解压到/usr/local/
目录下。
2、安装gcc编译器,执行命令:yum -y install gcc
3、编译redis源文件,在安装目录/usr/local/redis-5.0.8
下执行:make
。成功后可选择执行make install
,表示在任何路径下都可以执行redis。
4、启动redis。
首先切换到/usr/local/redis-5.0.8/src
(1)前台启动:./redis-server ../redis-cli
(2)后台启动:./redis-server ../redis-cli &
5、关闭reids。
(1)使用客户端关闭。
切换到/redis-5.0.8/src
目录下,执行./redis-cli shutdown
.
推荐使用这种方式, redis 先完成数据操作,然后再关闭。
(2)强制关闭 kill pid或者kill -9 pid
这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
先使用 ps -ef | grep redis
查出进程号,再使用 kill pid
。
Redis 客户端是一个程序,通过网络连接到 Redis 服务器,在客户端软件中使用 Redis 可以识别的命令,向 Redis 服务器发送命令,告诉 Redis 想要做什么。Redis 把处理结果显示在客户端界面上。通过 Redis 客户端和 Redis 服务器交互。
Redis 客户端发送命令,同时显示 Redis 服务器的处理结果在。
1、直接连redis(默认ip 127.0.0.1,端口号6379):./redis-cli
2、指定ip和端口号连接redis:./redis-cli -h 127.0.0.1 -p 6379
1、下载安装Redis Desktop Manager。官网地址:https://redisdesktop.com/
2、使用客户端连接Linux的redis。
在这之前需要修改redis服务器的配置信息。redis服务器有安全保护措施,默认只有本机(安装redis的那台机器)可以访问。配置信息放在redis.conf中。修改此文件的两个设置。
(1)bind ip
将此行注释
(2)protected-mode yes
保护模式改为 no
使用vim命令修改redis.conf文件,修改文件前备份此文件。cp redis.conf bak_redis.conf
3、使用redis.conf启动redis
修改配置文件后,需要使用配置文件重新启动 Reids,默认不加载配置文件。
只要修改了redis.conf想让修改结果生效,必须使用配置文件启动redis。
执行命令:./redis-server ../redis.conf &
4、关闭linux防火墙
查看防火墙状态:systemctl status firewalld
关闭防火墙:systemctl stop firewalld
5、配置RDM,连接redis
1、 Jedis
redis 的 Java 编程客户端,Redis 官方首选推荐使用 Jedis,jedis 是一个很小但很健全的redis 的 java 客户端。通过 Jedis 可以像使用 Redis 命令行一样使用 Redis。
⚫ jedis 完全兼容 redis 2.8.x and 3.x.x
⚫ Jedis 源码:https://github.com/xetorthio/jedis
⚫ api 文档:http://xetorthio.github.io/jedis/
2.、redis 的其他编程语言客户端:
C 、C++ 、C# 、Erlang、Lua 、Objective-C、Perl 、PHP 、Python 、Ruby、Scala 、Go等 40 多种语言都有连接 redis 的编程客户端
Redis基本操作命令详解:
https://blog.csdn.net/Luna_A/article/details/107292994
事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。
Redis 中的事务(transaction)是一组命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何其他操作打断。
1、multi
语法: multi
作用:标记一个事务的开始。事务内的多条命令会按照先后顺序被放进一个队列当中。
返回值:总是返回 ok
2、exec
语法:exec
作用:执行所有事务块内的命令
返回值:事务内的所有执行语句内容,事务被打断,返回 nil
3、discard
语法:discard
作用:取消事务,放弃执行事务块内的所有命令
返回值:总是返回 ok
4、watch
语法:watch key [key …]
作用:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,
那么事务将被打断。
返回值:总是返回 ok
5、unwatch
语法:unwatch
作用:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令
或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
返回值:总是返回 ok
事务的执行步骤:首先开启事务,其次向事务队列中加入命令,最后执行事务提交
例 1:事务的执行:
1)multi:用 multi 命令告诉 Redis,接下来要执行的命令你先不要执行,而是把它们暂时存起来(开启事务)
2)sadd works john 第一条命令进入等待队列(命令入队)
3)sadd works rose 第二条命令进入等待队列(命令入队)
4)exce 告知 redis 执行前面发送的两条命令(提交事务)
执行事务步骤:
1)MULTI 正常命令
2)SET key value 正常命令
3)INCR 命令语法错误
4)EXEC 无法执行事务,那么第一条正确的命令也不会执行,所以 key 的值不会设置成功
结论:事务执行 exec 之前,入队命令错误,事务终止,取消,不执行。
执行步骤:
1)MULTI 正常命令
2)SET username zhangsan 正常命令
3)lpop username 正常命令,语法没有错误,执行命令时才会有错误。
4)EXEC 正常执行,发现错误可以在事务提交前放弃事务,执行 discard.
结论:在 exec 执行后的所产生的错误,即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。
Redis 在事务失败时不进行回滚,而是继续执行余下的命令。
Redis 这种设计原则是:Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的键上面,失败的命令并不是 Redis 导致,而是由编程错误造成的,这样错误应该在开发的过程中被发现,生产环境中不应出现语法的错误。就是在程序的运行环境中不应该出现语法的错误。而 Redis 能够保证正确的命令一定会被执行。再者不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
执行步骤:
1、 Redis 的 WATCH 机制
WATCH 机制原理:
WATCH 机制:使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况,如果有key 的 value 值在事务 EXEC 执行之前被修改了,整个事务被取消。EXEC 返回提示信息,表示事务已经失败。
WATCH 机制使的事务 EXEC 变的有条件,事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行
大多数情况下,不同的客户端会访问不同的键,相互同时竞争同一 key 的情况一般都很少,watch 能很好解决数据冲突的问题。
2、何时取消 key 的监视(WATCH)?
①WATCH 命令可以被调用多次。对键的监视从 WATCH 执行之后开始生效,直到调用 EXEC 为 止。不管事务是否成功执行,对所有键的监视都会被取消。
②当客户端断开连接时,该客户端对键的监视也会被取消。
③UNWATCH 命令可以手动取消对所有键的监视
3、 WATCH 的事例
执行步骤:
首先启动 redis-server , 在开启两个客户端连接。分别叫 A 客户端和 B 客户端。
启动 Redis 服务器
客户端A:
客户端B:
客户端A:
持久化可以理解为存储,就是将数据存储到一个不会丢失的地方,如果把数据放在内存中,电脑关闭或重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘就算是一种持久化。
Redis 的数据存储在内存中,内存是瞬时的,如果 linux 宕机或重启,又或者 Redis 崩溃或重启,所有的内存数据都会丢失,为解决这个问题,Redis 提供两种机制对数据进行持久化存储,便于发生故障后能迅速恢复数据。
1、 什么是 RDB 方式?
Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存。
RDB 保存了在某个时间点的数据集(全部数据)。存储在一个二进制文件中,只有一个文件。默认是 dump.rdb。RDB 技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据是在单独的进程中写文件,不影响 Redis 的正常使用。RDB 恢复数据时比其他 AOF 速度快。
2、 如何实现?
RDB 方式的数据持久化,仅需在 redis.conf
文件中配置即可,默认配置是启用的。
在配置文件 redis.conf 中搜索 SNAPSHOTTING,查找在注释开始和结束之间的关于 RDB的配置说明。配 SNAPSHOTTING 置地方有三处。
①:配置执行 RDB 生成快照文件的时间策略。
对 Redis 进行设置,让它在“ N 秒内数据集至少有 M 个 key 改动”这一条件被满足时,自动保存一次数据集。
配置格式:save
save 900 1
save 300 10
save 60 10000
②:dbfilename:设置 RDB 的文件名,默认文件名为 dump.rdb
③:dir:指定 RDB 文件的存储位置,默认是 ./ 当前目录
3、总结
优点:由于存储的是数据快照文件,恢复数据很方便,也比较快
缺点:
1)会丢失最后一次快照以后更改的数据。如果你的应用能容忍一定数据的丢失,那么使用 rdb 是不错的选择;如果你不能容忍一定数据的丢失,使用 rdb 就不是一个很好的选择。
2)由于需要经常操作磁盘,RDB 会分出一个子进程。如果你的 redis 数据库很大的话,子进程占用比较多的时间,并且可能会影响 Redis 暂停服务一段时间(millisecond 级别),如果你的数据库超级大并且你的服务器 CPU 比较弱,有可能是会达到一秒。
1、什么是 AOF 方式
Append-only File(AOF),Redis 每次接收到一条改变数据的命令时,它将把该命令写到一个 AOF 文件中(只记录写操作,读操作不记录),当 Redis 重启时,它通过执行 AOF 文件中所有的命令来恢复数据。
2、如何实现
AOF 方式的数据持久化,仅需在 redis.conf
文件中配置即可
配置项:
①:appendonly:默认是 no,改成 yes 即开启了 aof 持久化
②:appendfilename:指定 AOF 文件名,默认文件名为 appendonly.aof
③:dir :指定 RDB 和 AOF 文件存放的目录,默认是 ./
④:appendfsync:配置向 aof 文件写命令数据的策略:
no:不主动进行同步操作,而是完全交由操作系统来做(即每 30 秒一次),比较快但不
是很安全。
always:每次执行写入都会执行同步,慢一些但是比较安全。
everysec:每秒执行一次同步操作,比较平衡,介于速度和安全之间。这是默认项。
⑤:auto-aof-rewrite-min-size:允许重写的最小 AOF 文件大小,默认是 64M 。当 aof 文件大
于 64M 时,开始整理 aof 文件,去掉无用的操作命令。缩小 aop 文件。
3、总结
1)append-only 文件是另一个可以提供完全数据保障的方案;
2)AOF 文件会在操作过程中变得越来越大。比如,如果你做一百次加法计算,最后你只会
在数据库里面得到最终的数值,但是在你的 AOF 里面会存在 100 次记录,其中 99 条记录
对最终的结果是无用的;但 Redis 支持在不影响服务的前提下在后台重构 AOF 文件,让文
件得以整理变小
3)可以同时使用这两种方式,redis 默认优先加载 aof 文件(aof 数据最完整);
通过持久化功能,Redis 保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。
为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。
这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,那该怎么实现呢?Redis 的主从复制。
Redis 提供了复制(replication)功能来自动实现多台 redis 服务器的数据同步(每天 19点新闻联播,基本从 cctv1-8,各大卫视都会播放)
我们可以通过部署多台 redis,并在配置文件中指定这几台 redis 之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,这种模式叫做主从复制,即master/slave,并且 redis 默认 master 用于写,slave 用于读,向 slave 写数据会导致错误
修改配置文件,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系
实现步骤:
模拟多 Reids 服务器,在一台已经安装 Redis 的机器上,运行多个 Redis 应用模拟多 个 Reids 服务器。一个 Master,两个 Slave
1、新建三个redis配置文件
如果 Redis 启动,先停止。
作为 Master 的 Redis 端口是 6380
作为 Slaver 的 Redis 端口分别是 6382 , 6384
从原有的 redis.conf 拷贝三份,分别命名为 redis6380.conf, redis6382.conf , redis6384.conf
2、编辑master配置文件
编辑 Master 的配置文件 redis6380.conf : 在空文件加入如下内容
include /usr/local/redis-4.0.13/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
配置项说明:
include :包含原来的配置文件内容。/usr/local/redis-4.0.13/redis.conf 按照自己的目录设置。
daemonize:yes 后台启动应用,相当于 ./redis-server & 的作用。
port : 自定义的端口号
pidfile : 自定义的文件,表示当前程序的 pid ,进程 id。
logfile:日志文件名
dbfilename:持久化的 rdb 文件名
3、编辑slave配置文件
编辑 Slave 的配置文件 redis6382.conf 和 redis6384.conf: 在空文件加入如下内容
①:redis6382.conf:
include /usr/local/redis-4.0.13/redis.conf
daemonize yes
port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof 127.0.0.1 6380
配置项说明:
slaveof :表示当前 Redis 是谁的从。当前是 127.0.0.0 端口 6380 这个 Master 的从。
②:redis6384.conf:
include /usr/local/ redis-4.0.13/redis.conf
daemonize yes
port 6384
pidfile /var/run/redis_6384.pid
logfile 6384.log
dbfilename dump6384.rdb
slaveof 127.0.0.1 6380
4、启动服务器 master/slave都启动
5、查看配置后的服务信息
命令:
①: Redis 客户端使用指定端口连接 Redis 服务器
./redis-cli -p 端口
②:查看服务器信息
info replication
登录到 Master:6380
查看当前服务信息
在客户端的 Redis 内执行命令 info replication
Master 服务的查看结果:
在新的 Xshell 窗口分别登录到 6382 ,6384 查看信息
6. 向 Master 写入数据
在 6380 执行 flushall 清除数据,避免干扰的测试数据。生产环境避免使用。
7. 在从 Slave 读数据
6382,6384 都可以读主 Master 的数据,不能写
Slave 写数据失败
当 Master 服务出现故障,需手动将 slave 中的一个提升为 master,剩下的 slave 挂至新的master 上(冷处理:机器挂掉了,再处理)
命令:
①:slaveof no one,将一台 slave 服务器提升为 Master (提升某 slave 为 master)
②:slaveof 127.0.0.1 6382 (将 slave 挂至新的 master 上)
执行步骤:
1、将 Master:6380 停止(模拟挂掉)
2、选择一个 Slave 升到 Master,其它的 Slave 挂到新提升的 Master
3、将其他 Slave 挂到新的 Master
在 Slave 6384 上执行
现在的主从(Master/Slave)关系:Master 是 6382, Slave 是 6384
查看 6382:
4、 原来的服务器重新添加到主从结构中
6380 的服务器修改后,重新工作,需要把它添加到现有的 Master/Slave 中
先启动 6380 的 Redis 服务
连接到 6380 端口
当前服务挂到 Master 上
5、查看新的 Master 信息
现在的 Master/Slaver 关系是:
Master: 6382
Slave: 6380
6384
进入客户端需指定端口:./redis-cli -p 6380
不配置启动默认都是主 master
info replication 查看 redis 服务器所处角色
1、一个 master 可以有多个 slave
2、slave 下线,读请求的处理性能下降
3、master 下线,写请求无法执行
4、当 master 发生故障,需手动将其中一台 slave 使用 slaveof no one 命令提升为 master,其
它 slave 执行 slaveof 命令指向这个新的 master,从新的 master 处同步数据
5、主从复制模式的故障转移需要手动操作,要实现自动化处理,这就需要 Sentinel 哨兵,
实现故障自动转移
Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它来监控多个 Redis 服务实例的运行情况。Redis Sentinel 是一个运行在特殊模式下的 Redis 服务器。Redis Sentinel 是在多个Sentinel 进程环境下互相协作工作的。
Sentinel 系统有三个主要任务:
⚫ 监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作。
⚫ 提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序。
⚫ 自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会开始进行故障迁移操作。将
一个从服务器升级新的主服务器。让其他从服务器挂到新的主服务器。同时向客户端提
供新的主服务器地址。
1、sentinel文件
复制三份sentinel文件。
sentinel默认端口号是26379,复制后的三个文件指定端口号为
2、修改sentinel文件
(1)修改port
三个文件的port改为文件名后面的数字。
(2)修改监控的master地址
3、启动主从redis
查看master的配置信息
4、启动哨兵
分三个窗口,在/usr/local/redis-5.0.8/src
下执行三条命令
第一条: ./redis-sentinel ../sentinel26380.conf
第二条: ./redis-sentinel ../sentinel26382.conf
第三条: ./redis-sentinel ../sentinel26384.conf
成功后如图
5、模拟主机down
6、sentinel发挥作用
在 Master 执行 shutdown 后,稍微等一会 Sentinel 要进行投票计算,从可用的 Slave 选
举新的 Master。
查看 Sentinel 日志,三个 Sentinel 窗口的日志是一样的