Redis的基本数据类型及常用命令
Redis通用命令
KEYS命令用于查找所有匹配给定模式 pattern 的 key 。生产环境下不建议使用KEYS命令,会影响效率。
匹配规则:
- h?llo 匹配 hello, hallo 和 hxllo
- h*llo 匹配 hllo 和 heeeello
- h[ae]llo 匹配 hello and hallo, 不匹配 hillo
- h[^e]llo 匹配 hallo, hbllo, ... 不匹配 hello
- h[a-b]llo 匹配 hallo 和 hbllo
- 使用 \ 转义你想匹配的特殊字符。
通过KEYS命令返回的结果为数组。下面是Redis中keys命令的简单使用
# 创建一些 key 并赋值
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
# 查找含有 name 的 key
redis> KEYS *name*
1) "firstname"
2) "lastname"
# 查找以 a 为开头长度为 3 的 key
redis> KEYS a??
1) "age"
# redis 获取所有的 key 使用 *。
redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"
DEL命令用于删除给定的一个或多个 key 。不存在的key会被忽略。
DEL语句返回值为被删除的数量,下面是del命令的简单使用
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> SET key3 "redis.com.cn"
"OK"
redis> DEL key1 key2 key3 key4
(integer) 3
EXISTS命令用于检查给定 key 是否存在。
从 Redis 3.0.3 起可以一次检查多个 key 是否存在。这种情况下,返回待检查 key 中存在的 key 的个数。
注意:如果相同的 key 在参数列表中出现了多次,它会被计算多次。所以,如果somekey存在, EXISTS somekey somekey 命令返回 2。
EXISTS命令基本语法如下:
redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2
EXPIRE命令设置 key 的过期时间(seconds)。 设置的时间过期后,key 会被自动删除。
超时时间只能使用删除 key 或者覆盖 key 的命令清除,包括 DEL, SET, GETSET和所有的 *STORE 命令。 对于修改 key 中存储的值,而不是用新值替换旧值的命令,不会修改超时时间。例如,自增 key 中存储的值的 INCR, 向list中新增一个值 LPUSH, 或者修改 hash 域的值 HAST,这些都不会修改 key 的过期时间。
通过使用 PERSIST命令把 key 改回持久的 key,这样 key 的过期时间也可以被清除。
key使用 RENAME 改名后,过期时间被转移到新 key 上。
已经设置过期的key,可以调用 EXPIRE 重新设置。在这种情况下 key 的生存时间被更新为新值。
EXPIRE命令的返回值为两个整数1:设置成功,0:key不存在
EXPIRE 命令基本语法如下:
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> SET mykey "Hello World"
"OK"
redis> TTL mykey
(integer) -1
TTL命令以秒为单位返回 key 的剩余过期时间。用户客户端检查 key 还可以存在多久。
Redis 2.6 之前的版本如果 key 不存在或者 key 没有关联超时时间则返回 -1 。
Redis 2.8 起:
- key 不存在返回 -2
- key 存在但是没有关联超时时间返回 -1
PPTL命令返回以毫秒为单位的剩余超时时间。
该两种命令的返回值都是剩余超时秒数,失败返回负数如上。
Redis的数据类型
Redis中存在很多数据结构,常用的是以下五种:String,Hash,List,set,ScortSet
String字符串类型
根据字符串类型,又可以划分为三种:
- string:普通字符串,比如说hello world
- int:整数类型,可以进行自增,自减。比如说10
- float:浮点类型,可以进行自增,自减。比如说10.1
不管是哪种类型,底层都是字节数组形式存储,只不过编码方式不同,对于纯数字的string类型,底层会采用二进制的方式存储,节省空间。字符串类型最大存储为512MB
常见命令如下
set key value | 添加或修改指定的key值 |
get key | 获取指定key值 |
mset key1 value1 key2 value2 | 批量添加多个String键值对 |
mget key1 key2 | 根据多个key获取多个value |
incr key | 让整型的key的值自增1 |
incrby key size | 让整型的key的值自增并指定步长 |
incrbyfloat key size | 让浮点型的key的值自增并指定步长 |
setnx key value | 如果该key不存在,则添加,存在则不执行 |
setex key seconds value | 添加键值对,并指定有效期 |
为了区分不同业务的存储地址,通常我们会拼接key,一般采用项目名:业务名:类型:id的格式
Hash类型
又叫散列,其value是一个无序字典,类似于Java种的HashMap结构。适合存储对象,因为可以对单个字段进行CURD,并且占用内存更少,如果采用String类型保存Java对象,需要进行序列化JSON形式的字符串,需要保存很多的{} ,: , "" 的符号,而Hash类型不需要保存这些多余的符号。
常用命令如下
hset key field value | 将哈希表key中的字段field的值设置为value |
hget key field | 获取存储在哈希表中的指定字段 |
hmset key field1 value1 field2 value2 | 批量添加多个hash类型的key的field的值 |
hmget key field1 filed2 | 批量获取多个hash类型的key的field的值 |
hgetall key | 获取在哈希表中指定key的所有字段和值 |
hdel key field | 删除存储在哈希表中的指定字段 |
hkeys key | 获取哈希表中的所有字段 |
hvals key | 获取哈希表中的所有值 |
hincrby key field size | 让一个hash类型的key的字段值自增并执行步长 |
hsetnx key field value | 添加一个hash类型的key的field值,如果存在则不执行 |
List类型
Redis种的List类型与Java中的LinkedList类型,可以当作双向链表,既可以支持正向检索也可以支持反向检索。特征也与LinkedList类似
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常见命令如下
lpush key element[element2] | 将一个或者多个值插入到列表头部 |
lpop key | 移除并返回列表左侧第一个元素 |
rpush key element[element2] | 将一个或多个值插入到列表尾部 |
rpop key | 移除并返回列表右侧第一个元素 |
lrange key start end | 获取列表指定范围元素 |
llen key | 获取列表长度 |
brpop[blpop] key timeout | 移除并获取列表的最后一个元素[列表第一个元素],如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
Set类型
Redis的Set结构与Java中的HashSet类似,可以看作是一个value为null的HashMap。因为Set类型本身也是一个hash表,因此具备与HashSet类似的特征
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
常见命令
sadd key member1[member2] | 向集合添加一个或多个元素 |
srem key member1 [member2] | 移除集合中一个或多个元素 |
scard key | 获取集合的元素个数 |
sismember key member | 判断一个元素是否存在于Set |
smembers key | 返回集合中的所有元素 |
sinter key1[key2] | 返回给定所有集合的交集 |
sunion key1 key2 [key3] | 返回所有给定集合的并集 |
sdiff key1 key2 [key3] | 返回给定所有集合的差集 |
ScortSet类型
Redis中的SortSet是一个可排序的Set集合,与Java中的TreeSet相似,但底层实现差别较大,TreeSet是基于红黑树实现,且需要自己编写排序逻辑,而ScoreSet是基于score属性对元素排序,底层实现是一个跳表加hash表。具备以下特性:
- 可排序
- 元素不重复
- 查询速度快
常见命令如下
zadd key score1 member1[score2 member2] | 向集合中添加一个或多个元素或者更新已经存在元素的分数 |
zrank[zrevrank] key member | 获取集合中指定元素的排名[倒序排名] |
zcard key | 获取集合中的元素个数 |
zcount key min max | 统计给定分数值之间的元素个数 |
zincrby key size member | 集合指定的元素的分数自增,并指定增量 |
zrange key start end[withscores] | 通过索引区间返回集合中指定排名范围的元素。如果添加了withscore连同分数一起展示 |
zrangebyscore key min max | 通过score排序后,获取指定分数范围内的元素 |
zrem key member[member] | 移除集合中的一个或多个元素 |
zdiff、zinter、zunion | 求差集、交集、并集 |