Redis基础 -- Redis数据结构、Redis通用命令、Redis 的 key 的层次结构、Redis5种数据类型及基本命令(String、List、Hash、Set、SortedSet)

1. Redis数据结构

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
在这里插入图片描述

大部分程序员应该都不会对Redis的STRING、LIST、HASH这3种结构感到陌生,因为它们和很多编程语言内建的字符串、列表和散列等结构在实现和语义(semantics)方面都非常相似。有些编程语言还有集合数据结构,在实现和语义上类似于Redis的SET。ZSET在某种程度上是一种Redis特有的结构,但是当你熟悉了它之后,就会发现它也是一种非常有用的结构。下表对比了Redis提供的5种基本类型,说明了这些结构存储的值,并简单介绍了它们的语义。
在这里插入图片描述

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( https://redis.io/commands )可以查看到不同的命令:
在这里插入图片描述

也可以通过 redis-cli 客户端查看帮助文档:
在这里插入图片描述


2. Redis通用命令

我们可以去官方网站上面查找Redis的通用命令:
在这里插入图片描述

也可以通过 redis-cli 客户端查看Redis的通用命令:
在这里插入图片描述
通用指令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key 生产环境下不建议使用:redis是单线程,数据量大的时候,模糊查询比较耗时,会导致系统阻塞。如果是集群部署的redis,不在主服务器使用,可以在从服务器使用。
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个KEY的剩余有效期

通过help [command] 可以查看一个命令的具体用法,例如:
在这里插入图片描述


2.1 KEYS(查看符合模板的所有key )

KEYS官方帮助文档

redis的模板(patterns)学习:
在这里插入图片描述
KEYS命令示例:
在这里插入图片描述


2.2 DEL(删除一个指定的key )

语法:

在这里插入图片描述

示例:

在这里插入图片描述


2.3 EXISTS(查看指定的key是否存在)

语法:

在这里插入图片描述

示例:

在这里插入图片描述


2.4 EXPIRE(给一个key设置有效期)

语法:设置的这个KEY必须事先创建好

在这里插入图片描述

示例:

在这里插入图片描述


2.5 TTL(查看一个key的剩余有效期 )

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述
如果key设置了有效期,并且没有过期,则TTL命令可以查看该key的剩余有效期。


3. String类型


3.1 String类型介绍

String类型,也就是字符串类型,是Redis中最简单的存储类型。 其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.
在这里插入图片描述


3.2 String类型常用命令

String的常见命令有

  • SET:添加或者修改已经存在的一个String类型的键值对(对于存在的key来说是修改)
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行 (这是真正的新增)
  • SETEX:添加一个String类型的键值对,并且指定有效期

3.2.1 SET

语法:

在这里插入图片描述

示例:

在这里插入图片描述


3.2.2 GET

语法:

在这里插入图片描述

示例:

在这里插入图片描述


3.2.3 MSET

语法:

在这里插入图片描述

示例:

在这里插入图片描述


3.2.4 MGET

语法:

在这里插入图片描述

示例:

在这里插入图片描述


3.2.5 INCR

语法:

在这里插入图片描述

示例:

在这里插入图片描述


3.2.6 INCRBY

语法:

在这里插入图片描述

示例:

在这里插入图片描述


3.2.7 INCRBYFLOAT

语法:

在这里插入图片描述

示例:

在这里插入图片描述


3.2.8 SETNX

语法:

在这里插入图片描述

在这里插入图片描述

示例:

在这里插入图片描述


3.2.9 SETEX

语法:

在这里插入图片描述
在这里插入图片描述

示例:

在这里插入图片描述


4. Redis 的 key 的层次结构

Redis的key允许有多个单词形成层级结构,多个单词之间用 : 隔开,格式如下:
在这里插入图片描述这个格式并非固定,也可以根据自己的需求来删除或添加词条。 例如我们的项目名称叫 heima,有user和product两种不同类型的数据,我们可以这样定义key:
在这里插入图片描述如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:
在这里插入图片描述

示例:

set codejiao:user:1 '{"id":1, "name":"Jack", "age": 21}'
set codejiao:user:2 '{"id":1, "name":"Jack", "age": 21}'

在这里插入图片描述
创建结果:
在这里插入图片描述


5. Hash类型


5.1 Hash类型介绍

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

Redis的散列键会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段(field)设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。

通过使用散列键,用户可以把相关联的多项数据存储到同一个散列里面,以便对这些数据进行管理,或者针对它们执行批量操作。下图就展示了一个使用散列存储文章数据的例子,在这个例子中,散列的键article::10086,而这个键对应的散列则包含了4个字段,其中:
在这里插入图片描述
在这里插入图片描述因此Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD
在这里插入图片描述

Hash的常见命令有:

HSET key field value:添加或者修改hash类型key的field的值
HGET key field:获取一个hash类型key的field的值
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有的field和value
HKEYS:获取一个hash类型的key中的所有的field
HVALS:获取一个hash类型的key中的所有的value
HINCRBY:让一个hash类型key的字段值自增并指定步长
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行


5.2 Hash类型常用命令介绍


5.2.1 HSET

添加或者修改hash类型key的field的值

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


5.2.2 HGET

获取一个hash类型key的field的值

语法:

在这里插入图片描述

示例:

在这里插入图片描述


5.2.3 HMSET

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

语法:

在这里插入图片描述

示例:

在这里插入图片描述在这里插入图片描述


5.2.4 HMGET

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

语法:

在这里插入图片描述

示例:

在这里插入图片描述


5.2.5 HGETALL

获取一个hash类型的key中的所有的field和value

语法:

在这里插入图片描述

示例:

在这里插入图片描述


5.2.6 HKEYS

获取一个hash类型的key中的所有的filed

语法:

在这里插入图片描述

示例:

在这里插入图片描述


5.2.7 HVALS

获取一个hash类型的key中的所有的value

语法:

在这里插入图片描述

示例:

在这里插入图片描述


5.2.8 HINCRBY

让一个hash类型key的字段值自增并指定步长

语法:

在这里插入图片描述

示例:

在这里插入图片描述


5.2.9 HSETNX

添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

语法:

在这里插入图片描述

示例:

在这里插入图片描述在这里插入图片描述


6. List类型


6.1 List类型介绍

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

常用命令:

  • LPUSH key element … :向列表左侧插入一个或多个元素
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPUSH key element … :向列表右侧插入一个或多个元素
  • RPOP key:移除并返回列表右侧的第一个元素
  • LRANGE key star end:返回一段角标范围内的所有元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

在这里插入图片描述


6.2 List类型常用命令介绍


6.2.1 LPUSH

向列表左侧插入一个或多个元素

语法:

在这里插入图片描述

示例:

如果users不存在则会创建一个List类型的users
在这里插入图片描述在这里插入图片描述


6.2.2 LPOP

移除并返回列表左侧的第一个元素,没有则返回nil

语法:

在这里插入图片描述

示例:

在这里插入图片描述在这里插入图片描述


6.2.3 RPUSH

向列表右侧插入一个或多个元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


6.2.4 RPOP

移除并返回列表右侧的第一个元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述


6.2.5 LRANGE

返回一段角标范围内的所有元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述


6.2.6 BLPOP和BRPOP

与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil,这里就不演示了

语法:

在这里插入图片描述


6.3 List类型思考

如何利用List结构模拟一个栈?

  • 入口和出口在同一边

如何利用List结构模拟一个队列?

  • 入口和出口在不同边

如何利用List结构模拟一个阻塞队列?

  • 入口和出口在不同边
  • 出队时采用BLPOPBRPOP

7. Set类型


7.1 Set类型介绍

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

redis的集合(set)键允许用户将任意多个各不相同的元素存储到集合中,这些元素既可以是文本数据,也可以是二进制数据。虽然列表键也允许我们存储多个元素,但集合与列表有以下两个明显的区别:

  • 列表可以存储重复元素,而集合只会存储非重复元素,尝试将一个已存在的元素添加到集合将被忽略。
  • 列表以有序方式存储元素,而集合则以无序方式存储元素。

这两个区别带来的差异主要跟命令的复杂度有关:

  • 在执行像LINSERT和LREM这样的列表命令时,即使命令只针对单个列表元素,程序有时也不得不遍历整个列表以确定指定的元素是否存在,因此这些命令的复杂度都为O(N)。
  • 对于集合来说,因为所有针对单个元素的集合命令都不需要遍历整个集合,所以复杂度都为O(1)。

因此当我们需要存储多个元素时,就可以考虑这些元素是否可以以无序的方式存储,并且是否不会出现重复,如果是,那么就可以使用集合来存储这些元素,从而有效地利用集合操作的效率优势。

Set类型常用命令有:

  • SADD key member … :向set中添加一个或多个元素
  • SREM key member … : 移除set中的指定元素
  • SCARD key: 返回set中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set中
  • SMEMBERS:获取set中的所有元素
  • SINTER key1 key2 … :求key1与key2的交集
  • SDIFF key1 key2 … :求key1与key2的差集
  • SUNION key1 key2 …:求key1和key2的并集

7.2 Set类型常用命令


7.2.1 SADD

向set中添加一个或多个元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


7.2.2 SREM

移除set中的指定元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


7.2.3 SCARD

返回set中元素的个数

语法:

在这里插入图片描述

示例:

在这里插入图片描述


7.2.4 SISMEMBER

判断一个元素是否存在于set中

语法:

在这里插入图片描述

示例:

在这里插入图片描述


7.2.5 SMEMBERS

获取set中的所有元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述


7.2.6 SINTER

求key1与key2的交集

语法:

在这里插入图片描述

示例:

在这里插入图片描述


7.2.6 SDIFF

求key1与key2的差集
在这里插入图片描述

语法:

在这里插入图片描述

示例:

在这里插入图片描述

在这里插入图片描述


7.2.6 SUNION

求key1与key2的并集

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


8. SortedSet类型


8.1 SortedSet类型介绍

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。

SortedSet具备下列特性

  • 可排序
  • 元素不重复
  • 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能


8.2 SortedSet类型常用命令

SortedSet类型常用命令:

  • ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
  • ZREM key member:删除sorted set中的一个指定元素
  • ZSCORE key member : 获取sorted set中的指定元素的score值
  • ZRANK key member:获取sorted set 中的指定元素的排名
  • ZCARD key:获取sorted set中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max:按照score排序后,获取有序集合中获取指定索引范围内的成员
  • ZRANGEBYSCORE key min max:按照score排序后,获取有序集合中sscore介于指定范围内的成员:
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可


8.2.1 ZADD

添加一个或多个元素到sorted set ,如果已经存在则更新其score值

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


8.2.2 ZREM

删除sorted set中的一个指定元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


8.2.3 ZSCORE

获取sorted set中的指定元素的score值

语法:

在这里插入图片描述

示例:

在这里插入图片描述


8.2.4 ZRANK

获取sorted set 中的指定元素的排名

语法:

在这里插入图片描述

示例:

在这里插入图片描述

在这里插入图片描述


8.2.5 ZCARD

获取sorted set中的元素个数

语法:

在这里插入图片描述

示例:

在这里插入图片描述


8.2.6 ZCOUNT

统计score值在给定范围内的所有元素的个数

语法:

在这里插入图片描述

示例:

准备测试数据:
在这里插入图片描述在这里插入图片描述
开始测试:
在这里插入图片描述


8.2.7 ZINCRBY

让sorted set中的指定元素自增,步长为指定的increment值

语法:

在这里插入图片描述

示例:

在这里插入图片描述


8.2.8 ZRANGE

按照score排序后,获取有序集合中获取指定索引范围内的成员

语法:

在这里插入图片描述

示例:

在这里插入图片描述在这里插入图片描述


8.2.9 ZRANGEBYSCORE

按照score排序后,获取指定score范围内的元素

语法:

在这里插入图片描述

示例:

在这里插入图片描述
在这里插入图片描述


8.2.10 ZDIFF、ZINTER、ZUNION

ZDIFF、ZINTER、ZUNION:求差集、交集、并集

语法:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

示例:

由于Set类型做过详细的测试,所以这里就不做具体的测试了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值