目录
Redsi最核心的命令(set和get)
redis不区分大小写
1.set
set
存储一个键值对
这里的K-V不需要加引号,就是表示字符串的类型(加上引号也可以)
2.get
get [key]
通过key,获取value
如果不存在,显示(nil)
redis是键值对结构,key固定是字符串,但是value有多种类型:
字符串,哈希表,列表,集合,有序集合
操作不同的数据结构,就会有不同的命令
全局命令(通用命令)
1. keys (按照匹配规则查看key)
keys pattern
pattern: 包含特殊符号的字符串
用来筛选字符串的
-
? 匹配任意一个字符 * 匹配0个或多个任意字符
-
[abcd] 只能匹配到abcd别的不行
-
[^e] 排除e,只有e匹配不了,其他都可以匹配
-
[a-b] 包含a,b两个边界,匹配a-b范围内的字符串
注意事项:
keys的时间复杂度是0(N),在生产环境上,一般都会禁止使用 keys 命令,尤其是 keys *
生产环境上的key可能会非常多,而redis是一个单线程的服务器,执行 keys * 的时间非常长,就使redis 服务器被堵塞了,无法给其他客户端提供服务
这样的后果,可能是灾难性的!!!
2.exists(用来判断指定key是否存在)
exists key[key ...]
- 判断key是否存在 返回值:key存在的个数
- 时间复杂度:O(N) 检查几个key,就是几
3.del(删除指定的key)
del key [key ...]
4.expire(给key设置过期时间)
expire的作用是给key设置时间(很多业务场景,是有时间限制的,比如说验证码和点外卖时优惠卷失效,超过时间自动失效)
基于redis实现分布式锁,为了避免不能正常解锁的情况,通常都会在加锁的时候设置一下过期时间(所谓的使用redis作为分布式锁,就是给redis里写一个特殊的 key value)
expire key second
pexire key 毫秒
5.ttl(查看key的过期时间)
time ti live
IP协议报头有一个终端 TTL,用次数衡量过期的
这里的TTL查看key的过期时间还有多少
ttl key
reidis的key的过期策略怎么实现的?
如果直接遍历所以的key,效率低,占用CPU高
- 定期删除: 超市老板每各一次检查商品有没有过期,但是效率很低,太多商品了,使用随机抽取一部分,进行验证过期时间,保证这个抽取检查的过程足够快(redis是一个单线程的程序,主要任务是处理命令,如果扫描过期key消耗的时间太多了,就可能导致正常处理请求命令就被堵塞了,产生了类似于 keys * 这样的效果)
错误的说法:
定时删除:
含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
优点:保证内存被尽快释放
缺点:如果过期的key很多,删除这些key 会占用很多的CPU时间,在CPU不能把所有的时间来做要紧的事,还有花时间去删除这些key;定时器的创建耗时,如果为每一个设置过期时间的key创建一个定时器,将会有大量的定时器产生,性能影响严重;使用没人用
1.redis中并没有采取定时器的方式来实现过期key删除
2.如果有对个key过期,也可以通过一个定时器在高效/节省CPU的前提下处理多个key (基于优先级队列或者基于时间轮实现比较高效的定时器) - 惰性删除:假设key已经到过期时间了,但是暂时还没删它,key还存在,但是后面一次的访问这个key,于是访问redis服务器触发删除key的操作,同时在返回一个 nli
(买出这个商品的时候做出检查,顾客买商品在准备付钱是发现过期,商店撤回了一次卖出)
上述两种策略结合,整体的效果一般,仍然可能还有很多过期的key被残留了
redis为了对上述进行补充,还提供了一系列的·内存淘汰策略。
定时器的比较高效的实现方式
:
1.基于优先级队列/堆 : 在redis的场景中,就可以通过“过期的时间越早,就是优先级越高”
key1:12:00
key2:13:00
key3:14:00
…
此时定时器只要分配一个线程,让这个线程去检查队首元素,看是否过期即可!
此时扫描线程不需要遍历全部全部key
根据当前时刻和队首元素的过期时间,设置一个等待 :当时间差不多到了,系统在唤醒(在新任务添加的时候,主动唤醒,根据时间程序调整)这个线程,此时扫描线程不需要高频扫描队首元素
2.基于时间轮实现定时器:
把时间划分为很多小段(划分力度看需求)
6.type(查询key对应的value类型)
redis所有的key都是string类型,key对应的value可能会存在多种类型
type key
redis的所有指令在官网都可以查到其对应的文档,文档中对各个指令的用法,注意事项有明确的定义
官网:redis