NOSQL

NOSQL的概念

NOSQL(Not only sql):不仅仅是sql语句,它是对所有非关系型数据库的一种统称,除去关系型数据库之外的都是非关系数据库。

NOSQL和RDBMS的区别

RDBS(关系型数据库):

  • 高度组织化结构化数据。 user—userid username age sex …
  • 结构化查询语言(SQL) sql语句
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言DML,数据定义语言DDL
  • 严格的一致性. 事务
  • 基于事务

NOSQL(非关系型数据库):

  • 没有声明性查询语言
  • 键 - 值对存储。
  • 最终一致性,而非ACID【原子,一致,隔离,持久】属性
  • 非结构化和不可预知的数据 字符串 对象 队列 集合
  • 高性能,高可用性和可伸缩性。 适合搭建集群。 mysql搭建集群。非常复杂。主从模式

常见的NOSQL数据库

文档数据库:这些数据库通常将每个键与称为文档的复杂数据结构配对。文档可以包含键数组对、键值对甚至嵌套文档。示例:MongoDB、Apache CouchDB、ArangoDB、Couchbase、Cosmos DB、IBM Domino、MarkLogic、OrientDB。

键值存储:每个单独的项都存储为键值对。键值存储是所有NoSQL数据库中最简单的数据库。示例:Redis, Memcached, Apache Ignite, Riak。

宽列存储:这些类型的数据库针对大型数据集上的查询进行了优化,它们将数据列存储在一起,而不是行。示例:Cassandra,Hbase,Scylla。

图形存储:这些存储关于图形、网络的信息,例如社会关系、路线图、交通链接。示例:Neo4j,AllegroGraph。

Redis

Redis是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。Redis提供数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,地理空间索引和流。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

Redis的存储方式是键值对方式,类似于Map的形式,它是一个开源的使用ANSI C语言编写的非关系型数据库。

为什么要使用Redis

1、辅助我们的关系型数据库,Redis读取的速度是110000次/s,写的速度是81000次/s,速度比MySQL快,所以我们可以把Redis当成我们的缓存数据库来辅助我们的关系型数据库,例如MySQL。
2、原子 性,Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
3、支持多种数据结构,例如:string(字符串);list(列表);hash(哈希),set(集合),zset(有序集合)。
4、支持持久化,可以持久化到磁盘内,同时支持主从复制(集群)。

如何安装Redis

这里以Linux为例。

准备工作

1.安装redis需要的环境 yum install -y gcc-c++
2.上官网下载redis源码安装包 redis-5.0.8.tar.gz

安装步骤

  1. 解压redis到/usr/local
  2. 进入redis目录并执行编译命令 make
  3. 执行安装命令 make install

开启Redis服务

使用命令 redis-server redis.conf
出现Redis的logo即代表启动成功。

连接Redis服务器

redis-cli -h redis服务器的ip -p redis服务器的端口号

修改Redis的配置

在Redis的安装目录内找到 redis.conf 配置文件
打开并修改其中的配置项
1.表示启动redis服务器时 后台启动 daemonize yes
2.redis默认端口号 port 6379
3.默认运行的绑定端口号,0.0.0.0表示所有人都可以连接 bind 0.0.0.0,新版本使用

bind * -::*

Redis的常用命令

对Key操作的命令

keys *: 查询所有的key;
del key....:删除指定的key
expire key seconds: 为指定的key设置过期时间单位为秒
ttl key: 查询指定key的存活时间

对数据库操作的命令

flushdb: 清空当前数据库中的数据。
select index: 选择数据库 
flushall: 清空所有数据库中的数据

String字符串类型(Value值为字符串类型)

set key value: 把字符串的value存放到对应的key上。
get key: 根据指定的key获取对应字符串的value
mset key value key value key value....: 一次存放多个字符串的value到相应的key上
mget key key...: 根据指定的多个key获取对应的字符串的value
setnx key value: 把指定的value存放到对应的key上,如果对应的key已经存在,则不存储。
如果不存在则存储。 返回0或者1
incr key: 为指定的key的value值进行递增。应用场景:点赞 收餐  转发等
decr key: 递减

Hash类型(Value值为Hash类型)

hset key field value: 存放一个指定key的field-value的数据库
hget key field:获取指定key的field字段对应的value值。
hkeys key: 获取指定key的所有field字段名
hvals key: 获取指定key的所有value值。
hgetall key: 获取指定key的所有的field和value值。
HDEL key field: 删除指定key的field字段。

List 队列类型

lpush: 将一个或多个值 value 插入到列表 key 的表头.
lpop: 移除并返回列表 key 的头元素。
lrange: 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。

set集合

sadd key value.....: 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

spop key: 移除并返回集合中的一个随机元素。

smove source destint member: 

smembers key:获取指定key下的所有的元素

sinter key key ...:求所有集合的交集。

sortSet 有序集合

应用场景: 排行耪

zadd key  score value score value ....:添加有序集合元素。
zrange key start end: 获取指定返回的元素