NoSQL
1. 定义
NoSQL(Not Only SQL)即不仅仅是 SQL,泛指非关系型的数据库
2. 为什么使用 NoSQL?
传统关系数据库在应付动态网站、特别是超大规模和高并发的纯动态网站已经显得力不从心了,如商品网站中对商品数据的频繁查询、热搜商品的排行统计、订单超时问题。虽然能实现功能,但性能不乐观,而且实现异常复杂,nosql 的出现更好地解决了这些问题
3. 分类
键值存储数据库:
- 说明:主要使用哈希表,这个表有一个特定的键和一个指针指向特定的数据
- 特点:简单易部署,海量数据下对其中部分值进行查询或更新时,效率低下
- 相关产品:Redis、SSDB
列存储数据库:
- 说明:通常用来应付分布式存储的海量数据
- 特点:键依然存在,但一个键指向多个列,由路由键决定实际指向哪一个列
- 相关产品:HBase
文档型数据库:
- 说明:同第一种键值存储类似,该类型的数据模型是版本化的文档,以特定格式存储,比如 JSON
- 特点:以文档形式存储,允许嵌套键值,可以存储与表现更复杂的数据,查询效率更高
- 相关产品:MongoDB
图形数据库:
- 说明:使用灵活的图形模型,并且能扩展到多个服务器
- 特点:可以存储灵活的数据模型,比如地图
- 相关产品:InfoGrid
4. 应用场景
- 数据模型比较简单
- 系统灵活性要求高
- 对数据库性能要求较高
- 不需要高度的数据一致性(Nosql产品对于事务支持不是特别好)
Redis 概述
1. 什么是 Redis?
Redis 是一个开源的基于内存数据存储结构,通常用于数据库,缓存和消息中间件
2. 特点
- 高性能 key-value 内存型数据库
- 支持丰富的数据类型(String、List、Set、Hash)
- 支持数据持久化
- 单进程,单线程,不存在并发问题,线程安全
- 效率高,自身有优化异步处理
3. windows 环境安装
该项目已经多年未更新了,不过作为学习测试还是足够的,下载 Redis-x64-3.2.100.zip 并解压,进入解压目录
打开 cmd 指令窗口,输入命令
.\redis-server.exe .\redis.windows-service.conf
即可运行 Redis
4. Linux 环境安装
以 Ubuntu 18.04.5 为例,安装方法有三种:
4.1 apt-get 方式安装
安装命令
apt-get install -y redis-server
查看 Redis 状态
service redis-server status
可以看到 Redis 状态是 active(running),正在运行当中
启动、停止、重启命令如下
service redis-server start
service redis-server stop
service redis-server restart
默认配置文件位于 /etc/redis/redis.conf
卸载 Redis 命令如下
apt-get purge --auto-remove redis-server
4.2 源码方式安装
下载源码压缩包并解压
wget https://download.redis.io/releases/redis-7.0.4.tar.gz
tar -zxvf redis-7.0.4.tar.gz
由于 Redis 使用 C 语言编写,所以我们需要先安装 gcc 依赖才能完成编译
apt-get update
apt-get install build-essential
进入解压缩目录执行命令,开始编译
make MALLOC=libc
编译完成后会生成一些可执行文件,执行如下命令进行安装
# 表示安装位置在 /usr/redis
make install PREFIX=/usr/redis
进入 /usr/redis/bin 目录启动 Redis 服务
./redis-server # 使用默认配置
进入 /usr/redis/bin 目录启动 Redis 客户端
# raw 参数的作用是显示中文
./redis-cli -h localhost -p 6379 --raw
默认 redis 服务器没有开启远程连接,也就是默认拒绝所有远程客户端连接,需要修改配置开启远程连接
vim redis.conf
# 允许一切客户端连接
bind 127.0.0.1 修改为 0.0.0.0
默认安装目录没有任何配置文件,如果需要指定配置文件启动,要在源码目录复制 redis.conf 到安装目录,再执行命令
./redis-server ../redis.conf
加上 & 可让 redis 服务后台启动
redis-server ./redis.conf &
Redis 操作
1. 库(database)
存放数据的一个基本单元,一个库可以存放 key-value 键值对,redis 中每个库都有一个唯一名称,编号从 0 开始,默认库的个数为 16 个,默认使用 0 号库,库与库之间彼此隔离
# 切换库
SELECT 0
# 清除当前库
FLUSHDB
# 清除全部库
FLUSHALL
2. 操作 key
-- DEL 指令
-- 语法:DEL key [key..]
-- 作用:删除给定的一个或多个 key。不存在的 key 会被忽略。
-- 返回值:被删除 key 的数量
--EXISTS 指令
-- 语法:EXISTS key
-- 作用:检查给定 key 是否存在
-- 返回值:设置成功返回 1
-- EXPIRE 指令
-- 语法:EXPIRE key seconds
-- 作用:为给定 key 设置过期时间,以秒计,超期自动删除
-- 返回值:设置成功返回 1
-- KEYS 指令
-- 语法:KEYS pattern
-- 作用:查找所有符合给定模式(pattern)的 key
-- 返回值:符合给定模式的 key 列表
-- MOVE 指令
-- 语法:MOVE key db
-- 作用:将当前数据库的 key 移动到给定的数据库 db 当中
-- 返回值:移动成功返回 1,失败返回 0
-- PEXPIRE 指令
-- 语法:EXPIRE key milliseconds
-- 作用:设置 key 的过期时间以毫秒计
-- 返回值:设置成功返回 1
-- PEXPIREAT 指令
-- 语法:PEXPIREAT key milliseconds-timestamp
-- 作用:设置 key 过期时间的时间戳 (unix timestamp) 以毫秒计
-- 返回值:设置成功返回 1,设置失败或 key 不存在时返回 0
-- TTL 指令
-- 语法:TTL key
-- 作用:以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
-- 返回值
-- 当 key 不存在时返回 -2
-- 当 key 存在但没有设置剩余生存时间时返回 -1
-- 否则以秒为单位返回 key 的剩余时间
-- PTTL 指令
-- 语法:PTTL key
-- 作用:以毫秒为单位返回 key 的剩余的过期时间
-- 返回值
-- 当 key 不存在时返回 -2
-- 当 key 存在但没有设置剩余生存时间时返回 -1
-- 否则以秒为单位返回 key 的剩余时间
-- RANDOMKEY 指令
-- 语法:RANDOMKEY
-- 作用:从当前数据库中随机返回一个 key
-- 返回值:当数据库不为空时返回一个 key,否则返回 nil
-- RENAME 指令
-- 语法:RENAME key newkey
-- 作用:修改 key 的名称为 newkey。当 key 和 newkey 相同或者 key 不存在时,返回一个错误。
当 newkey 存在时,RENAME 命令将覆盖旧值
-- 返回值:改名成功提示 OK,失败返回一个错误
-- TYPE 指令
-- 语法:TYPE key
-- 作用:返回 key 所存储值得类型
-- 返回值:
-- none(key 不存在)
-- string(字符串)
-- list(列表)
-- set(集合)
-- zset(有序集合)
-- hash(哈希表)
3. 操作 String
-- SET key value
-- 设置指定 key 的值
-- GET key
-- 获取指定 key 的值
-- MSET key value [key value ...]
-- 同时设置一个或多个 key-value 对
-- MGET key1 [key2..]
-- 获取所有(一个或多个)给定 key 的值
-- GETSET key value
-- 将给定 key 的值设为 value ,并返回 key 的旧值
-- STRLEN key
-- 返回 key 所储存的字符串值的长度
-- APPEND key value
-- 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾
-- GETRANGE key start end
-- 返回 key 中字符串值的子字符
-- SETEX key seconds value
-- 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
-- PSETEX key milliseconds value
-- 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位
-- SETNX key value
-- 只有在 key 不存在时设置 key 的值
-- MSETNX key value [key value ...]
-- 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
-- DECR key
-- 将 key 中储存的数字值减一
-- DECRBY key decrement
-- key 所储存的值减去给定的减量值
-- INCR key
-- 将 key 中储存的数字值增一
-- INCRBY key increment
-- 将 key 所储存的值加上给定的增量值
-- INCRBYFLOAT key increment
-- 将 key 所储存的值加上给定的浮点增量值
-- GETBIT key offset
-- 对 key 所储存的字符串值,获取指定偏移量上的位
-- SETBIT key offset value
-- 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
-- SETRANGE key offset value
-- 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
4. 操作 List
-- LPUSH key value1 [value2]
-- 将一个或多个值插入到列表头部
-- LPUSHX key value
-- 将一个值插入到已存在的列表头部
-- RPUSH key value1 [value2]
-- 在列表中添加一个或多个值
-- RPUSHX key value
-- 为已存在的列表添加值
-- LPOP key
-- 移出并获取列表的第一个元素
-- RPOP key
-- 移除列表的最后一个元素,返回值为移除的元素
-- LRANGE key start stop
-- 获取列表指定范围内的元素
-- LLEN key
-- 获取列表长度
-- LSET key index value
-- 通过索引设置列表元素的值
-- LINDEX key index
-- 通过索引获取列表中的元素
-- LREM key count value
-- 移除列表元素
-- LTRIM
-- 保留列表特定区间内的元素
-- LINSERT key BEFORE|AFTER pivot value
-- 在列表的元素前或者后插入元素
-- BLPOP key1 [key2 ] timeout
-- 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-- BRPOP key1 [key2 ] timeout
-- 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-- BRPOPLPUSH source destination timeout
-- 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它。如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-- LTRIM key start stop
-- 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
-- RPOPLPUSH source destination
-- 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
5. 操作 Set
1 SADD key member1 [member2]
向集合添加一个或多个成员
2 SCARD key
获取集合的成员数
3 SDIFF key1 [key2]
返回给定所有集合的差集
4 SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
5 SINTER key1 [key2]
返回给定所有集合的交集
6 SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
7 SISMEMBER key member
判断 member 元素是否是集合 key 的成员
8 SMEMBERS key
返回集合中的所有成员
9 SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
10 SPOP key
移除并返回集合中的一个随机元素
11 SRANDMEMBER key [count]
返回集合中一个或多个随机数
12 SREM key member1 [member2]
移除集合中一个或多个成员
13 SUNION key1 [key2]
返回所有给定集合的并集
14 SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
6. 操作 ZSet
元素可排序,不可以重复
1 ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
2 ZCARD key
获取有序集合的成员数
3 ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
4 ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6 ZLEXCOUNT key min max
在有序集合中计算指定字典区间内成员数量
7 ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合指定区间内的成员
8 ZRANGEBYLEX key min max [LIMIT offset count]
通过字典区间返回有序集合的成员
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通过分数返回有序集合指定区间内的成员
10 ZRANK key member
返回有序集合中指定成员的索引
11 ZREM key member [member ...]
移除有序集合中的一个或多个成员
12 ZREMRANGEBYLEX key min max
移除有序集合中给定的字典区间的所有成员
13 ZREMRANGEBYRANK key start stop
移除有序集合中给定的排名区间的所有成员
14 ZREMRANGEBYSCORE key min max
移除有序集合中给定的分数区间的所有成员
15 ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到低
16 ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
17 ZREVRANK key member
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18 ZSCORE key member
返回有序集中,成员的分数值
19 ZUNIONSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成员和元素分值
7. 操作 Hash
value 是一个 map 结构,无序
1 HDEL key field1 [field2]
删除一个或多个哈希表字段
2 HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
3 HGET key field
获取存储在哈希表中指定字段的值。
4 HGETALL key
获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7 HKEYS key
获取所有哈希表中的字段
8 HLEN key
获取哈希表中字段的数量
9 HMGET key field1 [field2]
获取所有给定字段的值
10 HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key
获取哈希表中所有值。
14 HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。