当前位置: 首页 > news >正文

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分以下的所有同学信息

http://www.lryc.cn/news/591302.html

相关文章:

  • MongoDB 安装步骤详解
  • AI交互的初期魅力与后期维护挑战
  • RISC-V和ARM有何区别?
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1
  • Flutter状态管理篇之ChangeNotifier(一)
  • 深度学习之神经网络(二)
  • Flutter基础(前端教程①②-序列帧动画)
  • Oracle数据泵详解——让数据迁移像“点外卖”一样简单​
  • 如何查询pg账号权限 能否创建模式 删表建表
  • xss防御策略
  • 从 0 到 1 玩转 XSS - haozi 靶场:环境搭建 + 全关卡漏洞解析
  • OpenCV中VideoCapture 设置和获取摄像头参数和Qt设计UI控制界面详解代码示例
  • 用Python实现神经网络(二)
  • 前端0知识docker临危之被迫弄docker教程
  • NumPy, SciPy 之间的区别
  • ota之.加密算法,mcu加密方式
  • 量化环节:Cont‘d
  • C++网络编程 6.I/0多路复用-epoll详解
  • 现在遇到一个问题 要使用jmeter进行压测 jmeter中存在jar包 我们还要使用linux进行发压,这个jar包怎么设计使用
  • cherry使用MCP协议Streamable HTTP实践
  • RSTP:快速收敛的生成树技术
  • 笔试——Day11
  • 退休时间计算器,精准预测养老时间
  • GraphQL的N+1问题如何被DataLoader巧妙化解?
  • leetcode 3202. 找出有效子序列的最大长度 II 中等
  • Spring整合MyBatis详解
  • kimi故事提示词 + deepseekR1 文生图提示
  • [yotroy.cool] 记一次 spring boot 项目宝塔面板部署踩坑
  • Qt5 与 Qt6 详细对比
  • modbus 校验