redis命令官方文档:https://redis.io/docs/
redis中文文档:回头找一下资源,建议能看英文文档就看英文文档
全文概要
set key value //设置一个键值对,key、value均为String类型,可以不加引号
get key //获取key的value值
keys pattern //查询所有符合pattern的key
exists key[key1 key2 ..] //查询key是否存在,可以同多个key
del key[key1 key2 ..] //删除某个键值对,可以同时删除多个键值对
expire key seconds //给key添加过期时间,单位为秒s
pexpire key seconds //给key添加过期时间,单位为毫秒ms
ttl key //查看key的过期时间
type key //查看该键值对vlaue的类型
set&get:
set key value //设置一个键值对,key、value均为String类型,可以不加引号
get key //获取key的value值
Tab键自动补全 ,补全的命令为是大写,一般情况下比较喜欢是用小写命令,读起来更容易一k
全局命令:
什么是全局命令?就是能够搭配任意数据结构使用的命令。
Redis以键值对的形式来在内存中存储数据,key的类型均为String类型,value的类型可以有很多种,Redis中支持很多种数据结构(字符串、哈希表、列表、集合、有序集合)Redis官网列举出来所支持的数据结构类型。操作不同的数据结构就会有不同的命令,有些命令可以搭配任意数据结构来使用,这些就是全局命令。
keys
keys pattern //查询所有符合pattern的key
partten是类似于正则表达式进行样式匹配的字符串,支持一下通配符:
- 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
- ?:可以匹配任意单个字符
- * :可以匹配0个或多个任意字符
- [abc] :可以匹配中括号中的任意一个字符
- [^e]:可以匹配除e以外的任意单个字符
- [a-b]:可以匹配a到b区间之间任意一个字符包括区间两端
keys命令的时间复杂度是O(N)的,为什么呢?
注意事项:一般情况严禁在生产环境/线上环境下使用 keys * 命令,因为生产环境下key可能非常多,而Redis又是单线程的服务器,执行keys *的时间会很长,就会造成Redis服务器阻塞,无法给其他客户提供服务。Redis经常作为缓存挡在MySQL数据的前面,如果因为阻塞查询Redis数据的操作超时了,此时就回去查询从数据中查询,大量的请求涌向数据库服务器,可能导致数据库罢工。
exists
exists key[key1 key2 ..] //查询key是否存在,可以同多个key
返回key存在的个数,时间复杂的为O(1)
Redis以键值对的形式将数据存储在内存中,key是唯一的,两次key值相同的set命令,第二次的value值会覆盖第一次的value值。Redis中的键值对是通过哈希表的方式来组织的,因此查询某一个key的时间复杂度是O(1),因为exists支持同时查询多个key,所以官网标注的时间复杂度为O(N),这个N指的是一次查询key的规模。
Redis是客户端/服务器结构的程序,客户端和服务器是通过网络进行通信的。每一次命令执行,客户端都会向服务器端发起http请求如果将exists key[key1 key2 ..]分开写的话会产生多次网络通信,网络通信慢的原因之一在于数据的封装和分用。发送方发送一个数据,这个数据共应用层,到物理层,层层封装。接收方收到一个数据,从物理层到应用层,层层分用,而且网络通信的速度还会受到距离的影响。Redfis本也清楚支个问题,因此它的很多命令都支持一次操作多个key.
del
del key[key1 key2 ..] //删除某个键值对,可以同时删除多个键值对
返回删除key的个数,时间复杂的为O(1)
MySQL中删库删表都是比较危险的操作,Redis中的删除命令也需要谨慎使用,一般情况下当redis充当缓存的时候,存储的仅是热点数据,删除之后依然可以从数据库(全量数据)中加载回来,影响不大;当Redis充当数据库是,存储的数据就无法恢复了,影响会比较大;Redis充当消息队列的时候,具体情况还需要具体分析,总之谨慎使用删除命令,不要乱删数据。
expire & pexire
expire key seconds //给key添加过期时间,单位为秒s
成功返回1,失败返回0,时间复杂度为O(1)
应用场景还是比较广泛的,比如手机验证码一般有效期为五分钟、优惠券的指定时间内有效等等。
pexpire key seconds //给key添加过期时间,单位为毫秒ms
ttl
ttl key //查看key的过期时间
type
type key //查看该键值对vlaue的类型
时间复杂度:O(1)
返回值: none , string , list , set , zset , hash and stream。
在redis中上述类型的操作方式差别很大,使用的命令都完全不同,本片主要介绍的是一些全局命令,可以搭配任意类型使用
Redis中key的删除策略
Redis中有很多的键值对数据,其中绝大部分都有过期时间,此时Redis怎么知道那些需要key过期了,那些没有过期呢?如果全部遍历一遍效率是比较低的,而且存在和 keys * 同样的问题,导致redis服务阻塞。
redis的整体策略是:
- 定期删除——每次抽取一部分验证过期时间,这个过程要保证足够快才行。
- 惰性删除——假设key过期了,但是并没有及时删除,而是当key被访问的时候先判断一下有没有过期,如果过期就删除并返回nil
上述两种策略的效果一般,仍然可能会有很多过期的key占据内存没有及时删除,为此redis还提供了一种内存淘汰策略~~(挖坑)
关于定时删除:
redis低版本是单线程的,高版本中引入了多线程。对于单线程的redis而言,并没有使用定时器对key进行定时删除。因为使用定时器就势必要使用多线程。