NoSQL(Not Only SQL),意思是 不仅仅是SQL,泛指 非关系型数据库。NoSQL 这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。
NoSQL 数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型,许多 NoSQL数据库都有 REST式的数据接口或者查询API。
随着互联网网站的兴起,传统的关系数据库在应付动态网站,特别是超大规模和高并发的纯动态网站已经显得力不从心,暴露了很多难以克服的问题。如:商城网站中对商品数据频繁查询、对热搜商品的排行统计、订单超时问题、以及微信朋友圈(音频,视频)存储等相关需求 使用传统的关系型数据库实现就显得非常复杂,虽然能实现相应功能但是在性能上却不是那么乐观。NoSQL 这个技术门类的出现,更好的解决了这些问题,它告诉了世界不仅仅是SQL。
1、键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
相关产品:
2、列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。
特点:键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
相关产品:Cassandra、HBase、Riak.
3、文档型数据库
文档型数据库的灵感是来自于 Lotus Notes 办公软件,而且它同第一种键值存储相类似,该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高
特点:以文档形式存储;
相关产品:MongoDB、CouchDB、 MongoDb(4.x)、SequoiaDB(国产,已经开源)。
4、图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它使用灵活的图形模型,并且能够扩展到多个服务器上。
相关产品:Neo4J、InfoGrid、 Infinite Graph
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 官网下载源码包:https://redis.io/
下载后上传到 Linux 中,解压缩文件:
tar -zxvf redis-4.0.10.tar.gz # 解压Redis源码包
ll # 查看当前文件目录
yum install -y gcc
进入解压缩目录执行如下命令:
make MALLOC=libc
编译完成后执行如下命令:
make install PREFIX=/usr/redis
进入 /usr/redis 目录启动 Redis 服务:
./redis-server
再打开一个命令行,进入 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 firewalld.service
启用 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 开始。
Redis 操作库的指令
FLUSHDB
FLUSHALL
Redis 客户端显示中文
启动 Redis 时后面添加:--raw
./redis-cli -p 7000 --raw
DEL 指令
DEL key [key ...]
EXISTS 指令
EXISTS key
EXPIRE 指令
EXPIRE key seconds
KEYS 指令
KEYS pattern
KEYS *
:匹配数据库中所有 key 。KEYS h?llo
:匹配 hello ,hallo 和 hxllo 等。KEYS h*llo
:匹配 hllo 和 heeeeello 等。KEYS h[ae]llo
: 匹配 hello 和 hallo ,但不匹配 hillo 。特殊符号用 \
隔开MOVE 指令
MOVE key db
PEXPIRE 指令
PEXPIRE key milliseconds
EXPIRE
命令的作用类似,但是它以 毫秒 为单位设置 key 的生存时间EXPIRE
以秒为单位)PEXPIREAT 指令
PEXPIREAT key milliseconds-timestamp
EXPIREAT
命令类似,但它以 毫秒 为单位设置 key 的过期 unix 时间戳(EXPIREAT
以秒为单位)TTL 指令
TTL key
PTTL 指令
PTTL key
RANDOMKEY 指令
RANDOMKEY
nil
。RENAME 指令
RENAME key newkey
RENAME
命令将覆盖旧值。TYPE 指令
TYPE key
none
:key 不存在string
:字符串list
:列表set
:集合zset
:有序集hash
:哈希表命令 | 说明 |
---|---|
set | 设置一个key/value |
get | 根据key获得对应的value |
mset | 一次设置多个key value |
mget | 一次获得多个key的value |
getset | 获得原始key的值,同时设置新值 |
strlen | 获得对应key存储value的长度 |
append | 为对应key的value追加内容 |
getrange 索引0开始 | 截取value的内容 |
setex | 设置一个key存活的有效期(秒) |
psetex | 设置一个key存活的有效期(毫秒) |
setnx | 存在不做任何操作,不存在添加 |
msetnx原子操作(只要有一个存在不做任何操作) | 可以同时设置多个key,只要有一个存在都不保存 |
decr | 进行数值类型的-1操作 |
decrby | 根据提供的数据进行减法操作 |
incr | 进行数值类型的+1操作 |
incrby | 根据提供的数据进行加法操作 |
incrbyfloat | 根据提供的数据加入浮点数 |
List 列表 相当于 Java 中的 List 集合,特点:元素有序 且 可以重复
命令 | 说明 |
---|---|
lpush | 将某个值加入到一个key列表头部 |
lpushx | 同lpush,但是必须要保证这个key存在 |
rpush | 将某个值加入到一个key列表末尾 |
rpushx | 同rpush,但是必须要保证这个key存在 |
lpop | 返回和移除列表左边的第一个元素 |
rpop | 返回和移除列表右边的第一个元素 |
lrange | 获取某一个下标区间内的元素 |
llen | 获取列表元素个数 |
lset | 设置某一个指定索引的值(索引必须存在) |
lindex | 获取某一个指定索引位置的元素 |
lrem | 删除重复元素 |
ltrim | 保留列表中特定区间内的元素 |
linsert | 在某一个元素之前,之后插入新元素 |
特点:Set 类型 相当于Java 中的 Set 集合;特点:元素无序、不可以重复;
命令 | 说明 |
---|---|
sadd | 为集合添加元素 |
smembers | 显示集合中所有元素 无序 |
scard | 返回集合中元素的个数 |
spop | 随机返回一个元素 并将元素在集合中删除 |
smove | 从一个集合中向另一个集合移动元素 必须是同一种类型 |
srem | 从集合中删除一个元素 |
sismember | 判断一个集合中是否含有这个元素 |
srandmember | 随机返回元素 |
sdiff | 去掉第一个集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
命令 | 说明 |
---|---|
zadd | 添加一个有序集合元素 |
zcard | 返回集合的元素个数 |
zrange 升序 zrevrange 降序 | 返回一个范围内的元素 |
zrangebyscore | 按照分数查找一个范围内的元素 |
zrank | 返回排名 |
zrevrank | 倒序排名 |
zscore | 显示某一个元素的分数 |
zrem | 移除某一个元素 |
zincrby | 给某个特定元素加分 |
特点:value 是一个 map 结构,存在 key、value,key 是无序的;
命令 | 说明 |
---|---|
hset | 设置一个key/value对 |
hget | 获得一个key对应的value |
hgetall | 获得所有的key/value对 |
hdel | 删除某一个key/value对 |
hexists | 判断一个key是否存在 |
hkeys | 获得所有的key |
hvals | 获得所有的value |
hmset | 设置多个key/value |
hmget | 获得多个key的value |
hsetnx | 设置一个不存在的key的值 |
hincrby | 为value进行加法运算 |
hincrbyfloat | 为value加入浮点值 |