目录
1.关系型数据库(SQL)是指采用了关系模型来组织数据的数据库,关系就是表。
2.非关系型数据库(NoSQL)是指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定,常用于存储非结构化的数据。
基础篇
一.认识NoSQL
数据库分为关系型数据库(SQL)和非关系型数据库(NoSQL)
1.关系型数据库(SQL)是指采用了关系模型来组织数据的数据库,关系就是表。
优点:
(1)易理解,表是根据现实世界创建的,贴近现实
(2)使用方便,sql语句通用
(3)易维护,丰富的完整性大大减少了数据冗余和数据不一致的问题。并且全部由表结构组成, 文件格式一致
(4)提供对事务的支持,能保证系统中事务的正确执行,同时提供事务的恢复、回滚、并发控制 和死锁问题的解决
缺点:
(1)高并发读写能力差,对于网站来说,网站的并发量非常高,数据库的连接数有限,I/O硬盘有限,不能满足大量的用户连接
(2)海量数据情况下读写效率低,读取时间长,对于大数据的表来说,查询需要很长的时间
(3)可扩展性不足,无法像web server和app server可以通过添加硬件和服务节点来拓展性能和负荷工作能力
(4)数据模型灵活度低,关系型数据库的数据模型定义严格,需要提前知道需要存储什么类型的模型,无法快速容纳新的数据类型
2.非关系型数据库(NoSQL)是指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定,常用于存储非结构化的数据。
优点:
(1) 使用灵活应用场景广泛,非关系型数据库存储数据的格式可以是 key-value 形式(键值对)、文档形式、图片形式等。而关系型数据库则只支持基础类型。
(2) 速度快,效率高,NoSQL 可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘。
(3) 海量数据的维护和处理非常轻松,成本低。
(4) 与关系型数据库(SQL)相反,非关系型数据库(NoSQL)具有扩展简单、高并发、高稳定性、成本低廉的优势。
(5) 可以实现数据的分布式处理。
缺点:
(1) 非关系型数据库暂时不提供 SQL 支持,学习和使用成本较高。
(2) 非关系数据库没有事务处理,无法保证数据的完整性和安全性。适合处理海量数据,但是不一定安全。
(3) 功能没有关系型数据库完善。
(4) 复杂表关联查询不容易实现。
二.Redis命令
1.Redis的数据结构介绍
redis是一个key-value的数据库,key的类型一般是String,value的类型多种多样
基本类型:String Hash List Set SortedSet
特殊类型:BitMap GEO HyperLog
2.通用命令
KEYS:查看匹配给定pattern的KEY
//查找含有n的KEY
KEYS *n*
//查询所有的KEY
KEYS *
//查询a开头的KEY
KEYS a*
DEL:删除KEY
//删除name
DEL name
//(后面跟多个KEY可以删除多个KEY)
EXISTS:查询KEY是否存在
//查询age是否存在
EXISTS age
EXPIRE:给KEY设置一个有效期,过期自动删除,单位秒
//给age设置180秒的有效期
EXPIRE age 180
TTL:查看KEY的剩余有效时间
//查询age的有效时间
TTL age
返回 -1表示永久有效
返回 -2表示已经过期
2.KEY的层级格式
redis中并没有类似MySQL中的table概念,我们要如何区分不同类型的KEY呢?
eg:存储id同为1的用户信息和商品信息到Redis中,这样两个相同的id就会起冲突
KEY的结构:
Redis的KEY允许有多个单词形成层级结构,多个单词用':'隔开,列如:
项目名:业务名:类型:id
//设置项目名为com业务名为user的KEY
SET com:user:1 '{"id":1,"name":"jack","age":18}'
SET com:user:2 '{"id":2,"name":"rose","age":20}'
//设置项目名为com业务名为user的KEY
SET com:product:1 '{"id":1,"name":"荣耀9","price":1000}'
SET com:product:2 '{"id":2,"name":"小米6","price":300}'
在图形界面客户端查看
3.位操作
设置指定位(bit)的值,返回此位(bit)原来的值
SETBIT key offset value
offset为二进制值的第几位,从0开始
value为offset位的值,只能是1或者0
//添加str 值为 a,a的asc码为97,转换成进进制为01100001
set str a
//修改第7位的值为1,使修改后的二进制数为01100011,对应asc码为99,为字母c
setbit str 6 1
//返回 c
get str
获取指定位的值
KEYBIT key offset
//获取第7位(bit)的值
getbit str 6
获取为1的位(bit)数
获取指定范围内的值为1的位(bit)的数量
BITCOUNT key[start end [byte | bit]]
strat为开始统计的位置,从0开始计算,可以为负数,-1为最后一个位置
end为结束统计的位置,从0开始计算,可以为负数,-1为最后一个位置
byte为strat 和end的单位为字节,如果不设置默认为byte,比如a,按byte计算长度只有1,所以-1表示第1个字节
bit为start和end的单位为位,比如a,按bit计算长度为8,所以-1表示第8位
//str的值为a,长度为1个字节, start为1表示从第二个字节开始,-1表示最后一个字节,因此返回结果为0
bitcount str 1 -1
//str的值为a,长度为8位,start为1表示从第二个bit开始,-1表示最后一个字节,因此返回结果为4
bitcount str 1 -1 bit
获取字符串里面第一个被设置为1或者0的bit位
BITPOS key value
//获取第一个1开始的位置位
bitpos str 1
对位进行批量操作
用于从指定位置开始获取或替换指定数量的位(bit),可是在指定位进行增量操作
1)从指定位(bit)开始获取指定长度的位(bit),返回获取的二进制的十进制表示
BITFIELD key get [len] [offset]
其中
len为要获取的长度,u开头的表示无符号,i开头的表示有符号,即当第一位为1时,返回的值为负数
offset为从此指定的位开始向后获取
BITFIELD key get [len] [offset]
//修改str的值为abcd
set str abcd
//获取第二个字符的编码,结果为98
bitfield str get u8 8
2)从指定位(bit)开始替换指定数量位(bit)的值,如果超出总长度,超出度部为追加
BITFIELD key set [len] [offset] value
//为str添加第四个字符为d
bitfield str set u8 24 100
//返回结果为abcd
get str
3)从指定位开始把指定长度的位的值都加上0或是1,此处要注意的是,加0表示不改变,加1表示把对应位的值改为0,即加1的时候不会进位
BITFIELD key INCRBY len offset value
//设置str的值为c, 二进制为01100011
set str c
//最后一位加1,二进制为01100010
bitfield str incrby u1 7 1
//返回b
get str
对多个key的值进行二进制位元运算
BITOP oper destkey key1 key2
其中
destkey为用于保存计算结果的key
key1和key2为参与计算的key
oper为位元计算方式,有 AND(与) 、 OR(或) 、 NOT(非) 、 XOR(异或)运算
//a的二进制值为01100001
set str1 a
//b的二进制值为01100010
set str2 b
//进行与运算(同位的值都为1时结果为1),把结果保存到str3中,计算结果为01100000
bitop and str3 str1 str2
//返回`
get str3
//进行或运算(同位的值只在有一个为1,结果为1),把结果保存到str3中,计算结果为01100011
bitop or str3 str1 str2
//返回结果为c
get str3
//进行异或运算(同位的值相同结果为0,不同结果为1),把结果保存到str3中,计算结果为00000011
bitop xor str3 str1 str2
//返回结果为\x03
get str3
4.String类型
String类型,也就是字符串类型,是Redis中最简单的存储类型,其中value的值是字符串,根据字符串的格式不同,又可以分为三类:
string 普通字符串
int 整数类型,可以做自增、自减操作
float 浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m。
KEY VALUE
massage Hello world
num 10
score 99.99
String类型的常见命令:
SET:添加键值对或修改一个已经存在的键值对
GET:根据KEY来获取对于的value
MSET:添加多个String类型的键值对
MGET:获取多个KEY的值
SETNX:添加一个String类型的键值对,如果不存在就执行,反之不执行
SETXX:添加一个String类型的键值对,如果存在就执行
SETEX:添加一个String类型的键值对,并设置有效期(单位:秒)
SETPX:添加一个String类型的键值对,并设置有效期(单位:毫秒)
INCR:让一个整型或浮点类型自增
INCRBY:让一个整型或浮点类型按照指定步长自增
INCRBYFLOAT:让一个整型或浮点类型按照指定小数步长自增
5.Hash类型
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化JSON字符串后存储,当需要修改某个字段时很不方便:
KEY VALUE
com:user:1 {name:"Jack",age:21}
com:user:2 {name:"Rose",age:18}
Hash结构可以将对象的每个字段独立存储,可以针对单个字段做CRUD:
KEY | VALUE | ||
field | value | ||
com:user:1 | name | Jack | |
age | 20 | ||
com:user:2 | name | Rose | |
age | 18 |
Hash类型的常见命令:
HSET KEY field value :添加或修改Hash类型KEY的field的值
HMSET:批量添加多个Hash类型KEY的field的值
HGET KEY field:获取一个Hash类型KEY的field的值
HMGET:批量获取多个Hash类型KEY的值
HGETALL:获取一个Hash类型的KEY中所有的field和value
HKEYS:获取一个Hash类型KEY中所有的field
HVALS:获取一个Hash类型KEY中所有的value
HINCRBY:让一个Hash类型的KEY的字段值按指定步长自增
HINCRBYFLOAT:让一个Hash类型的KEY的字段值按指定小数步长自增
HSETNX:添加一个Hash类型的KEY的field值,不存在就执行,反之不执行
HEXISTS:查询指定的字段是否存在
HLEN:查询字段的数量
6.List类型
Redis中的List类型与Java中的LinkedList类似,可以看做是双向链表结构,既可以支持正向检索也可以支持反向检索。
特征也与LinkedList相似
- 有序
- 元素可重复
- 插入和删除快
- 查询速度一般
List类型的常见命令:
LPUSH key element:从左侧添加一个或多个元素
LPUSHX:仅在元素存在时从左侧添加一个或多个元素
LPOP key:移除并返回左侧第一个元素,没有则返回NULL
RPUSH key element:从右侧添加一个或多个元素
RPUSHX:仅在元素存在时从右侧侧添加一个或多个元素
RPOP key:移除并返回右侧第一个元素,没有则返回NULL
LRANGE key start end:获取(start,end)范围的所有元素
BLPOP:移除并返回左侧第一个元素,没有就等待指定时间,而不是直接返回NULL
BRPOP:移除并返回左侧第一个元素,没有就等待指定时间,而不是直接返回NULL
LINSERT:在指定的元前面或后面插入一个新值
LINSERT key before|after previous element
//在土家族前面添加苗族
LINSERT nation before "土家族" "苗族"
LSET:修改指定下标的元素
LSET key index element
//修改第三个元素为傣族
LSET nation 2 "傣族"
RPOPLPUSH:将右侧第一个元素删除并添加到左侧
RPOPLPUSH source destination
RPOPLPUSH nation nation
BRPOPLPUSH:将右侧第一个元素删除并添加到左侧,如果没有值就会等待指定时间
LREM:从左侧开始计数,删除指定count数量的值,如果不够,则删除实际数量的值
LREM key count element
//删除前两个"傣族"
LREM nation 2 "傣族"
LTIRM:将(start,stop)范围之外的值全部删除
LTIRM key start stop
//只保留第二个值
LTIRM nation 1 1
LINDEX:查询指定下标的值
LINDEX key index
//查询第3个元素
LINDEX nation 2
LLEN:查询key中元素的数量
LLEN key
LLEN nation
7.Set类型
Redis的SET类型与Java中的HashSet类似,可以看做是一个value为null的HashMap,因为也是一个hash表,因此具备与HashSet类似的特性:
无序
- 元素不可重复
- 查询速度快
- 支持交集,并集,差集等功能
SET类型的常见命令:
SADD key member:向set中添加一个或多个元素
SREM key member:移除set中指定的元素
SCARD key:返回set中元素的个数
SISMEMBER key element:判断一个元素是否存在于set中
SMEMBER:获取set中所有的元素
8.SortedSet类型
Redis的SortedSet是一个可排序的集合,与Java中的TreeSet类似,但底层数据结构差别很大。SortedSet中的每一个元素都有一个score属性,可以给基于score属性对元素排序,底层的是一个跳表(SkipList)加hash表。
SrotedSet特征:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet具有排序的特性,经常被用来实现排行榜这样的功能。
SortedSet的常见命令:
ZADD key score member:添加一个或多个元素到sorted set,如果存在则更新其score值
ZREM key member:删除SortedSet中的一个指定元素
ZSCORE key member:获取指定元素的score值
ZRANK key member:获取指定元素的排名
ZCARD key:获取SortedSet中元素的个数
ZCOUNT key min max:获取SortedSet中在(min,max)范围的元素个数
ZINCRBY key increment member:让SorterdSet中的指定元素安装increment值自增
ZRANGE key min max:按照score排序后,获取SortedSet中在(min,max)范围中的元素
ZRANGEBYSCORE key min max:按照score排序后,获取SortedSet中在socre(min,max)范围中的元素
ZDIFF ZINTER ZUNION:求差集 交集 并集
在Z后面添加REV表示降序
更新中。。。
有问题欢迎指出