NoSQL 数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型,许多 NoSQL数据库都有 REST式的数据接口或者查询API。
随着互联网网站的兴起,传统的关系数据库在应付动态网站,特别是超大规模和高并发的纯动态网站已经显得力不从心,暴露了很多难以克服的问题。如:商城网站中对商品数据频繁查询、对热搜商品的排行统计、订单超时问题、以及微信朋友圈(音频,视频)存储等相关需求 使用传统的关系型数据库实现就显得非常复杂,虽然能实现相应功能但是在性能上却不是那么乐观。NoSQL 这个技术门类的出现,更好的解决了这些问题,它告诉了世界不仅仅是SQL。
1、键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
-
Key-Value 模型对于IT系统来说的优势在于简单、易部署。
-
但是如果 DBA 只对部分值进行查询或更新的时候,Key-Value就显得效率低下。
相关产品:
-
Tokyo Cabinet/Tyrant,
-
Redis
-
SSDB
-
Voldemort
-
Oracle BDB
2、列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。
特点:键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
相关产品:Cassandra、HBase、Riak.
3、文档型数据库
文档型数据库的灵感是来自于 Lotus Notes 办公软件,而且它同第一种键值存储相类似,该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高
特点:以文档形式存储;
相关产品:MongoDB、CouchDB、 MongoDb(4.x)、SequoiaDB(国产,已经开源)。
4、图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它使用灵活的图形模型,并且能够扩展到多个服务器上。
相关产品:Neo4J、InfoGrid、 Infinite Graph
-
数据模型比较简单;
-
需要灵活性更强的 IT 系统;
-
对数据库性能要求较高;
-
不需要高度的数据一致性(事务的支持),性能要求高则说明允许数据有略微的偏差。
===========================================================================
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.
Redis 开源、遵循BSD协议、基于内存数据存储,被用于作为 数据库、缓存、消息中间件
重点:Redis 是一个内存型的数据库
Redis 特点
-
Redis 是一个 高性能 key/value内存型数据库;
-
Redis 拥有丰富的数据类型;
-
Redis 支持持久化;
-
Redis 单线程,单进程;
================================================================================
环境准备:
-
vmware15.x+
-
centos7.x+
Redis 官网下载源码包:https://redis.io/
下载后上传到 Linux 中,解压缩文件:
tar -zxvf redis-4.0.10.tar.gz # 解压Redis源码包
ll # 查看当前文件目录
centos7 安装 gcc:
yum install -y gcc
进入解压缩目录执行如下命令:
make MALLOC=libc
编译完成后执行如下命令:
make install PREFIX=/usr/redis
进入 /usr/redis 目录启动 Redis 服务:
./redis-server
Redis服务端口默认:6379
再打开一个命令行,进入 bin 目录执行客户端连接操作:
./redis-cli –p 6379
注:直接使用 ./redis-server
方式启动使用的是 redis-server 这个 shell 脚本中默认配置;
如何在启动 Redis 时指定配置文件启动?
默认在redis安装完成之后再安装目录没有任何配置文件,需要在源码目录中复制 redis.conf 配置文件到安装目录;
cp redis.conf /usr/ redis
加载配置启动 Redis:
./redis-server …/redis.conf
修改 redis 默认端口号:
vi redis.conf # 修改里面 port 7000, 保存退出
默认 Redis 服务器没有开启远程连接,也就是默认拒绝所有远程客户端连接;
1、修改配置文件开启远程连接:
vim redis.conf # 修改配置文件
修改 bind 127.0.0.1
为 bind 0.0.0.0
,表示 允许一切客户端连接
2、修改配置后重启 Redis 服务:一定要加载配置文件启动!
./redis-server …/redis.conf
我使用的是 Redis Desktop Manager 连接 Linux 下的 Redis:
如果连接失败,关闭防火墙 后重新连接:
systemctl stop f
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
irewalld.service
Redis 端口占用(kill redis-server 进程)
启用 Redis 出现:
Creating Server TCP listening socket *:6379: bind: Address already in use
6379 地址已经在使用(6379是 Redis 默认的端口)
解决方法:找到 redis-server 的进程 kill 掉
ps -ef | grep -i redis
kill -9 2700
=============================================================================
Redis 库
库是 database 用来存放数据的一个基本单元,每个库都可以存放独立的 key-value 键值对,Redis 中每一个库都有一个唯一名称/编号,从 0 开始。
-
默认库的个数:16 个(可以在配置文件中修改),库的编号:0 - 15,默认使用 0号库;
-
切换库的命令:select dbid(库编号)
Redis 操作库的指令
-
清空当前的库:
FLUSHDB
-
清空全部的库:
FLUSHALL
Redis 客户端显示中文
启动 Redis 时后面添加:--raw
./redis-cli -p 7000 --raw
DEL 指令
-
语法 :
DEL key [key ...]
-
作用 : 删除给定的一个或多个 key,不存在的 key 会被忽略。
-
可用版本: >= 1.0.0
-
返回值: 被删除 key 的数量。
EXISTS 指令
-
语法:
EXISTS key
-
作用: 检查给定 key 是否存在。
-
可用版本: >= 1.0.0
-
返回值: 若 key 存在,返回1 ,否则返回0。
EXPIRE 指令
-
语法:
EXPIRE key seconds
-
作用: 为给定 key 设置生存时间(秒),当 key 过期时(生存时间为 0),它会被自动删除。
-
可用版本: >= 1.0.0
-
时间复杂度: O(1)
-
返回值:设置成功返回 1 。
KEYS 指令
-
语法 :
KEYS pattern
-
作用 : 查找所有符合给定模式 pattern 的 key 。
-
语法:
KEYS *
:匹配数据库中所有 key 。
KEYS h?llo
:匹配 hello ,hallo 和 hxllo 等。
KEYS h*llo
:匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo
: 匹配 hello 和 hallo ,但不匹配 hillo 。特殊符号用 \
隔开
-
可用版本: >= 1.0.0
-
返回值: 符合给定模式的 key 列表。
MOVE 指令
-
语法 :
MOVE key db
-
作用 : 将当前数据库的 key 移动到给定的数据库 db 当中。
-
可用版本: >= 1.0.0
-
返回值: 移动成功返回 1 ,失败则返回 0 。
PEXPIRE 指令
-
语法 :
PEXPIRE key milliseconds
-
作用 : 这个命令和
EXPIRE
命令的作用类似,但是它以 毫秒 为单位设置 key 的生存时间
(EXPIRE
以秒为单位)
-
可用版本: >= 2.6.0
-
时间复杂度: O(1)
-
返回值:设置成功,返回1。key 不存在或设置失败,返回0
PEXPIREAT 指令
-
语法 :
PEXPIREAT key milliseconds-timestamp
-
作用 : 这个命令和
EXPIREAT
命令类似,但它以 毫秒 为单位设置 key 的过期 unix 时间戳(EXPIREAT
以秒为单位) -
可用版本: >= 2.6.0
-
返回值:如果生存时间设置成功,返回 1 。当 key 不存在或没办法设置生存时间时,返回 0 。
(查看EXPIRE 命令获取更多信息)
TTL 指令
-
语法 :
TTL key
-
作用 : 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
-
可用版本: >= 1.0.0
-
返回值:
当 key 不存在时,返回 -2 。
当 key 存在但没有设置剩余生存时间时,返回 -1 。
否则,以秒为单位,返回 key 的剩余生存时间。
- Note : Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。
PTTL 指令
-
语法 :
PTTL key
-
作用 : 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间
(TTL 以秒为单位)
-
可用版本: >= 2.6.0
-
返回值: 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。
-
否则,以毫秒为单位,返回 key 的剩余生存时间。
-
注意 : Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。
RANDOMKEY 指令
-
语法 :
RANDOMKEY
-
作用 : 从当前数据库中随机返回(不删除) 一个 key 。
-
可用版本: >= 1.0.0
-
返回值:当数据库不为空时,返回一个 key 。当数据库为空时,返回
nil
。
RENAME 指令
-
语法 :
RENAME key newkey
-
作用 : 将 key 改名为 newkey 。
当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
当 newkey 已经存在时,RENAME
命令将覆盖旧值。
-
可用版本: >= 1.0.0
-
返回值: 改名成功时提示OK ,失败时候返回一个错误。
TYPE 指令
-
语法 :
TYPE key
-
作用 : 返回 key 所储存的值的类型。
-
可用版本: >= 1.0.0