redis通用命令
最核心命令:get 和 set
Redis官网
redis是按照键值对的方式存储数据的.
Redis中最核心的两个命令.
- get: 根据key来取value
- 语法:set key value(key和value都是字符串)
- set: 把key和value存储进去
- 语法:get命令直接输入key就能得到value.
对于上述这里的key value,不需要加上引号,就是表示字符串的类型。当然,如果要是给key和value加上引号,也是可以的(单引号或我者双引号都行)。同时redis中的命令不区分大小写。
如果当前key不存在,会返回nil。nil和null/NULL是一个意思
set key1 value1
set key2 value2
set "key3" "value3"
get key1
get key2
get key3
基本全局命令
Redis支持很多种数据结构,指的是一个value可以是一些复杂的数据结构。整体上来说,Redis是键值对结构。key固定就是字符串,value实际上会有多种类型。操作不同的数据结构。就会有不同的命令。
redis的基本数据类型:字符串,哈希表,列表,集合,有序集合。
keys 用来查看匹配规则的key
用来查询当前服务器上匹配的key。通过一些特殊符号(通配符)来描述 key的模样,匹配上述模样的key就能被查询出来。
pattern:包含特殊符号的字符串。有的地方翻译成"样式"或者"模式"。重点去认识这个英文术语。存在的意义,是去描述另外的字符串长啥样的。
patten具体是咋写的,支持哪些通配符呢?
准备工作:
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 1
OK
127.0.0.1:6379> set hbllo 1
OK
127.0.0.1:6379> set hllo 1
OK
127.0.0.1:6379> set heeeeeeeeello 1
OK
案例:
127.0.0.1:6379> keys h[a-b]llo
1) "hallo"
2) "hbllo"-- ?匹配任一字符
127.0.0.1:6379> keys h?llo
1) "hello"
2) "hallo"
3) "hbllo"
-- *匹配0个或者多个任意字符
127.0.0.1:6379> keys h*llo
1) "hello"
2) "hllo"
3) "hallo"
4) "heeeeeeeeello"
5) "hbllo"
-- [abcde]只能匹配到abcde,别的不行.相当于给出固定的选项了
127.0.0.1:6379> keys h[abe]llo
1) "hello"
2) "hallo"
3) "hbllo"
-- [^e]排除e,只有e匹配不了.其他的都能匹配.
127.0.0.1:6379> keys h[^ae]llo
1) "hbllo"
-- [a-b]匹配a-b这个范围内的字符.包含两侧边界.
127.0.0.1:6379> keys h[a-b]llo
1) "hallo"
2) "hbllo"
注意事项:
keys命令的时间复杂度是O(N)。所以,在生产环境上,一般都会禁止使用keys命令.尤其是大杀器keys *
查询redis中所有的key。生产环境上的key可能会非常多,而redis是一个单线程的服务器。执行keys*
的时间非常长,就使redis服务器被阻塞了,无法给其他客户端提供服务。
exists 判定key是否存在
exists:判定key是否存在。
- 返回值: key存在的个数。针对多个key来说,是非常有用的。
- 时间复杂度: O(1)
语法:EXISTS key [key …]
使用:
-- 直接判断两个key是否存在
127.0.0.1:6379> exists hello hallo
(integer) 2
-- 分别判断每个key是否存在
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists hallo
(integer) 1
分开的写法,会产生更多轮次的网络通信。和直接操作内存比,效率比较低,成本比较高。
del 删除指定的key
del (delete): 删除指定的key。可以一次删除一个或者多个.
- 时间复杂度:O(1)
- 返回值:删除掉的key的个数。
语法:DEL key [key …]
使用:
127.0.0.1:6379> del hllo
(integer) 1
127.0.0.1:6379> del hello hallo aaa
(integer) 2
redis主要的应用场景,就是作为缓存。此时redis里存的只是一个热点数据,全量数据是在mysql数据局车中。此时。如果把redis中的key删除了几个,一般来说,问题不大。但是,当然如果把所有的数据或者一大半数据一下都干没,这种影响会很大。本来redis是帮mysql负重前行,redis没数据了,大部分的请求就直接打给mysql然后就容易把mysql搞挂。
如果是把redis作为数据库,此时误删数据的印象就大了。
如果是把redis作为消息队列(mq),这种情况误删数据影响大不下大,就需要具体问题具体分析了。
expire 设置过期时间
expire作用: 给指定的key设置过期时间。设置的时间单位是秒,key存活时间超出这个指定的值,就会被自动删除。
pexpire 的作用和expire是几乎一样的,不同的是单位为毫秒
此处的设定过期时间,必须是针对已经存在的key设置.
- 返回值:设置成功返回1,设置失败返回0.
- 时间复杂度:O(1)
语法:EXPIRE key seconds
-- 添加一个键值对
127.0.0.1:6379> set hello 111
OK
-- 设置过期时间
127.0.0.1:6379> expire hello 10
(integer) 1
-- 获取hello中的值
127.0.0.1:6379> get hello
"111"
-- 过一段时间获取
127.0.0.1:6379> get hello
(nil)
ttl 查询过期时间
ttl(time to live):查看当前key的过期时间还剩多少
pttl:以毫秒为单位
- 时间复杂度:0(1)
- 返回值:剩余过期时间。-1表示没有关联过期时间,-2表示key不存在。
127.0.0.1:6379> expire hello 10
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 6
127.0.0.1:6379> ttl hello
(integer) 5
127.0.0.1:6379> ttl hello
(integer) 3
127.0.0.1:6379> ttl hello
(integer) -2
type 返回key对应的数据类型
此处redis所有的key都是string,key对应的value可能会存在多种类型。
返回值:none,string,list,set, zset, hash and stream(redis作为消息队列的时候,使用这个类型的value)
redis的常用基本数据类型:
时间复杂度:O(1)
使用:
127.0.0.1:6379> set key1 111
OK
127.0.0.1:6379> type key1
string
127.0.0.1:6379> lpush key2 111 222 333
(integer) 3
127.0.0.1:6379> type key2
list
127.0.0.1:6379> sadd key3 111 222 333
(integer) 3
127.0.0.1:6379> type key3
set
127.0.0.1:6379> hset key4 fielf1 vlaue1
(integer) 1
127.0.0.1:6379> type key4
hash
object encoding key
object encoding key: 查看key对应的value的实际编码方式.
127.0.0.1:6379> object encoding key1
"int"
127.0.0.1:6379> object encoding key2
"quicklist"
127.0.0.1:6379> object encoding key3
"intset"
127.0.0.1:6379> object encoding key4
"ziplist"