1.什么是nosql?
NoSQL,指的是非关系型的数据库,NoSQL用于超大规模数据的存储。
2.为什么使用NoSQL ?
Nosql类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展
3.Nosql简史
Nosql1998年是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。
4.Nosql的优点:
高可扩展性
分布式计算
低成本
架构的灵活性,半结构化数据
没有复杂的关系
5.Nosql的缺点:
没有标准化
有限的查询功能(到目前为止)
最终一致是不直观的程序
6.Nosql数据库的分类:
列存储、文档存储、key-value存储、图存储、对象存储、xml数据库存储
7.RDBMS vs NoSQL
RDBMS
(3)将给定的值追加到原值的末尾
append
eg:
将good追加到key名为a的末尾
append a good
练习:
(1)创建一个名为a 值为123的键值对
(2)给123的后面追加abc
(4)获取值的长度
strlen
eg:
获取名为a的key中数据的长度
strlen a
(5)只有在key不存在时设置key的值
setnx
如果key是存在的则不设置(返回0),如果不存在则新增(返回1)
(6)将 key 中储存的数字值加减1
只能对数字值操作,如果为空,新增值为1
incr 对key的值进行加1的操作
decr 对key的值进行减1的操作
练习:
(1) key value
t1 1234
t2 abcd 将以上数据进行字符串的添加操作
(2)获取t2的长度
(3)添加key为p值为123的数据,如果p存在就不设置
(4)对t1进行加1减1的操作
(7)将key中存储的数字值增减(自定义加减数)
<1>incrby <需要增加的数量>
eg:
创建一个名为r值为10的数据,然后对r的值再加10
set r 10
incrby r 10
<2>decrby <需要减的数量>
eg:
创建一个名为r值为30的数据,然后对r的值再减5
set r 30
decrby r 5
练习:
(1)
key value
t3 100
t4 20 将以上数据添加到数据库中
(2)获取t3的长度
(3) 给t3的值加100
(4)给t4的值减15
(5)给t3的值追加good
(6)创建一个key为u值为9的数据,如果存在则不创建,不存在则创建
(7)获取t3 和t4的值
(8)同时设置一个或多个key-value对
mset
eg:
key value
t3 100
t4 20 将以上数据同时添加到数据库中
mset t3 100 t4 20
student
小红 100
小白 98
小黑 59
mset 小红 100 小白 98 小黑 59
(9)同时获取一个或者多个value值
mget …
eg:
小红 100 小白 98 小黑 59
获取成绩单中所有人的分数
mget 小红 小白 小黑
练习:
(1)aa 100
bb 98
cc 59将以上成绩单数据同时添加到数据库中
(2)获取成绩单中所有的分数
(10)同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
msetnx
(11)获取值的范围
getrange <起始位置><结束位置>
eg:
s1 qggduede将以上数据添加到数据库中,并且获取qgg
getrange s1 0 2
(12)用 覆写 所储存的字符串值,从<起始位置>开始覆盖
setrange <起始位置>
将原数据值得部分内容替换成新的内容
eg:
s2 uuuuuu将前3个u替换为999
set s2 uuuuuu
setrange s2 0 999
(13)设置键值的同时,设置过期时间,单位秒
setex <过期时间>
eg:
s3 rrty将以上数据添加到数据库中,并同时设置过期时间为30秒
setex s3 30 rrty
(14)以新换旧,设置了新值同时获得旧值
设置新值同时获得旧值
getset
eg:
s4 uxop 将以上数据添加到数据库中
set s4 uxop
然后获s4的值的同时将值替换为oooo
getset s4 0000
练习:
(1)
d1 80
d2 90
d3 ertyui 将以上数据同时添加到数据库中
(2)同时获取所有的分数
(3)获取d3中的tyu
(4)将d3的ert部分替换为kkk
(5)d5 ukp将以上数据添加到数据库中并同时设置过期时间为30秒
(6)获取d3值的同时将其值更改为good
List
单键多值(一个键有多个值)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
(1)从左边/右边插入一个或多个值
lpush/rpush …
eg1:
从左边插入一个key为t 值为 a b c d 的数
set t a
set t b
lpush t a b c d
1 2 3 4 5
54321
eg2:
从右边插入一个key为t 值为 a b c d 的数
rpush t a b c d
(2)从左边/右边吐出一个值
lpop ----->左边
rpop ------>右边
eg:
插入一个键名为a值为1 2 3 4 5和键名为b值为a b c d e的数据
<1>当数据从左边插入时:
a输入的数据为:12345
a数据的存储状态:54321 -------------->lpush a 1 2 3 4 5
b输入的数据为:a b c d e
b数据存储额状态为:edcba
从左边吐出a的数据:--------------------->lpop a
5
从右边吐出a的数据:---------------------->rpop a
1
从左边吐出b的数据:--------------------->lpop b
e
从右边吐出b的数据:---------------------->rpop b
a
从a的右边吐出1个值,插到b列表的左边
1 e
结果为:1edcba
<2>当数据从右边边插入时:
a输入的数据为:12345
a数据的存储状态:12345 -------------->rpush a 1 2 3 4 5
b输入的数据为:a b c d e
b数据存储额状态为:abcde
从左边吐出a的数据:--------------------->lpop a
1
从右边吐出a的数据:---------------------->rpop a
5
从左边吐出b的数据:--------------------->lpop b
a
从右边吐出b的数据:---------------------->rpop b
e
从a的右边吐出1个值,插到b列表的左边
5 a
结果为:5abcde
(3)从列表右边吐出一个值,插到列表左边
rpoplpush 从列表1的右边吐出一个值插入到列表2的左边
(4)按照索引下标获得元素(从左到右进行获取)
lrange
eg:
a 1 2 3 4 5将以上数据从左边输入到数据库中,然后获取索引下标0-2的元素
lpush a 1 2 3 4 5
lrange a 0 2
a的存储状态:54321
0-2的结果是:543
(5)按照索引下标获得元素
lindex <索引数>
eg:
b 6 7 8 9将以上数据从左边输入到数据库中,然后获取下标为3的元素
lpush b 6 7 8 9
lindex b 3
b的存储状态:9876
下标为3的数:6
(6)获取列表的长度
llen
eg:
n 1 2 3 4 5将以上数据从左边插入到数据库中,然后获取列表n的长度
lpush n 1 2 3 4 5
llen n
(7)在的前面插入
linsert before
eg:
k1 a b c d e 将以上数据从左插入到数据库中,然后在k1中的b前面插入xiaoqiang
lpush k1 a b c d e
linsert k1 before b xiaoqiang
(8)从左边删除n个value(从左到右)
lrem
eg:
k2 a a a b d 将以上数据从左插入到数据库中,然后从左边删除2个值
lpush k2 a a a b d
lrem k2 2 a
练习:
(1) k1 a b c d将以上数据从左插入到数据库中,然后再从右边吐出第一个数
(2)k2 a b c d 将以上数据从右边插入到数据库中,然后再从左边吐出第一个数
(3)k3 1 2 3 4
k4 a b c d将以上数据从左插入到数据库中,从列表k3的右边吐出一个值插入到列表k4的左边
(4)k5 a b c d 将以上数据从左边输入到数据库中,然后获取索引下标0-2的元素
(5)k6 a b c d 将以上数据从左边插入到数据库中,然后获取列表k6的长度
(6)k7 a b b c d 将以上数据从左插入到数据库中,然后从左边删除2个值
(7)k8 a b c d 将以上数据从左边输入到数据库中,然后获取下标为3的元素
(8)k9 1 2 3 4
k10 a b c d将以上数据从左插入到数据库中,从列表k9的右边吐出一个值插入到列表k10的左边
(9)k11 a b c d e 将以上数据从左插入到数据库中,然后在k11中的b前面插入xiaoming
(10)k12 a a a b d 将以上数据从左插入到数据库中,然后从左边删除2个值
Set
无序集合
(1)将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。(添加一键多值)
sadd …
eg:
1 2 3 4 5 将以上的数据添加到集合a中,然后再给集合a中存入一个5
sadd a 1 2 3 4 5
sadd a 5
(2)取出该集合中的所有值
smembers
eg:
查看key名为a的集合里面的所有值
smembers a
(3)判断集合是否为含有该值,有返回1,没有返回0
sismember
eg:
a b c d 将以上的数据添加到集合v中,然后判断集合v是否含有c元素
sadd v a b c d
sismember v c
(4)返回集合中的元素个数
scard
eg:
h j k p将以上数据添加到集合v1中,然后获取出集合v1中的元素个数
sadd v1 h j k p
scard v1
(5)删除集合中的某个元素
srem …
eg:
k p n 将以上数据添加到集合v2中,然后删除集合v2中的p
sadd v2 k p n
srem v2 p
(6)随机从该集合中吐出一个或多个值。(原来的值会被删除)
spop
eg:
48 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 44 45 19
将以上数据添加到集合v3中,然后随机抽取一个数
spop v3 1
(7)随机从该集合中取出n个值。
不会从集合中删除
srandmember
eg:
48 1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 44 45 19
将以上数据添加到集合v3中,然后随机抽取一个数
srandmember v3 1
(8)返回两个集合的交集元素
sinter
eg:
1 2 3 4 5
6 7 8 4 5 将以上数据分别添加到v4和v5中,然后获取v4和v5的交集
sadd v4 1 2 3 4 5
sadd v5 6 7 8 4 5
sinter v4 v5
(9)返回两个集合的并集元素
sunion
eg:
1 2 3 4 5
6 7 8 4 5 将以上数据分别添加到v4和v5中,然后获取v4和v5的并集
sadd v4 1 2 3 4 5
sadd v5 6 7 8 4 5
sunion v4 v5
(10) 返回两个集合的差集元素
sdiff
eg:
1 2 3 4 5
6 7 8 4 5 将以上数据分别添加到v4和v5中,然后获取v4和v5的差集
sdiff v4 v5
练习:
(1)s s s d f将以上数据插入到集合m1中,然后取出该集合中的所有值
(2) d f g h 将以上数据插入到集合m2中,然后判断在集合m2中是否存在p
(3)j k v b c 将以上数据插入到集合m3中,然后获取m3中的元素个数
(4)k o p d g 将以上数据插入到集合m4中,然后删除集合中的元素d
(5)p k g h k 将以上数据插入到集合m5中,然后随机吐出2个值,要求吐出的值被删除掉
(6) k g b c x 将以上数据插入到集合m6中,然后随机吐出3个值,要求吐出的值任被保留
(7) 1 2 3 4 6
9 0 4 6 7 将以上数据分别添加到m7和m7plus中,然后获取m7和m7plus的并集
(8) 1 1 2 3 6
8 9 2 4 1 将以上数据分别添加到m8和m8plus中,然后获取m8和m8plus的交集
(9) 1 6 2 6 6
8 6 2 4 5 将以上数据分别添加到m9和m9plus中,然后获取m9和m9plus的交集
zset
有序集合
(1)将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zadd …
eg:
小红 90
小白 80
小黑 100 将以上数据存在一个key为name1的有集合中
zadd name1 90 小红 80 小白 100 小黑
(2)返回有序集 key 中,下标在 之间的元素 (如果要同时查看score 在命令后面加 withscores)
zrange (withscores)
eg:
小红 90
小白 80
小黑 100 将以上数据存在一个key为name2的有集合中,然后返回集合中的所有元素
zadd name2 90 小红 80 小白 100 小黑
zrange name2 0 10
(3)返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrangebyscore key min max (从小到大排序)
eg:
a 90
b 80
c 100 将以上数据存在一个key为name3的有集合中,然后按从小到大排序
zrangebyscore name3 80 90
(4)从大到小排序
zrevrangebyscore key max min (从大到小排序)
eg:
a 90
b 80
c 100 将以上数据存在一个key为name3的有集合中,然后按从大到小排序
zrevrangebyscore name3 100 80
(5)为元素的score加上增量
为元素原来的分数加一些分
zincrby <添加的分数>
eg:
a 10
b 20
c 30 将以上数据存在一个key为name4的有集合中,然后给c加10分
zadd name4 10 a 20 b 30 c
zincrby name4 10 c
(6)删除该集合下,指定值的元素
zrem
eg:
小刘 90
小马 80
小张 60将以上数据存在一个key为name5的有集合中,然后删除小张
zadd name5 90 小刘 80 小马 60 小张
zrem name5 小张
(7)统计该集合,分数区间内的元素个数
zcount
eg:
小刘 90
小马 67
小张 60
小葵 70 将以上数据存在一个key为name6的有集合中,统计分数在60和70之间的人数
zadd name6 90 小刘 67 小马 60 小张 70 小葵
zcount name6 60 70
(8)返回该值在集合中的排名,从0开始 0 1 2
zrank
eg:
小刘 90
小马 67
小张 60
小葵 70 将以上数据存在一个key为name7的有集合中,返回小张在班级中排名
zadd name6 90 小刘 67 小马 60 小张 70 小葵
zrank name6 xiaozhang
练习:
1.胡南 100
萍萍 99
娟娟 88将以上数据存在一个key为student1的有集合中,然后返回集合中的所有同学的姓名
2.超超 78
婉如 100
妮妮 98将以上数据存在一个key为student2的有集合中,然后通过分数按从小到大排序
3.将集合student2的数据按从小到大排序
4.超超同学加15分
5.超超 78
婉如 100
妮妮 98
元元 59 将以上数据存在一个key为student3的有集合中,统计分数在50和70之间的人数
6.查询集合student3中婉如同学的名次
7.删除student3中的元元
hash
键值对集合
id
name age sex
小红 18 女
小白 19 男
小黑 20 女
student name 小红
student age 19
student sex 女
hash
id name 小红 age 18 sex 女
(1)给集合中的 键赋值
hset <标签/属性>
eg:
创建一个名为student的集合 ,然后给集合student 加上name 标签并赋值为小红
hset student name 小红
(2)从集合 取出 value
hget
eg:
创建一个名为student的集合 ,然后给集合student 加上name 标签并赋值为小红,然后获取name的值
hset student name 小红
hget student name
(3)批量设置hash的值
hmset …
eg:
name age sex score
小红 18 女 100
key名为student1 将以上数据创建集合并进行相应标签的赋值
hmset student1 name 小红 age 18 sex 女 score 100
(4)查看哈希表 key 中,给定域 field 是否存在。
hexists key
eg:
查看名为student1的集合中是否存在name标签
hexists student1 name
(5)列出该hash集合的所有field
hkeys
eg:
查看名为student1的集合中的所有标签
hkeys studnet1
(6)列出该hash集合的所有value
hvals
eg:
查看名为student1的集合中的所有标签的值
hvals student1
(7)为哈希表 key 中的域 field 的值加上增量 increment
hincrby
eg:
为student1的集合中的age 加10
hincrby student1 age 10
(8)将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
hsetnx
如果field存在就不设置,不存在就新增
eg:
为集合student1中设置属性name 值为 小黑的数据
hsetnx student1 name 小黑