1. 初始NoSQL1.1. 关系型数据库与非关系型数据库区别
SQL
NoSQL
数据结构
结构化(Strucured)
非结构化
数据关联
关联
无关联
查询方式
SQL查询
非SQL查询
事务特性
ACID(原子性)
BASE
存储方式
磁盘
内存
扩展性
垂直
水平
使用场景
数据结构固定对一致性、安全性要求高数据结构不固定对一致性、安全性要求不高对性能要求高1.1.1. 结构化与非结构化传统关系型数据库是结构化数据,每张表在创建的时候都有严格的约束信息,如字段名、字段数据类型、字段约束等,插入的数据必须遵循这些约束。NoSQL则对数据格式没有约束,可以是键值型,也可以是文档型,甚至是图格式1.1.2. 关联与非关联传统数据库的表与表之间往往存在相互关联,如外键约束、一对多、多对多等;非关系型数据库不存在表之间的关联关系,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合。1.1.3. 查询方式传统的关系型数据库基于SQL语句做查询,语法有统一的标准SELECT id,name,age FROM tb_user WHERE id=1;而不同的非关系型数据库查询语法差异极大Redis: get user:1MongoDB: db.user.find(_id:1)elasticasearch: GET http://localhost:9200/users/11.1.4. 事务传统关系型数据库能满足事务的ACID原则(原子性、一致性、独立性及持久性)非关系型数据库往往不支持事务,或者不能全部保证ACID性性,只能实现基本的一致性。1.1.5. 存储方式传统的关系型数据库基于磁盘进行存储,会有大量的磁盘IO,对性能有极大的影响;非关系型1.1.6. 扩展性传统关系型数据库一般是主从,主从数据一致,起到数据备份的作用,称为垂直扩展;传统关系型数据库因为表与表之间存在关联关系,如果做水平扩展会给数据查询带来很多麻烦;非关系型数据库可以将数据拆分,存储在不同机器上,可以保存数据数据,解决内存大小有限有问题,称为水平扩展。2. 初始RedisRedis是一种键值型的NoSQL数据库,它有以下几个主要特点:
键值型:是指Redis中存储的数据都是以Key-Value键值对的形式存储NoSQL:是指相对于传统的关系型数据库而言的一种差异很大的非关系型数据库单线程:每个命令具有原子性低延迟:基于内存、IO多路复用、良好的编码支持数据持久化支持主从集群、分片集群支持多语言客户端2.1. Redis命令行客户端redis-cli [options][commands]常见的options:-h 127.0.0.1: 拽定要连接的redis节点IP地址;-p 6379: 指定要连接的redis节点的端口-a ******: 指定要连接的redis节点的访问密码commands就是redis的操作命令,例如:ping:与redis服务端做心跳测试,服务端正常会返回`pong`3. Redis数据结构Redis是典型的key-value数据库,key一般是字符串,而value包含很多不同的数据类型
数据类型
示例
String
hello world
Hash
{name: "jack", age: 21}
List
[A -> B -> C -> D]
Set
{A, B, C}
SortedSet
{A:1, B:2, C:3}
GE0
{A: { 120.3, 30.5 }}
BItMap
0110110101110101011
HyperLog
0110110101110101011
3.1. 通用命令SELECT 0:选择要操作的数据库,0是指编号为0的数据库HELP @Generic: 查询通用命令的帮助文档KEYS pattern:查看符合pattern模式的所有keypattern:* : 1个或多个?:0个或1个不建议在生产环境上使用,因为Redis是单线程的,执行查询的时候会阻塞其他命令DEL key1 key2 :删除一个或多个指定的key,多个key之间以空格隔开EXISTS key: 判断key是否存在,如果存在则返回1,不存在则返回0EXPIRE key time:对一个key设置有效期,有效期到时,该key会被自动删除;示例:EXPIPE name 20 ,给name设置20秒的有效期TTL:查看一个key剩余的有效期(Time-To-Live),如果未设置有效期,则返回-13.2. Redis的KeyRedis没有类似MySQL中Table的概念,因此如何区分不同类型的key?Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开,格式如 `项目名:业务名:类型:key`如果value是一个对象,可以将整个对象序列化为JSON字符串后存储3.3. String类型String 类型是Redis中最常用的数据类型,又可以细分为3类:
string: 普通字符串int:整数类型,可以做自增、自减操作float:浮点类型,可以做自增、自减操作3.3.1. String常用命令命令
描述
SET
添加或者修改一个已经存在的String类型的键值对
GET
根据key获取String类型的value
MSET
批量添加多个String类型的键值对
MGET
根据多个key获取多个String类型的value
INCR
让一个整形的key自增1
INCRBY
让一个整形的key自增指定步长值,例如:INCRBY num 2
INCRBYFLOAT
让一个浮点类型的数字自增指定步长值
SETNX
添加一个String类型的键值对,如果存在则不执行
SETEX
添加一个String类型的键值对,并指定有效期
3.3.2. Hash类型Hash类型也叫散列,其中value是一个无序字典Hash结构可以将对象中的每个字段独立存储,可以针对单 个字段做CRUDkey
value
field
value
reggie:user:1
name
Jack
age
21
reggie:user:2
name
Rose
age
18
3.3.2.1. Hash类型常用命令命令
描述
HSET key field value
添加或者修改hash类型吸的filed值
HGET key filed
获取一个hash类型key的filed值
HMSET key field1 value1 field2 value2...
批量添加多个hash类型key的filed值
HMGET key filed1 filed2
批量获取多个hash类型key的filed值
HGETALL key
获取一个hash类型key的所有filed和value
HKEYS key
获取一个hash类型key的所有filed
HINCRBY key filed1 1/-1
让一个hash类型key中的filed字段自增自定步长
HSETNX key filed
添加一个hash类型的key的filed值,如果存在则不执行
3.3.3. List类型Redis中的List可以看做是一个双向链表结构,支持双向检索,主要有以下特征:有序元素可以重复插入和删除快,查询速度一般常用来存储一个有序数据3.3.3.1. 常用命令如下:命令
描述
LPUSH key element ...
向列表左侧插入一个或多个元素
LPOP key
移除并返回列表左侧的第一个元素,没有则返回nil
RPUSH key element ...
向列表右插入一个或多个元素
RPOP key
移除并返回列表右侧的第一个元素
LRANGE key start end
返回一段下标范围内的所有元素
BLPOP 和 BRPOP
与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
3.3.4. SET类型Redis中的Set与java中的HashSet类似。因此具备与HashSet类似的特征:无序元素不可重复查找快支持交集、并集、差集等功能3.3.4.1. 常用命令命令
描述
SADD key member ...
向set中添加一个或多个元素
SREM key member ...
移除set中的指定元素
SCARD key
返回set中元素的个数
SISMEMBER key member
判断一个元素是否存在于set中
SMEMBERS
获取set中的所有元素
SINTER key1 key2 ...
求key1 与 key2的交集
SUNION key1 key2 ...
求key1与key2的并集
SDIFF key1 key2 ...
求key1与key2的差集
3.3.5. SortedSet类型Redis的SortedSet是一个可排序的set集合,其每个元素都带有一个score属性,可基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。主要有下列特性:可排序元素不可重复查询速度快常用来实现排行榜这样的功能3.3.5.1. 常用命令命令
描述
ZADD key score member
添加一个或多个元素到SortedSet中
ZREM key member
删除SortedSet中的一个指定元素
ZSCORE key member
获取SortedSet中指定元素的score值
ZRANK key member
获取SortedSet中指定元素的排名
ZCARD key
获取SortedSet中的元素个数
ZCOUNT key min max
统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member
让SortedSet中的指定元素自增指定步长的值
ZRANGE key min max
按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max
按照score排序后,获取指定score范围内的元素
ZDIFF、ZINTER、ZUNION
求差集、交集、并集
注意:所有的排名都默认太序,如果要降序,则在命令的Z后面添加REV即可:
如:ZREVRANK key member