Redis3:Redis数据结构与命令全解析
目录
1、redis数据结构介绍
1.1命令学习方式
1.1.1命令行查询
2、redis的通用命令
2.1查找常见的通用命令
2.2常见的通用命令:
3、String类型
3.1String类型的常见命令
3.2Key的层级格式
3.2.1Key的结构
4、Hash类型
4.1Hash类型
4.2Hash类型常见命令
5、List类型
5.1 List类型
5.2 List类型的常见命令
5.3List的用法
6、Set类型
6.1 Set类型
6.2Set的常见命令
6.2.1 对单个集合的操作命令
7、SortedSet类型
7.1 SortedSet类型
7.2 sortedset类型的常见命令
1、redis数据结构介绍
redis是一个key-value类型的数据库,key一般是String类型。
但value的类型多种多样:
前五种比较常见string、hash、list、set、sortedset
1.1命令学习方式
1.1.1命令行查询
在redis中我们可以通过help来获得命令提示

1.1.2官方文档查询方式
Commands | Docs
官网地址如上我们可以通过group进行命令筛选

2、redis的通用命令
通用命令是指部分数据类型都可以使用的命令
2.1查找常见的通用命令
fit by group选择generic
2.2常见的通用命令:
-
keys:查看符合模板的所有key
通过help [command] 查看一个命令的具体用法

查询所有的key

查询所有以a开头的key

keys命令支持通配符的使用,所以他在底层逻辑上是一个模糊查询,而Redis又为单线程数据库。所以不建议在生产环境设备上使用。
-
del:删除某个key

删除name键

批量删除

-
EXISTS:判断某个key是否存在

判断name和age是否存在

-
EXPIRE:给某个key设置有效期,有效期到期时该key会被自动删除

-
TTL:查看一个key的剩余有效期
我们可以通过TTL关键字去查看该键的剩余存活时间

当有效期变为-2时,表示该键被自动删除(TTL为-1时表示该键永久有效)
3、String类型
String类型,即字符串类型,是Redis中最简单的存储类型
其value是字符串,但是字符串又可以分为三种:
-
string:普通字符串
-
int:整数类型,可以做自增自减操作
-
float:浮点类型,可以做自增自减操作
(不论那种类型,底层都是以字节数组形式存储,只不过编码方式不同。字节码或者是直接转为二进制。字符串类型的最大空间不能超过512M)
3.1String类型的常见命令
-
SET:添加一个键值对,或者是修改一个已经存在的键值对

-
GET:根据key获取Sting类型的value

-
MSET:批量添加多个Sting类型的键值对

-
MGET:根据多个key获取多个Sting类型的value

-
INCR:让一个整型key自增1

-
INCRBY:让一个整型的key自增并确定步长(自减设置步长为负数即可=DECR)

-
INCRBYFLOAT:让一个浮点型的数字进行自增长,但必须指定步长

注意!!这里的score最好介于-128~128之间,否则incrbyfloat会发生位数异常

-
SETNX:添加一个sting类型的键值对,前提是这个key,不存在,否则不执行
已有——不再新增(分布式锁的实现)

没有——新增(setnx==set .... nx)

-
SETEX:添加一个sting类型的键值对,并且指定有效期
(setex==set key value ex seconds)

3.2Key的层级格式
redis中没有table的概念,我们应该如何区分不同类型的key呢?
例如:需要储存用户、商品信息到redis中,有一个用户id是1,有一个商品的id也恰好是1.
3.2.1Key的结构
Redis允许有多个单词形成层级结构,多个单词之间用 “:” 隔开,格式如下:
项目名:业务名:类型:id
tang:user:1
tang:product:1
格式并不固定,可根据自己的需求删除或添加词条
如果Value是一个java对象,则可以将对象序列化为JSON字符串后储存
实践一下,我们把这几个键存一下

打开图形化界面,我们可以看到 :

这样就实现了key的分级存储
4、Hash类型
4.1Hash类型
hash类型,也叫散列,其value就是一个无序字典,类似于java中的hashmap结构。
String结构是将对象序列化为JSON格式的字符串后储存,需要修改某个对象的某个字段时很不方便,要不覆盖,要不删除重写。
在hash结构中value部分变为了 字段:值 的结构

这样就可以独立表示某个字段,修改某一个字段时对其他字段没有任何影响,十分灵活
4.2Hash类型常见命令
-
HSET key feild value:添加或修改hash类型key的field的值

打开图形化界面工具

修改(没有添加或删除字段,返回值就是0)

-
HGET key feild:获取hash类型key的field的值

-
HMSET:批量添加多个hash类型key的field的值


注意!!官方文档上说明Redis4.0.0版本后hmset已经被弃用,可以用HSET直接代替HMSET


-
HMGET:批量获取多个hash类型key的field的值

-
HGETALL:获取一个hash类型的key的所有field和value的值
可以理解为java中HashMap.entrySet

-
HKEYS:获取一个hash类型的key的所有field
可以理解为java中HashMap.keySet

-
HVALS:获取一个hash类型的key的所有values
可以理解为java中HashMap.keyValues

-
HINCRBY:让一个hash类型的key的字段值自增长并确定步长

步长确定为负数就是负增长

-
HSETNX:添加一个hash类型的key的field的值,前提是这个field不存在,否则不添加
添加失败,因为4已经有这个field了

5、List类型
5.1 List类型
Redis中的List类型与Java中的LinkedList类似,可以看作是一个双向链表结构。既可以支持正向检索也可以支持反向检索。
有序
元素可以重复
插入和删除速度快
查询速度一般(逐个遍历去查询)
List类型常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
5.2 List类型的常见命令
-
LPUSH key element...:向列表左侧插入一个或多个元素
L,R可以理解为队首队尾的区别

打开图形化界面,我们观察到,最先放入的在最下方(有点类似于栈的样子,但他是队列,上下都能取)

-
LPOP key:移除并返回列表左侧被移除的某几个元素,没有则返回nil
(3 2 1 1 2 3)


当list中没有元素时,返回nil

-
RPUSH key element...:向列表右侧插入一个或多个元素

与LPOP相反的,RPOP从下往上插入

-
RPOP key:移除并返回列表右侧被移除的某几个元素,没有则返回nil

取到4

取到之后移除

-
LRANGE key star end:返回一段角标范围内的所有元素
目前库的样子

开始编号为0

-
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时指定等待时间,而不是返回nil
B代表阻塞Block,我们来实操一下这个阻塞的过程:
在这里我们开两个窗口

由于没有users2这个key,所以这个窗口会被阻塞在这个位置

我们在另一个对话框,向users2中放入元素

回到刚刚阻塞的窗口,我们发现他取到了,并且报告了用时

5.3List的用法
1)如何利用List结构去模拟一个栈?
栈:先进后出——入口出口在同一边
LPUSH+LPOP
RPUSH+RPOP
2)如何利用List结构去模拟一个队列?
队列:先进先出——入口出口不在同一边
LPUSH+RPOP
RPUSH+LPOP
3)如何利用List结构去模拟一个阻塞队列?
入口出口不在同一边+实现阻塞
LPUSH+BRPOP
RPUSH+BLPOP
6、Set类型
6.1 Set类型
Redis的Set结构和Java中的HashSet相似,可以看作是一个值为null的HashMap。因为也是一个Hash表,因此也具备以下特征:
无序
元素不可重复
查找快
支持交集,并集,差集
6.2Set的常见命令
6.2.1 对单个集合的操作命令
-
SADD key member ..:向set中添加一个或多个元素。


-
SREM key member ...:移除set中的指定元素

-
SCARD key:返回set中的元素个数
CARD(cardinal)

-
SISMEMBER key member:判断一个元素是否在set中

-
SMEMBERS:获取set中所有元素
我们会发现所得顺序和我们存入的数据顺序并不一致,这是因为set类型无序的特点

6.2.2对多个集合的操作命令
-
SINTER key1 key2 ...:求key1 key2的交集(共同好友)
-
SDIFF key1 key2 ...:求key1 key2的差集
key1 SDIFF key2
-
SUNION key1 key2 ...:求key1 key2的并集
注意重复元素只能出现一次

1)新建key:zs ls

2)计算张三的好友数量

3)计算张三和李四的共同好友

4)查询是张三的好友但不是李四的好友

5)张三和李四一共有哪些好友

6)判断李四是否是张三的好友

7)判断张三是否是李四的好友

8)将李四从张三好友列表中移除

7、SortedSet类型
7.1 SortedSet类型
redis的sortedset类型是一个可排序的Set集合,与Java中的TreeSet有一些相似,但底层的数据结构差别很大。SortedSet中的每个元素都带有一个score属性,可以基于score属性对元素进行排序,底层的实现是一个跳表加hash表。
可排序
元素不重复
查询速度快
经常被用作实现排行榜这样的功能
7.2 sortedset类型的常见命令
这些排序默认是升序,如果想要降序则在需要的命令的Z的后面添加REV即可。
-
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中的指定元素自增,步长为指定的increment值
-
ZRANGE key min max:按照score排序后,获取指定排名范围内的元素(max包括在内)
-
ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
-
ZDIFF\ZINTER\ZUNION:求差集、交集、并集

1)将学生信息添加数据库

2)删除Tom同学

3)获取Amy同学的分数

3)获取Rose同学的排名

排名编号从0开始

4)查询80分以下的同学数量

5)给Amy同学加2分

6)查出成绩前三名的同学

7)返回80分以下的所有同学信息
