Redis基础 -- Redis数据结构Redis通用命令Redis 的 key 的层次结构Redis5种数据类型及基本命令(StringListHashSetSortedSet)
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis基础 -- Redis数据结构Redis通用命令Redis 的 key 的层次结构Redis5种数据类型及基本命令(StringListHashSetSortedSet)相关的知识,希望对你有一定的参考价值。
文章目录
- 1. Redis数据结构
- 2. Redis通用命令
- 3. String类型
- 4. Redis 的 key 的层次结构
- 5. Hash类型
- 6. List类型
- 7. Set类型
- 8. 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 )
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结构模拟一个阻塞队列?
- 入口和出口在不同边
- 出队时采用BLPOP或BRPOP
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类型做过详细的测试,所以这里就不做具体的测试了。
以上是关于Redis基础 -- Redis数据结构Redis通用命令Redis 的 key 的层次结构Redis5种数据类型及基本命令(StringListHashSetSortedSet)的主要内容,如果未能解决你的问题,请参考以下文章