分布式数据库的CAP原理和Redis详解

关系型数据库遵循ACID事务特性:
事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:
关系型数据库遵循ACID特性
1、A (Atomicity) 原子性
原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元(要么事务都完成,要么都失败,但是redis则是部分成,比如有一条挂了,不会影响其它事务结果)。

2、C (Consistency) 一致性
一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

3、I (Isolation) 独立性
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的

4、D (Durability) 持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

CAP理论是设计分布式web系统的一个很关键的定律,其主要内容是(非官方定义):
C:Consistency(强一致性):如上
A:Availability(可用性):可以理解为是否可获取数据,以及获取数据的速度;
P:Partition tolerance(分区容错性):指的是系统中的数据分布性的大小对系统的正确性,性能的影响(一定程度上就是可扩展性,大多数服务器并不是在同一个地方)
CA,这就是传统上的关系型数据库(RMDB).
CP,主要是一些Key-value数据库,典型代表为redis,MongDb,Hbase(比如新浪微博一条微博,是过几秒才能看到,再比如携程订票某某成功购得一张票也并不是实时的,也就是可用性较低)。
AP,主要是一些面向文档的适用于分布式系统的数据库,如SimpleDB,CouldDB ( 大多数网站架构的选择)
注意:分布式架构的时候必须做出取舍,一致性和可用性之间取一个平衡,多余大多数web应用,其实并不需要强一致性。因此牺牲C换取P,这是目前分布式数据库产品的方向,弱一致性。

BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE其实是下面三个术语的缩写:
基本可用(Basically Available)
软状态(Soft state)
最终一致(Eventually consistent)
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。为什么这么说呢,缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法
分布式系统

分布式系统(distributed system)
由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。分布式系统可以应用在在不同的平台上如:Pc、工作站、局域网和广域网上等。

简单来讲:
1分布式:不同的多台服务器上面部署不同的服务模块(工程),他们之间通过Rpc/Rmi之间通信和调用,对外提供服务和组内协作。
2集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。

负载均衡:假设有很多请求发到服务器,假设只有一个服务器那它肯定忙不过来,那我在加一台服务器,比如关于奇数的到A服务器去偶数的到B服务器去,这样岂不是更好吗?

Redis:REmote DIctionary Server(远程字典服务器):
是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行
并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
Redis 与其他 key - value 缓存产品有以下三个特点:

	1. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
	2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
	3. Redis支持数据的备份,即master-slave模式的数据备份

直白点说:

	Redis支持数据的备份,即master-slave模式的数据备份
	取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
	模拟类似于HttpSession这种需要设定过期时间的功能
	发布、订阅消息系统(充当消息中间件),定时器、计数器

Redis的安装步骤:
1.下载对应的压缩包redis-3.0.4.tar.gz 我这里以它为例。通过xshell工具上传到opt目录,先cd opt目录,在用解压命令tar -zxvf redis-3.0.4.tar.gz到opt目录中
2.在redis-3.0.4目录下执行make命令,如果命令执行错误,则是缺少gcc编译工具(编译C程序的)
有外网:yum install gcc-c++,安装会有些时间。
在这里插入图片描述
这里不执行,接下来执行make install命令(默认安装在/usr/local/bin/下面)
3. 将/opt/redis.3.0.4目录下面的redis.conf配置文件复制到/myredis绝对路径下(这个文件夹是我自己创建的),使用vi编辑打开
34 ################################ GENERAL ####################################
35 # By default Redis does not run as a daemon. Use ‘yes’ if you need it.
36 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
37 daemonize yes 这里将no改成yes(默认是no也就是不是以守护线程方式裕兴)
/usr/local/bin目录的结构:
-rw-r–r-- 1 root root 400082 Oct 23 12:50 dump.rdb
-rwxr-xr-x 1 root root 2076240 Oct 22 22:30 redis-benchmark(单元测试,存取操作)
-rwxr-xr-x 1 root root 25080 Oct 22 22:30 redis-check-aof(修复有问题的AOF文件,rdb和aof后面讲)
-rwxr-xr-x 1 root root 55912 Oct 22 22:30 redis-check-dump(修复有问题的dump.rdb文件)
-rwxr-xr-x 1 root root 2200256 Oct 22 22:30 redis-cli(客户端,操作入口,远程连接)
lrwxrwxrwx 1 root root 12 Oct 22 22:30 redis-sentinel -> redis-server(Redis服务器启动命令)
-rwxr-xr-x 1 root root 4351064 Oct 22 22:30 redis-server
运行存取操作结果(我是腾讯云的1G1核)
====== SET ======
100000 requests completed in 1.89 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.30% <= 1 milliseconds
99.85% <= 2 milliseconds
99.95% <= 9 milliseconds
100.00% <= 9 milliseconds
52882.07 requests per second(每秒5万次请求,官方8万,挡在mysql前面)
4. 切换到/usr/local/bin目录下启动redis-server,因为已经复制了一份经过更改后的配置文件,即执行命令
启动redis-server 启动redis-server /myredis/redis.conf,接下来在执行命令redis-cli -p 6379;(端口,这个命令是因为有该配置文件才生效),远程连接
5. 为了判断服务是否启动成功,执行命令ping 响应pong表明成功。
6. 这时候已经表明redis已经安装成功,可以存储一个数据set a hello; get a;拿到来了值表示ok。退出。但这里需要注意的是:
@redis默认是有16个库,当前我们是处于0库,也就是第一个库,为证明我们可切换select 1,(语法select 角标0-15)再去做取操作get a;结果是nil;@redis默认是有16个库,当前我们是处于0库,也就是第一个库,为证明我们可切换select 1,(语法select 角标0-15)再去做取操作get a;结果是nil;
@DBSIZE 命令查看该库的key的个数,keys *:查看key的值。
WRONGTYPE Operation against a key holding the wrong kind of value报错:程序在多处使用了同一个key,并且是以不同的类型,有的以key-value类型,有的以key-map,有的以key-object,必须删除对应key或者存储相同的数据类型达到覆盖的目的。
@flushdb:清空当前库数据 Flushall:通杀全部库
@统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上
7. redis-cli -p 6379 shutdown:多实例关闭,指定端口关闭
quit:退出
grep -ef | grep redis:grep管道作为输出的一端用于别人的结果 这里指的是找出redis的进程显示出来 ,管道作为输出的一端用于别人的结果 这里指的是找出redis的进程显示出来

Redis常用的五大数据类型:

String:string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。string类型是Redis最基本的数据类型,一个redis中字符串value最多可以512M
Hash(类似java中的hashMap):Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>
List(列表):Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。它的底层			实际是个链表。
Set(集合):Redis的Set是string类型的无序集合。它是通过HashTable实现实现的。
zset(有序集合):Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

猜你喜欢

转载自blog.csdn.net/qq_40826106/article/details/83247081