丰富的数据类型是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中所有的键。
注意:keys命令需要遍历Redis中的所有键,当键的数量较多时会影响性能,不建议在生产环境中使用。
1.2 判断一个键是否存在
exists key [key ...]
如果键存在则返回1,否则返回0。比如:
1.3 删除某个键
del key [key ...]
删除一个或多个键,返回值是删除的键的个数。比如:
1.4 获取键值的数据类型
type key
type
命令用来获得键值的数据类型,返回值可能是string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset( 有序集合类型)。比如:
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的所有字段值,可对比 |
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——