NoSQL特点
- 没有声明性查询语言
- 没有预定义的模式
- 键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
CAP定理(CAP theorem)
在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
NoSQL分类
Redis简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave(主从同步)模式的数据备份。
Redis优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis使用
在linux环境中启动
Redis的安装目录在 /usr/local/bin 中
查看默认安装目录:
redis-server :Redis服务器启动命令
redis-cli :Redis命令行客户端,操作入口
redis-benchemark :Redis性能测试工具
redis-check-aof :AOF文件修复工具
redis-check-dump :RDB文件检测工具,修复有问题的dump.rdb文件
redis-sentinel :Redis集群使用
redis.conf : linux 版本中的redis配置文件
后台启动Redis
使用配置文件启动
启动命令:redis-server redis.conf
关闭命令:redis-cli shutdown
端口号:6379
Redis 是单线程+多路IO复用技术
详细介绍:https://www.csdn.net/tags/Ntjakg1sMDIwNC1ibG9n.html
keys命令:
- del key key 存在时删除key
- exists key 检查key是否存在
- expire key seconds(秒) 为key设置过期时间,以秒计算
- expire key timestamp(毫秒) 设置key的过期时间以毫秒计算
- persist key 移除key的过期时间,key将持久保持
- keys * 查询所有的键名
- pttl key 以毫秒为单位返回key的剩余过期时间
- ttl key -1表示永不过期,-2表示已过期
- randomkey 从当前数据库中随机返回一个key
- rename key newkey 修改key的名称
- renamenx key newkey 当newkey不存在时,将key改名为newkey
- move key db 将当前数据库的key移动到给定的数据库db当中
-
字符串命令:
set key value 设置指定key的value
- get key 获取指定key的value
- getset key value 为key设置新value,并返回key的旧value
- mget key1 key2 key3….. 获取一个或多个key的value
- setnx key value key不存在时设置key的value
- strlen key 返回key所存储的字符串的长度
- mset key1 value1 key2 value2 ….同时设置一个或多个key-value对
- incr key 将key中存储的数字值增加1
- decr key 将key中存储的数字值减一
- incrby key increment 将key所存储的值加上给定的增量值increment
append key value 如果key存储的值是一个字符串,append命令将指定的value追加到key原来bvalue的末尾。
hash命令:
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
hset key field value [field value] 存放指定key的field和value值
- hdel key filed1 field2 删除一个或多个哈希表字段
- hexists key field 查看哈希表key中,指定的字段是否存在
- hget key field 获取存储在哈希表中指定字段的值
- hgetall key 获取在哈希表中指定key的所有字段和值
- hincrby key field increment 为哈希表key中指定的字段的整数值加上增量increment
- hkeys key 获取所有哈希表中的字段
- hlen key 获取哈希表中字段的数量
- hmget key field1 field2 获取所有给定字段的值
- hmset key field1 value1 field2 value3 ……. 同时将多个field-value(域-值)对设置到哈希表key中
-
list(列表):
llen key 获取列表长度
- lpop key 移出并获取列表的第一个元素
- lpush key value1 value2… 将一个或多个值插入到列表的头部
- lpushx key value 将一个值插入到已存在的列表的头部
- lrange key 0 -1 获取指定范围内的元素
- lrem key count value 移除列表中的元素
- lset key index value 通过索引(下标)设置列表元素的值
- ltrim key 0 6 对一个列表进行修剪 让列表只保留指定区间内的元素,不在指定区间的元素都将被删除
- rpop key 移除列表的最后一个一个元素,返回值为移除的元素
- rpoplpush 列表 列表 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
- Rpush key value1 value2 在列表中添加一个或多个值
-
set集合:
Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
sadd key member1…. 向集合添加一个或多个成员
- scard key 获取集合的成员数
- sdlff key1 key2 返回第一个集合和第二个集合(其他集合)之间的差异
- sinter key1 key2 返回给定所有集合的交集
- sismember key member 判断member元素是否是集合key的成员
- smembers key 返回集合中的所有成员
- smove source destination member 将member元素从source集合移动到 destination集合
- spop key 移除并返回集合中的一个随机元素
- srandmember key 数字 返回集合中一个或多个随机数
- srem key member1 ….. 移除集合中一个或多个成员
-
zset(sorted set:有序集合)
zset集合和无序集合一样都是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。 zadd key score1 member1 【score2 member2】
向有序集合添加一个或多个成员,或者更新已经存在的分数
- zcard key 获取有序集合的成员数
- zcount key min max 计算在有序集合中指定区间分数的成员数
- zrange key start stop withscores 通过索引区间返回有序集合指定区间内的成员
- zrevrangebyscore key max min withscores
返回有序集合中指定分数区间内的成员,分数从高到低排序
zscore key member 返回有序集合中,成员的分数值
redis事务Redis不保证原子性
Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。当事务中命令语法使用错误时(编译期异常),最终会导致事务执行不成功,即事务内所有命令都不执行;
- 当事务中命令知识逻辑错误,就比如给字符串做加减乘除操作时(运行时异常),只能在执行过程中发现错误,这种事务执行中失败的命令不影响其他命令的执行。
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
Multi:开始事务,命令开始进入队列
Exec:开始依次执行命令
discard:组队期间可以放弃组队
- MULTI:标识一个事务的开启,即开启事务;
- EXEC:执行事务中的所有命令,即提交;
- DISCARD:放弃事务;和回滚不一样,Redis事务不支持回滚。
- WATCH:监视Key改变,用于实现乐观锁。如果监视的Key的值改变,事务最终会执行失败。
- UNWATCH:放弃监视。