C:Consistency(强一致性)
A:Availability(高可用性)
P:Partion tolerance(分区容错性)
CAP理论图的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
CAP的理论就是说在分布式存储系统中,最多只能实现上面的两点。
而由于在分布式的项目下,不同的服务器之间的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须要实现的。
所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这一点。
因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:
CA-单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。例. 传统Oracle数据库
CP-满足一致性,分区容忍性的系统,通常性能不是特别高。例. Redis、Mongodb
AP-满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。例.大多数网站架构的选择
BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE其实是下面三个术语的缩写:
基本可用(Basically Available)
软状态(Soft state)
最终一致(Eventually consistent)
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法。
注意:严谨的来说单机 Redis 属于 cp 模型,Redis-cluster 属于 ap 模型,利用BASE的最终一致性来保证数据的一致性。
Redis:REmote DIctionary Server(远程字典服务器)
是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,被称为数据结构数据库。
Redis与其他key-value缓存产品有一下三个特点:
注意:Linux下安装redis报错有可能是gcc版本不兼容,需要升级比如gcc 4.8.5 安装redis6.0以上版本会报错
升级9.0b版本gcc
yum -y install centos-release-scl && yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils && scl enable devtoolset-9 bash
keys * 查看当前库的所有key
exists key的名字,判断某个key是否存在
move key db -->当前库就没有了,被移出了
expire key 秒钟:为给定的key设置过期时间
ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key 查看你的key是什么类型
string是redis最基本的类型,可以理解为Memcached一样的类型,一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据。比如ipg图片或者序列化的对象。
string类型是Redis最基本的数据结构,一个redis中字符串value最多可以是512M。
常用关键字:
set/get/del/append/strlen 增/查/删/追加/获取字符串长度
Incr/decr/incrby/decrby 一定要是数字才能进行加减
getrange/setrange 设置指定区间范围值
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget 同时操作多条数据
msetnx 操作多条数据中有一条存在则失败
getset(先get在set) 查看并覆盖
Redis hash是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
类似java里面的Map
KV模式不变,但V是一个键值对
常用关键字:
hset/hget/hmset/hgetall/hdel
hset user id 1/hget user id 新增/获取元素
hmset user name li age 10/hgetall user id name age 新增/获取多个元素
hgetall user 获取所有key和value
hdel user name 删除key
hlen user获取user中key个数
hexists user id 判断user中id是否存在,有是1,无则0
hkeys/hvals user 获取user所有key/value
hincrby/hincrbyfloat user age 2/0.5 自定义age+2/+0.5,key必须为数字,float结尾的是可以用小数来加
hsetnx user age 11 判断user中是否存在age,存在就添加
Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层是一个链表。
它是一个字符链表,left,right都可以插入添加。
如果键不存在,创建新的链表。
如果键已经存在,新增内容。
如果值全移除,对应的键也就消失了。
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
常用关键字:
lpush/rpush/lrange
lpop/rpop list1 左/右取出一个元素
lindex list 0 按照索引下表获得元素(从上到下)
llen list1 获取集合长度
lrem list1 2 3 删2个3
ltrim list1 0 3 开始0结束3,截取指定范围的值后再赋值给list1
rpoplpush list1 list2 取list1右边一个(最后一个)值,新增入list2左边(第一个)
lset list1 1 x 设置list1集合位置1上的值为x
linsert list1 before/after 值1 值2 在list1中,把值2插入值1之前/之后
Redis的Set是string类型的无序集合,无重复值。它是通过HashTable实现的。
常用关键字:
sadd/smembers/sismember
sadd set1 v1 v2 v3 新增,自动去掉重复值
smembers set1 打印元素
sismember set1 v1 查看在set1是否有v1值,有为1,没有为0
scard set1 获取集合里面的元素个数
srem set1 v1 删除set1集合中v1元素
srandmember set1 3从set1中随机读取3个数
spop set1 随机取出值
smove set1 set2 v1 将set1 里的一值赋给set2
sdiff/sinter/sunion set1 set2 差集(找出第一个集合中不存在后面任意集合中的元素)/交集/并集
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大排序。zset的成员是唯一的,但分数(score)却可以重复。
和set的区别:在set基础上加上一个score值,之前set是k1 v1 v2 v3,现在zset是k1 score v1 score v2
常用关键字:
zadd zset1 1 v1 2 v2 新增
zrange/zrevrange zset1 0 -1 正序/逆序获取全部元素
zrangebyscore key 开始score 结束score
zrangebyscore zset1 0 -1 withscores 获取zset1的值和score
zrangebyscore zset1 0 (3 ( 不包含,获取zset1中score从0~3的值,不包含3
zrangebyscore zset1 0 3 limit 1 2 作用是返回限制 limit开始下标1 2步
zrem zset1 v1 某score下对应的value值,作用是删除元素
zcard/zcount 区间
zcard zset1 获取元素个数
zcount zset1 0 2 获取score中元素个数
zrank/zrevrank zet1 v1 正序/逆序获得v1下标值
zscore zet1 v1 获得值对应score
zrevrangebyscore key 结束score 开始score 同zrangebyscore ,不过范围值反过来写,逆序输出值