丰富的数据类型是Redis作为缓存系统的最大优势之一,区别于Memcache仅支持简单的key-value类型,Redis提供了list、set、zset、hash等数据结构的存储。

注意:Redis的命令不区分大小写,但是key 严格区分大小写!!!

1. 热身

1.1 获取符合规则的键名列表

keys pattern

pattern是一个支持glob风格的通配符格式,具体规则如下:

符号

含义

?

匹配一个字符

*

匹配任意个字符,包括0个

[]

匹配括号间的任一字符,可是使用“-”符号表示一个范围,比如a[b-d]可以匹配“ab”、“ac”、“ad”。

\x

匹配字符x,用于转义符号。如果要匹配“?”,就需要使用?

  • 案例

我们先往Redis中塞几个键值对:

set color red
set name zhangsan
set age 18

然后使用keys *命令查看获取Redis中所有的键。

redis获取key对应的所有values redis获取key类型_数据类型

注意:keys命令需要遍历Redis中的所有键,当键的数量较多时会影响性能,不建议在生产环境中使用。

1.2 判断一个键是否存在

exists key [key ...]

如果键存在则返回1,否则返回0。比如:

redis获取key对应的所有values redis获取key类型_Redis_02

1.3 删除某个键

del key [key ...]

删除一个或多个键,返回值是删除的键的个数。比如:

redis获取key对应的所有values redis获取key类型_Redis_03

1.4 获取键值的数据类型

type key

type命令用来获得键值的数据类型,返回值可能是string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset( 有序集合类型)。比如:

redis获取key对应的所有values redis获取key类型_Redis_04

2. string数据类型

字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。比如邮箱、JSON化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是512MB。

string类型在Redis中的相关命令:

命令

用法

描述

set

set key value

(1)将字符串value值设置到key上;

(2)如果key有对应的值,则会被覆盖;

(3)如果原本key有过期时间,则过期时间会被清除。

get

get key

(1)返回key对应的字符串值;

(2)如果key无对应值,则返回nil;

(3)如果key对应的值不是字符串,则返回错误,因为get只适用于字符串类型。

mset

mset key value [key value …]

(1)同时设置一个或多个key-value键值对;

(2)如果key有对应的值,则会被覆盖;

(3)mset是一个原子操作,所有的key都会在同一时间被设置,不会存在有些更新有些没更新的情况。

mget

mget key [key …]

(1)返回一个或多个给定key对应的值;

(2)某个key不存在时返回nil。

setex

setex key seconds value

(1)将字符串value值设置到key上;

(2)设置key生存时间为seconds,单位为秒;

(3)如果key有对应的值,则会被覆盖。

setnx

setnx key value

(1)将key的值设置为value,当且仅当key不存在;

(2)若给定的key已经存在,setnx将不做任何操作。

上面是string类型的基本命令,但是当一个字符串可以转换成数值时,我们可能还会接触到以下几个自增自减操作。

命令

用法

描述

incr

incr key

(1)对key的值加1,返回增加之后的值;

(2)如果key不存在,则key会被初始化为0,再执行incr操作。

decr

decr key

(1)对key的值减1。

incrby

incrby key increment

(1)将key所存储的值加上指定的数值,并返回增加之后的值。

decrby

decrby key decrement

(1)将key的值减去一个指定的数值。

3. hash数据类型

我们知道Redis是采用字典结构以键值对的形式存储数据的,而hash类型的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其它数据类型。

hash类型适合存储对象:使用对象类型和对象唯一标识作为key,使用对象属性作为字段名,属性值作为字段值。

命令

用法

描述

hset

hset key field value

(1)设置key的field值为value;

(2)如果key不存在,则直接创建;

(3)如果field值已经存在,则直接覆盖。

hget

hget key field

(1)获取指定key和field的值。

hdel

hdel key field [field …]

(1)删除key下的field值;

(2)如果field不存在,则直接忽略。

hexists

hexists key filed

(1)查看是否存在指定key的field,存在返回1,不存在返回0。

hgetall

hgetall key

(1)返回指定key的所有字段名和字段值。

hincrby

hincrby key field increment

(1)对指定key的field字段增加一个数值。

hkeys

hkeys key

(1)返回指定key的所有字段名。

hlen

hlen key

(1)返回指定key的所有字段名数量。

hmget

hmget key field [field …]

(1)返回指定key对应字段名的值。

hmset

hmset key field value [field value …]

(1)批量设置key的字段名和字段值。

hvals

hvals key

(1)返回指定key的所有字段值,可对比hkeys命令。

4. list数据类型

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。

列表类型内部使用双向链表实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度越快。但是使用链表的代价是通过索引访问元素比较慢。

命令

用法

描述

lpush

lpush key value [value …]

(1)将一个或多个值插入到列表key的表头;

(2)如果有多个value值,则从左到右的顺序依次插入表头;

(3)如果key不存在,则会创建一个空列表,然后执行lpush操作;如果key存在,但不是列表类型,则返回错误。

lpushx

lpushx key value

(1)将value值插入到列表key的表头,当且仅当key存在且是一个列表;

(2)如果key不存在时,lpushx命令什么都不会做。

lpop

lpop key

(1)移除并返回列表key的头元素。

lrange

lrange key start stop

(1)返回列表key中指定区间内的元素;

(2)start大于列表最大下标时,返回空列表;

(3)可使用负数下标,-1表示列表最后一个元素,以此类推。

lrem

lrem key count value

(1)count>0表示从头到尾搜索,移除与value相等的元素,数量为count;

(2)count<0表示从尾到头搜索,移除与value相等的元素,数量为count;

(3)count=0表示移除列表中所有与value相等的元素。

lset

lset key index value

(1)将列表key下标为index的元素值设置为value;

(2)当index参数超出范围,或对一个空列表进行lset操作时,返回错误。

lindex

lindex key index

(1)返回列表key中下标为index的元素。

linsert

linsert key BEFORE|AFTER pivot value

(1)将值value插入列表key中,位于pivot前面或者后面;

(2)当pivot不存在列表key中,或者key不存在时,不执行任何操作。

llen

len key

(1)返回列表key的长度,当key不存在时,返回0。

rpop

rpop key

(1)移除并返回列表key的尾元素。

rpoplpush

rpoplpush source destination

(1)将列表source中最后一个元素弹出并返回给客户端,并且将该元素插入到列表destincation的头部。

rpush

rpush key value [value …]

(1)将一个或多个值插入到列表key的尾部。

rpushx

rpushx key value

(1)将value值插入到列表key的表尾,当且仅当key存在且是一个列表;

(2)如果key不存在时,lpushx命令什么都不会做。

5. set数据类型

Redis中的set类型是string类型的无序集合。集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在Redis内部是使用值为空的散列表实现的,所以这些操作的时间复杂度都是O(1)。最方便的是多个集合类型键之间还可以进行并集、交集和差集运算。

命令

用法

描述

sadd

sadd key member [member …]

(1)将一个或多个member元素加入key中,已存在在集合中的member将被忽略;

(2)如果key不存在,则创建一个只包含member元素的集合;

(3)当key不是集合类型时,将返回一个错误。

scard

scard key

(1)返回key对应的集合中的元素数量。

sdiff

sdiff key [key …]

(1)返回所有key对应的集合的差集。

sdiffstore

sdiffstore destionation key [key …]

(1)返回所有key对应的集合的差集,并把该差集赋值给destionation;

(2)如果destionation已经存在,则直接覆盖。

sinter

sinter key [key …]

(1)返回所有key对应的集合的交集;

(2)不存在的key被视为空集。

sinterstore

sinter destionation key [key …]

(1)返回所有key对应的集合的交集,并把该交集赋值给destionation;

(2)如果destionation已经存在,则直接覆盖。

sismember

sismember key member

(1)判断member元素是否是key的成员,0表示不是,1表示是。

smembers

smember key

(1)返回集合key中的所有成员;

(2)不存在的key被视为空集。

srem

srem key member [member …]

(1)移除集合key中的一个或多个member元素,不存在的member将被忽略。

sunion

sunion key [key …]

(1)返回所有key对应的集合的并集;

(2)不存在的key被视为空集。

sunionstore

sunionstore destionation key [key …]

(1)返回所有key对应的集合的并集,并把该并集赋值给destionation;

(2)如果destionation已经存在,则直接覆盖。

6. zset数据类型

zset类型也是string类型元素的集合,但是它是有序的。

命令

用法

描述

zadd

zadd key score member [score member …]

(1)将一个或多个member元素及其score值加入集合key中;

(2)如果member已经是有序集合的元素,那么更新member对应的score并重新插入member保证member在正确的位置上;

(3)score可以是整数也可以是双精度浮点数。

zcard

zcard key

(1)返回有序集的元素个数。

zcount

zcount key min max

(1)返回有序集key中,score值>=min且<=max的成员数量

zrange

zrange key start stop [withscores]

(1)返回有序集key中指定区间内的成员,成员位置按score从小到大排序;

(2)如果score值相同,则按字典排序;

(3)如果要使成员按score从大到小排序,则使用zrevrange命令。

zrank

zrank key number

(1)返回有序集key中成员member的排名,有序集合按score值从小到大排列;

(2)zrevrank命令将按照score值从大到小排序。

zrem

zrem key member [member …]

(1)移除有序集key中的一个或多个元素,不存在的元素将被忽略;

(2)当key存在但不是有序集时,返回错误。

zremrangebyrank

zremrangerank key start stop

(1)移除有序集key中指定排名区间内的所有元素。

zremrangebyscore

zremrangescore key min max

(1)移除有序集key中所有score值>=min且<=max之间的元素。

——End——