Redis数据结构
Redis
是一个Key-Value
的数据库,其Key
一般是String
类型,但是Value
的类型多种多样。
这是Redis
中几种常见的数据结构,其中前五种被称为基本类型
,后三种是在基本类型
的基础上创建的,被称为特殊类型
。
不同的数据类型,操作也有差异,我们可以通过查阅官方提供的文档获取不同数据结构的操作方法,也可以在命令行中通过help
命令来获取使用方法:
可以在help
命令后加上该数据结构对应的分组,来获取该数据结构所有的指令:
也可以通过使用help
命令后加上具体的指令,获取该指令的具体用法:
通用命令generic
keys
keys
命令可以查看符合模板(pattern)的所有Key,这个命令必须要指定一个查询的模板:比如*(代表查询所有)
或者A*(代表查询所有以A开头的key)
,但底层是基于模糊查询的,所以说效率相对较低不建议在生产环境设备上使用。假如说Redis
是分布式的,有主有从千万不要在主节点上使用这个命令,否则在在命令运行时会阻塞所有请求。
del
del
命令可以删除一个key
,参数是需要删除的key
,del
命令的参数可以是多个key
,代表批量删除。删除一个key
,会返回一个值,代表删除key
的个数,使用del
命令删除一个不存在的key
时,不会报错。
exists
exists
命令可以判断一个key
是否存在,参数是需要判断的key
,exists
命令的参数可以是多个key
,代表批量判断。判断一个key
,会返回0(代表key
不存在)或者1(代表key
存在)。
expire
expire
命令可以给一个key
设置有效期,有效期到期时该key
会自动删除。这样做的目的是:因为Redis
是基于内存存储数据的,内存十分的宝贵,所以说如果不清除key
,一直存储,总有一天内存会占满。expire
命令后需要的参数是key
和过期时间(单位是秒)。expire
命令通常和ttl
命令一起配合使用,ttl
命令可以查看key
剩余的有效时间,ttl
如果返回-1,则代表该key
是永久存储的,如果返回-2,则代表该key
已经过期。在存储时建议给每一个key
都添加有效时间。
String类型
String类型
,也就是字符串类型,是Redis中最简单的存储类型,其value
是字符串,但根据字符串格式不同,又可以分为3类:String
普通字符串、int
整数类型,可以做自增、自减操作、float
浮点类型,可以做自增、自减操作。但是不管是哪种格式,其底层都是字节数组形式存储,只不过编码方式不同(数字会直接转换为二进制的形式作为字节存储)。字符串类型的最大空间不能超过512m
。
String
的常见命令如上图所示。
Key
的层级格式
Redis
是一个以Key-Value
的键值型数据库
,要求存放数据的Key
必须是唯一的,通常在存储时我们会将存储数据的id
来作为唯一标识以确保Key
的唯一性。但这样会出现一个问题:由于Redis
中没有像MySql
中那样的表(table)的概念(关系型数据库
和非关系型数据库
的区别),所有的数据都是存放于同一个数据库里中,那么该如何区分不同存储数据类型的id?比如存储用户
和商品
信息到Redis
中,此时用户和商品的id
都是1,二者的id
是一样的,都存放在Redis
中就出现了Key
相同的冲突。此时就需要使用到Key
的层级结构。
Redis
中的Key
允许使用多个单词形成层级结构,多个单词需要使用:
进行分隔,其常见格式如下:
项目名:业务名:类型:id
举个例子,项目名叫做外卖
,有user
和order
两种不同的数据,我们就可以这样定义Key
:
外卖:user:1;
外卖:order:1;
当然,这只是一种较为常见的作法,并不一定要像这样定义Key
。
如果存储的Value
是一个Java
对象,则可以将这个对象序列化为Json
字符串之后再进行存储:
Key 外卖:uer:1 Value {"id":1,"name":"jack","age":21}
按照层级构造Key
之后,数据在Redis
中的存储也和Key
的层级一样,这样就可以避免不同数据id
冲突后导致的Key
冲突问题,并且可以让数据存储更加有条理,层次更加明了,推荐存储时都按照层次存储
。