本系列作品持续更新中~
Redis入门到精通【基础篇】【一】
Redis入门到精通【基础篇】【二】
Redis入门到精通【基础篇】【三】
Redis入门到精通【实战篇】【一】
Redis数据结构
Redis
是一个key-value
的数据库,key
一般是String
类型,不过value
的类型多种多样,分为两种,基本类型和特殊类型,基本类型有String
(字符串)、Hash
(哈希类型)、List
(链表)、Set
(集合)和SortedSet
(有序集合),特殊类型有GEO
(地理位置)、BitMap
(位图)等
数据类型 | 可以储存的值 | 操作 | 应用场景 |
---|---|---|---|
String | 字符串、整数或浮点数 | 对整个字符串或整个字符串的一部分执行操作,对整数和浮点数执行自增或自减操作 | 做简单的键值对缓存 |
List | 列表 | 从两端压入或弹出元素,对单个或多个元素进行修剪,只保留一个范围内的元素 | 存储一些列表型的数据结构 |
Set | 无序列表 | 添加、移除、获取单个元素,检查一个元素是否存在于集合中,计算交集、并集、差集,从集合里面随机获取元素 | 交集、并集、差集的操作 |
Hash | 包含键值对的无序散列表 | 添加、获取、移除单个键值对,获取所有键值对,检查某个键是否存在 | 结构化的数据 |
SortedSet | 有序集合 | 添加、获取、删除元素,根据分值范围或者成员来获取元素,计算一个键的排名 | 去重但可以排序 |
Key的层级格式
Redis
的Key
允许多个单词形成层级结构,多个单词之间用:
隔开,格式如下:
[key]:[key]:[key]:[value]
这个格式并非固定,在实际使用中按自己的需求增加或删除词条
例如有个schema
,其下有user
和admin
两种数据类型,我们可以这样定义Key
:
user
相关的Key
:schema:user:[value]
admin
相关的Key
:schema:user:[value]
假如value
是一个Java对象,则可以将对象序列号为Json
字符串后存储,如下所示:
Key | Value |
---|---|
user | {“id”: 1, “name”: “John”, “age”: 20} |
admin | {“id”: 1, “name”: “Mark”, “role”: “superAdmin”} |
Redis命令
我们还可以输入help
命令来获取查看Redis
命令,如下所示:
help [option]
输入help @String
命令获取String
类型分组的命令,如下所示:
help @String
输入help @generic
命令获取通用命令,如下所示:
help @generic
我们还可以输入help [command]
查看一个命令的具体用法
help [command]
通用命令
通用指令是指不分数据类型的,都可以使用的指令,常见的有:
KEYS
对Key
有操作的命令,统一返回值都是非0或者0,成功为非0,失败为0
# 查看符合模版的所有Key,不建议在生产环境设备上使用
KEYS [pattern]
# 上述pattern可以包含通配符,例如KEYS *用于查询所有Key
KEYS *
# 删除指定的Key数据,返回值为成功删除的数量
DEL [key]
# 也可以同时删除多个Key
DEL [key] [key] [key] …
# 判断Key是否存在,存在则返回1,不存在则返回0
EXISTS [key]
# 给一个Key设置有效期,有效期到就会自动删除,单位为秒
EXPIRE [key] [time]
# 查看一个Key的剩余有效期,返回值为剩余有效期,当未对Key设置有效期时,返回值为-1,当设置Key超出有效期时,返回值为-2,其中TTL为Time To Live的缩写
TTL [key]
String类型命令
String
类型,也就是字符串类型,是Redis
中最简单的存储类型,根据字符串格式不同,还可以分为三类:
String
(普通字符串)int
(整数类型),可以做自增和自减操作float
(浮点类型),可以做自增和自减操作
不管哪种格式,底层都是字符数组形式储存,只不过是编码方式不同。字符串的编码类型空间不能超过512m
常见的String
命令有:
# 添加或修改一个String类型的键值对
SET [key] [value]
# 根据Key获取String类型的参数
GET [key]
# 将给定的值,追加到某Key的原值的末尾,返回追加后的字符长度
APPEND [key] [value]
# 查询某key的值的长度
STRLEN [key]
# 批量添加多个String类型的键值对
MSET [key] [value] …
# 批量获取多个String类型的键值对
MGET [key] …
# 让一个整型的Key自增1,返回自增后的结果
INCR [key]
# 让一个整型的Key自减1,返回自减后的结果
DECR [key]
# 让一个整型的Key自增/自减并指定步长,例如INCRBY/DECRBY number 2即让number值自增/自减2
INCRBY/DECRBY [key] [value]
# 让一个浮点类型的Key自增并指定步长
INCRBYFLOAT [key] [value]
# 添加一个String类型的键值对,前提是这个Key不存在,成功则返回1,失败则返回0
SETNX [key] [name]
# 批量添加,当且仅当所有的key都不存在
MSETNX [key] [value] …
# 添加一个String类型的键值对,并且指定有效期
SETEX [key] [time] [value]
# 获取某个key值的范围,例如GETRANGE number 0 2,包含0位置的元素,和2位置的元素
GETRANGE [Key] [Start] [End]
List类型命令
Redis
中的List
类型与Java
中的LinkedList
类似,可以看做一个双向链表结构。既可以支持正向索引也可以支持反向索引,其特征也与LinkedList
类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等
常用的List
命令有:
# 向列表左/右侧插入一个或多个元素
LPUSH/RPUSH [key] [element]
# 移除并返回列表左/右侧的第一个元素,没有则返回null
LPOP/RPOP [key]
# 返回一段角标范围内的所有元素
LRANGE [key] [start] [end]
# 与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
BLPOP/BRPOP [key] [element]
# 按照索引,从左往右获得对应的值
LINDEX [key] [index]
# 获得列表长度
LLEN [key]
# 在某个值的前面/后面添加一个新的值
LINSERT [key] BEFORE/AFTER [value] [newValue]
# 删除n个值为value的数据
LREM [key] [n] [value]
将某个下角标的值换成给定的值
LSET [key] [index] [value]
Hash类型命令
Hash
类型,也叫散列,其value
是一个无序字典,类似于Java
中的HashMap
结构
Hash
结构可以将对象中的每个字段独立存储,可以针对单个字段做CURD
Key | VALUE | |
---|---|---|
field | value | |
schema:user:1 | name | John |
age | 20 | |
schema:user:2 | name | Mark |
age | 25 |
常用的Hash
命令有:
# 添加或修改hash类型key类型的field的值
HSET [key] [field] [value]
# 获取一个hash类型key的field的值
HGET [key] [field]
# 批量添加多个hash类型key的field的值
HMSET [key] [field] …
# 批量获取多个hash类型key的field的值
HMGET [key] [field] …
# 获取一个hash类型的key中所有的field和value
HGETALL [key]
# 获取一个hash类型的key中的所有field
HKEYS [key]
# 获取一个hash类型的key中的所有value
HVALS [key]
# 让一个hash类型key的字段值自增并指定步长,返回追加后的字符长度
HINCRBY [key] [field] [value]
# 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
HSETNX [key] [field]
SET类型命令
Redis
的Set
结构与Java
中的HashSet
类似,可以看做是一个value
为null的HashMap
。因为也是一个hash
表,因此具备与HashSet
类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
常用的Set
类型命令有:
# 向set中添加一个或多个元素,如果值已经存在,忽略该值
SADD [key] [member] …
# 移除set中的指定元素
SREM [key] [member] …
# 得到集合中所有的值
SMEMBERS [key]
# 判断一个元素是否存在于set中,有则返回1,没有则返回0
SISMEMBER [key] [member]
# 返回set中元素的个数
SCARD [key]
# 求key1与key2的交集
SINTER [key1] [key2]
# 求key1与key2的并集
SUNION [key1] [key2]
# 求key1与key2的差集,即key1中有而key2中没有的元素
SDIFF [key1] [key2]
# 把集合中的一个值移动到另一个集合
SMOVE [key1] [key2] [value]
SortedSet类型命令
Redis
的SortedSet
是一个可排序的set集合,与Java
中的TreeSet
有些类似,当底层数据结构却差别很大,SortedSet
中的每一个元素都带有一个score
属性,可以基于score
属性对元素排序,底层的实现是一个SkipList
(跳表)加hash
表,SortedSet
具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet
的可排序特性,经常被用来实现排行榜这样的功能
常用的SortedSet
类型命令有:
# 添加一个或多个元素到sorted set,如果已经存在则更新其score值
ZADD [key] [score] [member] …
# 删除sorted set中的一个指定元素
ZREM [key] [member]
# 获取sorted set中指定元素的score值
ZSCORE [key] [member]
# 获取sorted set中的指定元素的排名
ZRANK [key] [member]
# 获取sorted set中的元素个数
ZCARD [key]
# 统计score值在给定范围内的所有元素的个数,注意最小值和最大值位置不能调换
ZCOUNT [key] [min] [max]
# 让sorted set中的指定元素自增
ZINCRBY [key] [value] [member]
# 按照score排序后,获取指定排名范围内的元素,注意最小值和最大值位置不能调换
ZRANGE [key] [min] [max]
# 按照score排序后,获取指定的score范围内的元素,注意最小值和最大值位置不能调换
ZRANGEBYSCORE [key] [min] [max]
# 求差集、交集、并集
ZDIFF/ZINTER/ZUNION [key1] [key2]
注意,所有的排序默认都是升序,如果要降序则在命令的Z
后面添加REV
即可
本节结束
本系列作品持续更新中~