NoSQL特点

  1. 没有声明性查询语言
  2. 没有预定义的模式
  3. 键 - 值对存储,列存储,文档存储,图形数据库
  4. 最终一致性,而非ACID属性
  5. 非结构化和不可预知的数据
  6. CAP定理
  7. 高性能,高可用性和可伸缩性

    CAP定理(CAP theorem)

    在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

    NoSQL分类

    image.png

    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 过期等等特性。

image.png

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
image.png

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当中
  • type key 返回key所存储值的类型

    字符串命令:

  • 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中
  • hvals 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 在列表中添加一个或多个值
  • rpushx key value 为已存在的列表添加值

    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 ….. 移除集合中一个或多个成员
  • sunion key1 key2 返回所有给定集合的并集

    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:放弃监视。