Redis-基本命令
Redis是单线程的,有5中数据结构,分别为:String(字符串),hash(哈希),list(列表),set(集合),zset(有序集合),都是键值对的值,redis的命令非常多,对于键来说有一些通用的命令:
进入Redis客户端命令:redis-cli
keys:
语法: keys pattern
查询当前服务器上匹配的key。
通过一些特殊的符号(通配符)来描述key的模样,匹配上述模样的key就能被查询到。
时间复杂度:O(N)
返回值:匹配pattern的所有key
pattern的匹配方式:
?:匹配任意单个字符
* :匹配0个或多个任意字符
[abc]:给出固定选项,只能匹配abc,别的不行;
[^a]:只有a匹配不了,别的都可以匹配
[a-e]:匹配a到e这个范围内的字符,包含两侧边界(闭区间)
注意:在实际的生产环境中,要切记使用 keys * 这个命令,当查询到的数据量太大时,可能会使Redis服务器阻塞。
set:
语法:set key value
作用:Redis是按照键值对的方式存储数据的,用来存储key和value,类型都是String,不需要加双引号。
get:
语法:get key
作用:通过key获取value,当key不存在时,会返回nil(Redis中的nil就是NULL的意思)
exists:
判断某个key是否存在。
语法:exists key [key...]
时间复杂度: O(1)
返回值:key存在的个数
del:
作用:删除指定的一个或多个key
语法: del key [key...]
时间复杂度:O(1)
返回值:删除掉key的个数
expire:
作用:为指定的key设置秒级别的过期时间
语法: expire key seconds
时间复杂度:O(1)
返回值:1:设置成功,0:设置失败
应用场景:手机验证码,优惠券到期时间
ttl:
作用:获取指定key的过期时间
语法: ttl key
时间复杂度:O(1)
返回值:剩余秒级过期时间,-1:没有关联过期时间,-2:key不存在
redis的key的过期策略是怎样实现的?
一个redis中可能存在多个key,每次删除遍历一遍的成本较高,redis的整体过期策略有2种:
1.定期删除:每次抽取部分进行验证过期删除;保证每次抽区检查的时间足够快。
(为啥要保证快呢?因为redis是单线程的,若太长时间去扫描过期的key,就可能导致正常处理请求的命令被阻塞,产生类似于keys *的效果)
2.惰性删除:当这个key已经到达过期时间了,但是还没有被删除,当一个请求访问到这个过期的key时,就会触发Redis的删除机制,服务器执行删除key的操作,同时再返沪i一个nil;
Redis结合上述两种删除策略,还提供了一系列的内存淘汰策略。
有讨论说redis是通过 定时器的方式来实现过期key的删除,但这是不可能的,因为定时器需要需要基于优先级队列(过期时间越早,优先级越高,仅关注队手元素即可),或时间轮 (将时间划分成很多的小段,每个小段上挂着一个链表,每个链表代表一个要执行的任务,让时间轮转动,通过指针进行扫描)来实现,但这两种方式都要引入多线程,而redis是单线程的。
type:
作用:返回key对应的数据类型
语法:type key
时间复杂度: O(1)
返回值:none,string,list,set,zset,hash,stream,
Redis是单线程的,当多个客户端Redis的命令到达服务端时,需要在队列中排队,等待redis服务器一个一个的去取出来里卖弄的命令再执行,微观上redis服务器是串行执行多个命令的。