文章目录
一、Redis数据结构
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
基本类型:String、Hash、List、Set、Zset
特殊类型:GEO、BitMap、HyperLog等
- String:
Hello world
- Hash
{name:"cy", age:"25"}
- List
[A -> B -> C -> C]
- Set
{A, B, C}
- Zset
{A:1, B:2, C:3}
- GEO
{A:(120.3,30.5)}
- BitMap
0110110101110101011
- HyperLog
0110110101110101011
二、Redis通用命令
通用命令是部分数据类型的,都可以使用的指令,常见的有:
- KEYS:查看符合模板的所有key
通过help[command]可以查看一个命令的具体用法,例如:
help keys
命令行会显示KEYS用法
KEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic
KEYS * 查询所有,支持通配符”*“查询
- DEL:删除一个指定的key
通过help[command]可以查看一个命令的具体用法,例如:
help DEL
命令行会显示DEL用法
DEL key [key ...]
summary: Delete a key
since: 1.0.0
group: generic
DEL k1 k2 k3 支持删除多个key值
- EXISTS:判断key是否存在
EXISTS k1
命令行会显示是否存在,存在则返回1,不存在返回0
(integer) 0
- EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
设置k1 20秒有效期
EXPIRE k1 20
可以通过TTL命令查看key剩余时间,如果没有设置有效时间,则会返回-1,代表永久有效
TTL k1
- TTL:查看一个KEY的剩余有效期
TTL key
三、String类型
3.1 String类型,也就是字符串类型,是Redis中最简单的存储类型。
其value是字符串,不过根据字符串的格式不同,又可以分为3类:
- string:普通字符串
- int:整数类型,可以做自增、自减操作
- float:浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m
KEY | VALUE |
---|---|
msg | hello world |
num | 10 |
score | 90.5 |
3.2 String类型的常见命令
String类型的常见命令有:
- SET:添加或者修改已经存在的一个String类型的键值对
- GET:根据key获取String类型的value
- MEST:批量添加多个String类型的键值对
- MGET:根据多个key获取多个String类型的value
- INCR:让一个整形的key增1
- INCRBY:让一个整形的key自增并指定步长,例如:incrby age 2 让age值增2
- INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
- SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
- SETEX:添加一个String类型的键值对,并且指定有效期
四、Redis-key的层级格式
4.1 key的结构
Redis的key允许有多个单词形成层级结构,多个单词之间用’:'隔开,格式如下:
项目名:业务名:类型:id
这个格式并非固定,可以根据自己的需要来删除或添加词条。
例如我们的项目名叫做study,有user和order两种不同类型的数据,我们可以这样定义key:
- user相关的key:study:user:11
- order相关的key:study:order:11
如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:
KEY | VALUE |
---|---|
study:user:11 | {“id”:1, “name”:“cy”, “age”:“25”} |
study:order:11 | {“id”:1, “name”:“华为出口订单”, “price”:“500000”} |
- String 类型的三种格式
- 字符串
- int
- float
- Redis的key的格式
- 【项目名】:【业务名】:【类型】:【id】
五、Hash类型
Hash类型,也叫散列,其Value是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段很不方便:
KEY | VALUE |
---|---|
study:user:11 | {“id”:1, “name”:“cy”, “age”:“25”} |
study:order:11 | {“id”:1, “name”:“华为出口订单”, “price”:“500000”} |
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段CRUD:
KEY | VALUE | |
---|---|---|
field | value | |
study:user:11 | name | cy |
age | 25 | |
study:order:11 | name | 华为出口订单 |
price | 500000 |
5.1 Hash类型的常用命令
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中的所有value
- HINCRBY:让一个hash类型key的字段值自增并指定步长
- HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
六、List类型
Redis中的List类型与Java中的LinkedList类似,可以看作是一个双向链表结构。既可以支持正向检索也可以支持反向检索。
特征也与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表、评论列表等。
6.1 List类型的常见命令
List的常见命令有:
- LPUSH key element …:向列表左侧插入一个或多个元素
- LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
- RPUSH key element…:向列表右侧插入一个或多个元素
- RPOP key:移除并返回列表右侧的第一个元素
- LRANGE key star end:返回一段角标范围内的所有元素
- BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
group: list
获取对应key左侧第一个元素,且超时时间为10s,如果没有元素则阻塞10s,有则返回并删除该元素
BLPOP list1 10
获取对应key右侧第一个元素,且超时时间为10s,如果没有元素则阻塞10s,有则返回并删除该元素
BRPOP list1 10
6.2 举例
6.2.1 如何利用List结构模拟一个栈?
- 入口和出口在同一边,先进后出,用LPSH、LPOP或者RPUSH、RPOP
6.2.2 如何利用List结构模拟一个队列?
- 入口和出口在不同边,先进显出,用LUSH、RPOP或者RPUSH、LPOP
6.2.3 如何利用List结构模拟一个阻塞队列?
- 入口和出口在不同边,先进后出,用LUSH、BRPOP或者RPUSH、BLPOP
七、Set类型
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
7.1 Set类型的常见命令
Set的常见命令有:
- SADD key member …:向Set中添加一个或多个元素
- SREM key member …:移除set中的指定元素
- SCARD key:返回Set中元素的个数
- SISMEMBER key member:判断一个元素是否存在于Set中
- SMEMBERS key:获取Set中的所有元素
- SINTER key1 key2:求key1与key2的交集
- SDIFF key1 key2:求key1与key2的差集
- SUINON key1 key2:求key1与key2的并集
八、Zset类型
Redis的Zset是一个可排序的Set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。Zset的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加Hash表。
Zset具备以下特性:
- 可排序
- 元素不重复
- 查询速度快
因为Zset的可排序性,经常被用来实现排行榜这样的功能。
8.1 Zset类型的常见命令
ZSet的常见命令有:
- ZADD key score member:添加一个或多个元素到Zset,如果已经存在则更新其score值
- ZREM key member:删除ZSet中的一个指定元素
- ZSCORE key member:获取Zset中的指定元素的score值
- ZRANK key member:获取ZSet中的指定元素的排名
- ZCARD key:获取ZSet中的元素个数
- ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
- ZINCRBY key increment member:让ZSet中的指定元素自增,步长为指定的increment值
- ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
- ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
- ZDIFF、ZINTER、ZUINON:求差集、交集、并集
注意: 所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可。例如:ZREVRANGE key min max