文章目录
- 读取文档注意事项
- set命令
- get命令
- 全局/通用命令
- KEYS
- EXISTS
- DEL
- EXPIRE
- TTL
- TYPE
读取文档注意事项
官方文档链接:https://redis.io/
注意:redis的命令不区分大小写
在redis文档给出的语法格式说明:
[]
:相当于一个独立的单元,表示可选项,可有可无,[]
和[]
之间可以同时存在
|
:或者的意思,多个只能出现一个
关于O(N)
N可以表示的含义:
- 1.redis当中key的个数
- 2.当前命令当中写的key的个数 =>此时可以看作是O(1)
- 3.当前key对应的value里面的元素个数
关于有序
1.指的是 升序 / 降序
2.指的是顺序很关键,如果把元素位置颠倒,顺序调换,那么得到的内容会出错
修改配置文件
配置文件的路径为:/etc/redis/redis.conf
,如果修改配置文件需要重新启动服务器才能生效
set命令
功能:存储K-V ,set可以填写两个参数(key-value),参数类型必须是字符串
- 对于上述key-value,不需要加
""
就是表示字符串的类型,给他们加上双引号或单引号都可以
get命令
功能:根据Key获取Value。get 后跟key,就可以得到value,并且是带双引号,是字符串类型的。
- 如果不存在key,就会返回nil,和null一个意思
全局/通用命令
redis支持很多数据结构,整体上来说是键值对结构,k固定是字符串,v可以有多种类型,最常见的类型为:字符串,哈希表,列表,集合,有序集合。
操作不同的数据结构,都会有不同的命令,但是还有一些命令,在这些数据结构上都能使用,称作全局命令
KEYS
功能:用来查询当前服务器上匹配的key,可以通过一些特殊符号(通配符)来筛选key
命令语法: :KEYS pattern(样式、模式,描述字符串的模样)
1.*
:匹配任意字符序列(0个或者多个任意字符)
KEYS *
匹配所有的键,展示当前服务器上所有的keyKEYS prefix*
匹配以 “prefix” 开头的键,如 “prefix123”、“prefixabc”。KEYS *suffix
匹配以 “suffix” 结尾的键,如 “abcsuffix”、“defsuffix”
2.?
:匹配单个字符
KEYS key?
匹配以 “key” 开头,并且后面跟着一个字符的键,如 “key1”、“keyA”。
3.[字符 abc]
:匹配在括号内的任一字符
KEYS key[123]
匹配以 “key” 开头,并且后面跟着 “1"或"2” 或 “3” 的键,如 “key1”、“key2”、“key3”。
4.[范围 a-b]
:匹配在范围内的任一字符
KEYS key[1-5]
匹配以 “key” 开头,并且后面跟着数字1~5任意一个数字的键,如 “key1”、“key2”、“key3”。KEYS k[a-b]ey
匹配以 “k” 开头,并且后面跟着字母a-b任意一个字母的键,如 “kaeyd”、“kbey”。
5.[^字符]
:匹配不在括号内的任一字符
KEYS key[^abc]
匹配以 “key” 开头,并且后面跟着的不是 “a"或"b” 或 “c” 的字符的键
注意:keys 的时间复杂度是 O ( N ) O(N) O(N),因为需要遍历所有的key,然后匹配出符合要求的键,所以在生产环境当中一般禁止使用keys,尤其是keys *,它是匹配redis中的所有键,由于生产环境中key非常多,redis是一个单线程的服务器,就会导致执行keys *时间非常长,那么redis服务器就被阻塞,无法为其它客户端提供服务,给用户体验造成影响
redis的一个经典用途就是作为数据冷热分离的热点数据缓存,热点数据首先是去查redis的,如果redis被阻塞了,此时其它的查询redis操作就超时了,此时这些请求只能去查数据库了,大量的数据同时请求数据库的查询,可能会导致过载,数据库也无法正常提供服务了,整个系统基本就处于瘫痪状态
EXISTS
功能:用于检查给定键是否存在于数据库中。接受一个或多个键作为参数,并返回存在的键的数量
时间复杂度:$ O(1)$
命令语法: :EXISTS key [key ...]
例如:检测key1和key2是否存在
- 写法1:写两条redis命令
- 写法2:写一条redis命令
上述哪种写法更好呢?
因为redis是基于客户端-服务器架构的,通过网络通信的中间件。因此上述分开查询key是否存在和同时检查多个键是否存在是有区别的,分开查询的写法,会产生更多次数的请求响应,也即网络通信。和直接操作内存来说,网络通信成本比较高,效率比较低,而同时检查多个键只需要一次请求响应,减少网络通信
![image-20231020205222170](https://img-blog.csdnimg.cn/img_convert/02af06ff6b86be0f79c51292548a1608.png)
所以redis支持一个命令能操作多个key来减少网络通信
DEL
功能:删除指定的key。和EXISTS命令相同,也可以支持操作多个key,返回删除key的个数
时间复杂度: O ( 1 ) O(1) O(1)
命令语法: DEL key [key......]
在redis当中删除,和mysql中的删库删表来说危险性比较低,因为redis是作为缓存,如果丢失少量的数据,问题不大,而MySQL不能丢失数据,丢失了数据就可能后续查不到了
但是如果丢失大批的数据,那么客户端来的查询先去redis当中进行查找,找不到就会到MySQL当中进行查找,就可能会导致MySQL过载,导致系统瘫痪。
EXPIRE
功能:用于为键设置过期时间。接受两个参数:键 以秒为单位的过期时间。
- 设置键的过期时间 过期时间到达后,该键将自动被删除
注意:key必须已经存在才能设置,如果设置成功返回1,失败返回0
时间复杂度: O ( 1 ) O(1) O(1)
命令语法: EXPIRE key seconds
补充:基于redis实现的分布式锁,为了避免出现不能正确解锁的情况,加锁时通常会设置一个过期时间,时间到达之后会自动解锁
TTL
功能:检查键的过期时间
返回:要检查的键的剩余过期时间,以秒为单位,
- 如果键不存在 或者 没有设置过期时间,则返回-1
- 如果键已经过期,则返回-2
时间复杂度: O ( 1 ) O(1) O(1)
命令语法: TTL key
注意:EXPIRE和TTL命令都有对应的⽀持毫秒为单位的版本:PEXPIRE和PTTL
TYPE
功能:用于获取指定键的数据类型
可能返回的结果为:none
string
list
hash
set
zset
stream
(redis作为消息队列的时候会使用这个类型作为value)
命令语法: TYPE key
使用例子:
返回值为"string",表示键"mykey"的数据类型是字符串(String)。
127.0.0.1:6379> type mykey
string返回值为"list",表示键"mylist"的数据类型是列表(List)。
127.0.0.1:6379> LPUSH mylist "value"
(integer) 1
127.0.0.1:6379> type mylist
list返回值为"set",表示键"myset"的数据类型是集合(Set)。
127.0.0.1:6379> SADD myset "value"
(integer) 1
127.0.0.1:6379> type myset
set返回值为"hash",表示键"myhash"的数据类型是哈希(Hash)。
127.0.0.1:6379> HSET myhash field "value"
(integer) 1
127.0.0.1:6379> type myhash
hash返回值为"zset",表示键"myzset"的数据类型是有序集合(Sorted Set)。
127.0.0.1:6379> ZADD myzset 1 "value"
(integer) 1
127.0.0.1:6379> type myzset
zset返回值为"nil",表示键"nonexistingkey"不存在。
127.0.0.1:6379> TYPE nonexistingkey
none