目录
redis 是按照键值对的方式存储数据的,key 固定就是字符串,value 实际上会有很多类型,比如字符串、哈希表、列表、集合、有序集合等
必须要先进入 redis-cli 客户端程序,才能输入redis 命令
1. redis中最核心的两个命令 get 、set
set :把 key 和 value 存进去;
get :根据 key 来取 value,直接输入 key 就能得到 value,如果当前的 key 不存在,会返回 nil,和 null 是一个意思;
(key 和 value 都是字符串)
2. keys:用来查询当前服务器上匹配的 key
通过一些特殊符号(通配符)来描述 key 的模样,匹配上述模样的key 就能被查询出来
语法:
KEYS pattern
patten 具体是咋写的,支持哪些通配符呢?
?匹配任意一个字符:
*匹配0个或者多个任意字符:
[abcde]只能匹配到 abcde,别的不行,相当于给出固定的选项了:
[^e]排除e,只有e匹配不了,其他的都能匹配:
[a-b] 匹配 a-b 这个范围内的字符,包含两侧边界:
生产环境中,一般都会禁止使用 keys *
(查询 redis 中所有的 key),生产环境上的 key 可能会非常多,而 redis 是一个单线程的服务器,执行keys*
的时间非常长,就使 redis 服务器被阻塞了,无法给其他客户端提供服务
3. exists :判定 key 是否存在
语法:
EXISTS key [key...]
返回值:key 存在的个数
时间复杂度:O(1)
尽量不要分开写,比如:
因为 redis 是一个 客户端 服务器 结构的程序,客户端和服务器之间通过网络来进行通信!分开的写法,会产生更多轮次的网络通信,导致效率比较低,成本比较高(和直接操作内存相比)
4. del:删除指定的 key
语法:
DEL key [key ...]
返回值:删除掉的 key 的个数
时间复杂度:0(1)
del 同样是很危险的操作,要谨慎使用
5. expire:作用是给指定的 key 设置过期时间,key 存活时间超出这个指定的值,就会被自动删除
设置的时间单位是秒
语法:
EXPIRE key seconds
时间复杂度: O(1)
此处的设定过期时间,必须是针对已经存在的 key 设置,设置成功返回 1,设置失败返回 0 。
补充:pexpire key 亳秒(时间单位是毫秒)
6. ttl:查看当前 key 的过期时间还剩多少
补充:pttl,和 pexpire key 亳秒 一样是毫秒级
7. redis 的 key 的过期策略是怎么实现的?[经典面试题]
一个 redis 中可能同时存在很多很多 key,这些 key 中可能有很大一部分都有过期时间,此时, redis 服务器咋知道哪些 key 已经过期要被删除,哪些 key 还没过期?
redis 整体的策略是:定期删除和惰性删除结合
- 定期删除:
每次定期抽取一部分 key ,进行验证过期时间(保证这个抽取检查的过程,足够快)
为啥这里对于定期删除的时间,有明确的要求呢?
因为 redis 是单线程的程序,主要的任务(处理每个命令的任务,扫描过期key )都在一个线程上进行,如果扫描过期key 消耗的时间太多了,就可能导致正常处理请求命令就被阻塞了。(产生了类似于执行 keys * 这样的效果)
- 惰性删除
假设这个 key 已经到过期时间了,但是暂时还没删它,key 还存在,紧接着,后面又一次访问,正好用到了这个 key,于是这次访问就会让 redis 服务器触发删除 key 的操作,同时再返回一个 nil
8. type:返回 key 所对应的 value 的类型
返回值: none , string , list , set , zset , hash and stream 。
时间复杂度:O(1)