一. NoSQL的定义和分类
(一) 什么是NoSQL
NoSQL是非关系性数据库,全名为Not Only SQL,为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql。它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。
(二)NoSQL的分类
1.键值(Key-Value)存储数据库 ,产品:Redis
2.列存储数据库,产品:HBase
3.文档型的数据库,产品:MangoDB
二.Redis的安装和使用
官网:https://redis.io/download
window版下载地址:https://github.com/MicrosoftArchive/redis/releases
下载Redis For window X64.zip,解压到指定目录
三.Redis自带客户端和图形界面客户端
(一)自带的客户端
redis-cli.exe
(二)图形界面客户端
RedisDesktopManager
(三)清缓存命令
flushall
把缓存键值对清空
四.Redis的String数据类型的赋值取值删除
(一)命令
1.赋值 SET key value
·
2.取值 GET key
·
3.赋值并取值 SETGET key value
·
4.设置/获取多个键值 mset key value key value
5.删除 del key
·
6.数值增减
a.递增数字 incr key
当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
b.增加指定的整数 incrby key 指定的数字
c.递减数值 DECR key
d.减少指定的整数 DECR key decrement
6.其它命令
(1)向尾部追加值 APPEND key value
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
(2)获取字符串长度 STRLEN key
(二)应用
1.自增主键
商品编号、订单号采用string的递增数字特性生成。
定义商品编号key:items:id
五.Redis的Hash数据类型的赋值取值删除
(一)使用string的问题
假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:
保存、更新:
User对象—>json(string)—> redis
如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传输、处理时会造成资源浪费,而使用Hash可以解决这个问题
(二)redis hash介绍
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
(三)命令
1.赋值
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
a.一次只能设置一个字段值
语法:HSET key field value
b.一次可以设置多个字段值
语法:HMSET key field value [field value …]
c.当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作
语法:HSETNX key field value
.
2.取值
a.一次只能获取一个字段值
语法:HGET key field
.
b.一次可以获取多个字段值
语法:HMGET key field [field …]
.
c. 获取所有字段值
语法:HGETALL key
.
3.删除字段
可以删除一个或多个字段,返回值是被删除的字段个数
语法:HDEL key field [field …]
.
4.增加数字
语法:HINCRBY key field increment
.
5.其它命令
a.判断字段是否存在
语法:HEXISTS key field
.
b.只获取字段名或字段值
语法:HKEYS key ;HVALS key
.
c.获取字段数量
语法:HLEN key
六.Redis的List数据类型的赋值取值删除
(一)Arraylist和linkedlist的区别
Arraylist是使用数组来存储数据,特点:查询快、增删慢
Linkedlist是使用双向链表存储数据,特点:增删快、查询慢,但是查询链表两端的数据也很快。
Redis的list是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的。
七. Redis的Set数据类型的赋值取值删除
集合类型:无序、不可重复
列表类型:有序、可重复
(一)命令
1.增加/删除元素
语法:SADD key member [member …]
SREM key member [member …]
2.获得集合中的所有元素
语法:SMEMBERS key
3.判断元素是否在集合中
语法:SISMEMBER key member
(二)运算命令
1.集合的差集运算 A-B
属于A并且不属于B的元素构成的集合。
语法:SDIFF key [key …]
2.集合的交集运算 A ∩ B
属于A且属于B的元素构成的集合。
语法:SINTER key [key …]
3.集合的并集运算 A ∪ B
属于A或者属于B的元素构成的集合
语法:SUNION key [key …]
(三)其它命令
1.获得集合中元素的个数
语法:SCARD key
2.从集合中弹出一个元素
注意:由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出
语法:SPOP key
八.Redis的SortedSet数据类型的赋值取值删除
(一)Sortedset
Sortedset又叫zset
Sortedset是有序集合,可排序的,但是唯一。
Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。
(二)命令
1.增加元素
向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
语法:ZADD key score member [score member …]
2.获取元素的分数
语法:ZSCORE key member
3.删除元素
移除有序集key中的一个或多个成员,不存在的成员将被忽略。
当key存在但不是有序集类型时,返回一个错误。
语法:ZREM key member [member …]
4.获得排名在某个范围的元素列表
获得排名在某个范围的元素列表
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrange scoreboard 0 2
- “zhangsan”
- “wangwu”
- "lisi“
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrevrange scoreboard 0 2
- " lisi "
- “wangwu”
- " zhangsan “
如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
- “zhangsan”
- “80”
- “wangwu”
- “94”
5.获取元素的排名
从小到大
语法:ZRANK key member
127.0.0.1:6379> ZRANK scoreboard lisi
(integer) 0
从大到小
语法:ZREVRANK key member
127.0.0.1:6379> ZREVRANK scoreboard zhangsan
(integer) 1
(三)其它命令(自学)
1.获得指定分数范围的元素
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES
- “wangwu”
- “94”
- “lisi”
- “97”
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2 - “wangwu”
- “lisi”
2.增加某个元素的分数
返回值是更改后的分数
语法:ZINCRBY key increment member
127.0.0.1:6379> ZINCRBY scoreboard 4 lisi
"101“
3.获得集合中元素的数量
语法:ZCARD key
127.0.0.1:6379> ZCARD scoreboard
(integer) 3
4.获得指定分数范围内的元素个数
语法:ZCOUNT key min max
127.0.0.1:6379> ZCOUNT scoreboard 80 90
(integer) 1
5.按照排名范围删除元素
语法:ZREMRANGEBYRANK key start stop
127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1
(integer) 2
127.0.0.1:6379> ZRANGE scoreboard 0 -1
- “lisi”
6.按照分数范围删除元素
语法:ZREMRANGEBYSCORE key min max
127.0.0.1:6379> zadd scoreboard 84 zhangsan
(integer) 1
127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100
(integer) 1
(四)应用
1.商品销售排行榜
需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。
写入商品销售量:
商品编号1001的销量是9,商品编号1002的销量是10
192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002
商品编号1001的销量加1
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
商品销量前10名:
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
十一、Keys命令
(一)常用命令
1.keys
返回满足给定pattern 的所有key
redis 127.0.0.1:6379> keys mylist*
- “mylist”
- “mylist5”
- “mylist6”
- “mylist7”
- “mylist8”
2.exists
确认一个key 是否存在
示例:从结果来看,数据库中不存在HongWan 这个key,但是age 这个key 是存在的
redis 127.0.0.1:6379> exists HongWan
(integer) 0
redis 127.0.0.1:6379> exists age
(integer) 1
redis 127.0.0.1:6379>
3.del
删除一个key
redis 127.0.0.1:6379> del age
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 0
4.rename
重命名key
示例:age 成功的被我们改名为age_new 了
redis 127.0.0.1:6379[1]> keys *
- “age”
redis 127.0.0.1:6379[1]> rename age age_new
OK
redis 127.0.0.1:6379[1]> keys * - “age_new”
redis 127.0.0.1:6379[1]>
5.type
返回值的类型
示例:这个方法可以非常简单的判断出值的类型
redis 127.0.0.1:6379> type addr
string
redis 127.0.0.1:6379> type myzset2
zset
redis 127.0.0.1:6379> type mylist
list
redis 127.0.0.1:6379>
6.设置key的生存时间
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。
EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key剩余的生存时间
PERSIST key 清除生存时间 -1
PEXPIRE key milliseconds 生存时间设置单位为:毫秒
-1:清除生存时间,redis一直存在该key
-2:到期,redis没有该key
正整数:剩余的生存时间
例子:
192.168.101.3:7002> set test 1 设置test的值为1
OK
192.168.101.3:7002> get test 获取test的值
“1”
192.168.101.3:7002> EXPIRE test 5 设置test的生存时间为5秒
(integer) 1
192.168.101.3:7002> TTL test 查看test的生于生成时间还有1秒删除
(integer) 1
192.168.101.3:7002> TTL test
(integer) -2
192.168.101.3:7002> get test 获取test的值,已经删除
(nil)