目录
redis命令不区分大小写的
要使用redis命令,需要先输入redis-cli进入redis客户端
redis是按照键值对的方式存储数据的,redis最核心的两个命令:
get:根据key来取value
set:把key和value存储进去
set(存储key和value)
格式如下:
set key value
其中key和value都是字符串,不需要加上引号,加上的话也可以
get (通过key获取value)
格式如下:
get key
如果查询不存在的key,会返回一个nil
redis 有5中数据结构,但他们都是键值对中的值,对于键来说有一些通用的命令。
KEYS(查找符合样式的key)
返回所有满足样式(pattern)的key,例如
- h?llo 匹配 hello,hallo,hxllo
- h*llo 匹配 hllo,heeeello
- h[ae]llo 匹配hello 和 hallo,不匹配hillo
- h[^e]llo匹配hallo,hbllo,但不匹配hello
- h[a-b]llo 匹配hallo和hbllo
语法:
keys pattern
- ?匹配任意一个字符
- *匹配0个或者多个任意字符
- [abcde]只能匹配abcde,别的不行
- [^e]排除e
- [a-b]匹配a-b这个范围内的字符
keys命令的时间复杂度是O(N),所以,在生产环境上,一般禁止使用
exists(判断key是否存在)
判断某个key是否存在
语法:
exists key [key ...]
后面可以跟一个key,也可以跟多个,至少要有一个
时间 复杂度O(1),返回值是key存在的个数。
- redis支持很多数据结构,指的是一个一个value可以是一些复杂的数据结构。
- redis自身的这些键值对,是通过哈希表的方式来组织的。
- redis具体的某个值又可以是一些数据结构。
查询的时候,分开查询,需要向服务器进行两个轮次的网络通信,因此会比较慢 。
del(删除key)
删除指定的key。
语法:
del key [key ..]
可以删除一个或者多个
时间复杂度:O(1)
返回值:删掉的key的个数 。
redis中误删除一个两个key问题不大,因为redis大部分是作为缓存,存储热点数据,mysql中存有全量的数据,但是不能全删或者删除大量,这样所有请求都直接去找mysql,容易把mysql搞挂了。
expire(给key设置过期时间)
给指定的key设置过期时间。设置的时间单位是秒,key的存活时间超过过期时间,会自动删除。
语法:
expire key seconds
时间复杂度:O(1);
返回值:1表示设置成功,0表示设置失败。
pexpire可以设置的时间单位是毫秒,语法与expire一致。
ttl (查询key的过期时间)
获取指定key的过期时间,秒级。
语法:
ttl key
时间复杂度:O(1);
返回值:剩余过期时间,-1表示没有关联过期时间,-2表示key不存在
pttl可以查看pexpire
reids 的过期策略是怎么实现的?
一个redis中可能同时存在很多很多key,这些key中可能有很大一部分都有过期时间,此时,服务器咋知道哪些key已经过期要被删除,哪些key还没过期?
如果直接遍历所有的key,显然是行不通的,效率非常低。redis整体的策略是:
- 定期删除
- 惰性删除
惰性删除:假设这个key已经到过期时间了,但是暂时还没删它,key还存在,紧接着,后面又一次访问,正好用到了这个key,于是这次访问就会让redis服务器触发删除key的操作,同时再返回一个nil。
定期删除:每次抽取一部分,进行验证过期时间,抽取一部分保证抽取检查的过程足够快,这里要保证速度快的原因是因为redis是单线程的程序,主要的任务是处理每一个命令的任务,如果扫描key的时间太多了,就可能导致正常处理请求命令就被阻塞了。
虽然有了上述两种策略结合,整体的效果一般,仍然可能会有很多过期的key残留,没有及时删除。
type(查询key对应的value的数据类型)
返回key对应的数据类型。
此处redis所有的key都是string,key对应的value可能存在多种类型
语法:
type key
时间复杂度O(1)