《redis入门指南系列》的数据类型

在前面已经介绍了redis的安装,这里介绍一个redis的基本数据类型

传送门

《redis入门指南系列》之linux下安装redis

redis的官方地址:redis,里面有专门的命令介绍

热身

打开redis自带的客户端,redis-cli,输入几个命令来感受一下

KEYS pattern

获得符合规则的键名列表:比如现在要查找redis中所有的键名

KEYS *

会在终端输出所有的键

或者只想输出包含字母k的键,输入*k*,会输出如下

用过正则表达式的应该知道,pattern就是类似这种匹配规则,更多细节:KEYS

符号 含义 样例
? 匹配一个字符

查找ke开头的键:ke?;

查找k开头的3个字符的键:k??

* 匹配任意个(包括0个)字符 上面的KEYS *
[]

匹配括号间的任一字符,可以用-表示范围;

还可以用正则表达式的^,$进行限定

查找h-j开头的键:[h-j]*

查找所有不以k开头的键:[^k]*

\ 用于转义字符 查找含有?的键:*\?*

 

  • KEYS 命令需要遍历redis中的所有键,当键数量较多的时候可能会有性能问题,不建议在生产环境使用
  • redis命令是不区分大小写的,但是建议统一

EXISTS key

返回key是否存在:比如判断key是否存在

EXISTS key

会在终端输出结果:1 如果key存在,0 如果key不存在

更多细节:EXISTS

DEL key

删除指定的一批keys,如果删除中的某些key不存在,则直接忽略:比如删除key

《redis入门指南系列》的数据类型_第1张图片

可以同时删除多个key,DEL KEY1 KEY2 ...返回被删除的keys的数量

更多细节:DEL

TYPE key

返回key所存储的value的数据结构类型,它可以返回stringlistsetzset 和 hash等不同的类型。

刚才的key都被删除完了,现在先插入一个key,再看下它的类型

更多细节:TYPE

数据类型

redis有5种数据类型,分别是

  • 字符串-string
  • 散列-hash
  • 列表-list
  • 集合-set
  • 有序集合-zset

字符串

Redis Strings,这是最简单Redis类型,它能存储任何形式的字符串,包括二进制数据。后面4种数据类型的基础都是字符串。

在热身的时候,用type命令查看过一个键name的类型为string

字符串用以下2个命令设置,获取一个键,这是redis中最简单的命令

SET key value
GET key
  • 值可以是任何种类的字符串(包括二进制数据),例如你可以在一个键下保存一副jpeg图片

  • 值的长度不能超过512 MB

虽然字符串能存储任何类型的数据(不像java这种有基本的类型byte,char,short,int,long,float,boolean,double),但是对于整数,还是可以特殊操作:

递增操作

INCR key

INCR的作用是让当前键值递增,并返回递增后的值。如果当前key不存在,则默认为0,递增后为1。

《redis入门指南系列》的数据类型_第2张图片

如果当前键不是整数,会提示错误

除了INCR进行递增之外,还可以增加,减少指定的整数:INCRBY key increment,DECRBY key increment

《redis入门指南系列》的数据类型_第3张图片

更多细节:INCR

向字符串尾部追加值

APPEND key value

如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作。返回append后字符串值(value)的长度。

《redis入门指南系列》的数据类型_第4张图片

更多细节:APPEND

字符串长度

STRLEN key

返回key的string类型value的长度。如果key对应的非string类型,就返回错误。

同时设置/获取多个键值

MSET key value [key value ...]
MGET key [key ...]

MSET:对应给定的keys到他们相应的values上。MSET会用新的value替换已经存在的value,就像普通的SET命令一样

MGET:返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil

《redis入门指南系列》的数据类型_第5张图片

SETNX

上面介绍了SET,MSET重复设置同一个键,都会对原值进行覆盖,但是在有些情况下,却不需要覆盖,所以需要乃至SETNX。

key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写。

《redis入门指南系列》的数据类型_第6张图片

这个命令在特殊场景很有用,比如可以用来做分布式锁,后续尝试一下。更多细节:SETNX

散列

Hashes,由field和关联的value组成的map。field和value都是字符串的。类似java在Map,也是键值对

比如下面所有的命令都以这个场景为例:存储一个汽车car及对应的一些属性

ID color name price date
1 黑色 奥迪 100W  2020年6月27日
2 白色 哈弗 10W 2020年6月27日

 

取值与赋值

HSET key field value
HGET key field

把上面的2条记录设置进去,先存入奥迪车信息

《redis入门指南系列》的数据类型_第7张图片

批量设置/获取键值

上面那条记录的属性是一个个设置的,其实散列有批量设置的命令

HMSET key field value [field value ...]
HMGET key field [field ...]

用以上命令设置一下哈弗车信息

《redis入门指南系列》的数据类型_第8张图片

获取所有散列键值对

HMGET获取car的所有属性都需要指明,如果不知道car有什么键,可以通过HGETALL查看

《redis入门指南系列》的数据类型_第9张图片

但是这个命令有些缺憾,就是键值对不很直观

更多细节:HMGET

判断字段是否存在

HEXISTS key field

判断car的name是否存在,存在返回1,否则返回0

HEXISTS

删除字段

HDEL key field [field ...]

删除car的name属性,删除成功返回1,失败为0

《redis入门指南系列》的数据类型_第10张图片

更多细节:HDEL

只获取字段名或字段值

HKEYS key
HVALS key

有时仅仅需要字段中所有字段的名字而不需要值,可以使用HKEYS命令

相对应的,可以使用HVALS命令获取所有的字段值

更多细节:HVALS

获取字段数量

HLEN key

获得键的字段个数

列表

按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists)。可以类似相像为java中的List集合

常用的操作是向列表两端添加元素,或者获得列表的某一个片段。列表内部使用双向链表,插入/删除元素速度快,但是查找速度慢一些

向列表两端增加元素

LPUSH key value [value ...]
RPUSH key value [value ...]

列表可以从两端插入元素,LPUSH表示从左边插入,RPUSH表示从右边插入。现在往车队velicle中左边插入auid,haval,右边插入BMW

《redis入门指南系列》的数据类型_第11张图片

从列表两端弹出元素

LPOP key
RPOP key

从列表中弹出一个元素,返回取出的元素,并且会从列表中删除这一个元素,利用这一特性,列表可以当作队列使用

《redis入门指南系列》的数据类型_第12张图片

集合

集合Set,可以类比JAVA中的set。集合中每个元素都是不同的,且没有顺序。

集合和列表相似,但也有不同点,可以对比一下

  集合类型 列表类型
有序性
唯一性

 

增加/删除元素

SADD key member [member]
SREM key member [member]

SADD,添加一个或多个指定的member元素到集合的 key中.指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.如果key 的类型不是集合则返回错误.返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素.

SREM,在key集合中移除指定的元素. 如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.如果key的类型不是一个集合,则返回错误.

《redis入门指南系列》的数据类型_第13张图片

SADD letters a,添加一个元素a,返回1,表示添加成功。再SADD letters a b c,3个元素,由于a已经存在,所以只添加了b c这2个元素,返回2。

《redis入门指南系列》的数据类型_第14张图片

SREM a删除了a元素,并返回1

获得集合中所有元素

上面用到了SMEMBERS命令,表示返回集合所有元素,更多细节:SMEMBERS

判断元素是否在集合中

由于集合底层用的散列hash,所以这个操作速度很快,时间复杂度为O(1)。当值存在时,返回1,反之返回0

更多细节:SISMEMBER

集合间的运算

SDIFF key [key...]
SINTER key [key...]
SUNION key [key...]

redis的集合类型也可以进行数学概念上的集合间运算,分别代表

差集

A-B表示{x|x∈A 且x∉B},这个与数学概念一致

集合A与B做差集,A中有1,2,3的3个元素,集合B有2,3,4的3个元素,1在A中存在而B中不存在,所以A-B是1,反之B-A为4

交集

A∩B表示{x|x∈A 且x∈B},表示集合A,B中的公共元素,为2,3

并集

A∩B表示{x|x∈A 或x∈B},表示集合A,B中的所有元素,为1,2,3,4

《redis入门指南系列》的数据类型_第15张图片

更多参考:SDIFF

有序集合

有序集合跟上面集合的区别就是有序!

增加元素

ZADD key score member [score member]

将所有指定成员添加到键为key有序集合(sorted set)里面。 添加时可以指定多个分数/成员(score/member)对。 如果指定添加的成员已经是有序集合里面的成员,则会更新该成员的分数(scrore)并更新到正确的排序位置。如果key不存在,将会创建一个新的有序集合(sorted set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。

《redis入门指南系列》的数据类型_第16张图片

比如上面一个记分板的例子,记录NBA球星的生涯最高得分。

如果某位球星得分有更新,直接重新设置,会重新覆盖

获得排名在某个范围的元素列表

上面用到ZRANGE 0 -1命令显示所有的元素。索引从0开始,负数表示从后向前查找

ZRANGE key start stop [WITHSCORES]

如果要在获得元素的同时获取分数,在命令尾部加上WITHSCORES。更多命令参考:ZRANGE

《redis入门指南系列》的数据类型_第17张图片

增加某个元素的分数

ZINCRBY key increment member

上面增加Iverson的分数是直接用ZADD更新的,其实还有一个办法就是用INCRBY直接加

《redis入门指南系列》的数据类型_第18张图片

更多参考:ZINCRBY

你可能感兴趣的:(redis)