Redis是一个 客户端-服务器 结构的程序,Redis客户端和服务器可以在同一台主机上,也可以在不同主机上,客户端和服务器之间通过网络进行通信。服务器端负责存储和管理数据。客户端则可以通过命名对服务端的数据进行操作。
Redis客户端有多种,1.自带的命令行客户端(redis-cli),2.带图形界面的客户端(不推荐使用),3. 基于Redis的api自行开发的客户端(类似于mysql的jdbc,工作中最常用的)
这里使用redis-cli来演示命令的使用,在linux服务器中输入 redis-cli即可打开客户端:
1. set get 命令
set命名和get命令 是redis中最常用也是最核心的两个命令。
- set:把key可value存入redis
- get:根据key查找value
使用方式:
set key value
这里key和value默认是字符串类型,可以加上单引号或双引号也可不加 ,redis中命令不区分大小写。
get key
当key不存在时get命令会返回nil,和null类似
2. keys
keys命令可以进行模糊查询,返回匹配到的key,当我们输入keys时会提示要填写pattern也就是匹配的规则
pattern规则:
这里我们先添加一些数据方便演示
? 匹配任意一个字符
* 匹配任意多个字符包括0个
[abc..] 只能匹配括号中的字符
[^abc]排除括号中的字符
[a-d]匹配ad区间内的字符
注意:keys命名的复杂度是O(N) ,所以在线上环境要慎重使用keys,特别是 keys *,因为线上环境中的key可能会非常多,而redis是一个单线程的服务器,如果使用keys * 语句会查询所有的key,执行时间可能会很长,导致其他客户端的服务被阻塞超时,redis通常又是作为缓存,此时超时的请求就会直接在数据库中查,就可能会有大量的请求短时间到达数据库,导致数据库瘫痪
3. exists
exists命令用于判断一个或多个key是否存在,会返回key存在的个数(注意redis中key不能重复)
exists key1 key2 ...
hello 和key1存在key不存在所以返回2,redis是以哈希表的形式来组织数据的,所以判断某个key是否存在的操作是O(1)级别的
注意:Redis客户端要对数据操作,会通过网络发送命令给服务器,所以redis命令大多都是支持批量操作的,就可以通过一次网络通信操作多个数据,节省时间
4. del
del key1 key2 ...
删除一个或多个key返回删除的数量
hallo和hllo存在,key不存在,所以返回2,再次查询,可以看到删除成功:
5. exprire
expire key seconds
给指定的key设置过期时间,单位为秒,从设置起,如果key存活超过过期时间,key就会被删除,设置成功返回1 失败返回0, 可以通过 tll key 查看对应的key还有多久过期,如果key不存在或已经过期,返回-2:
对计算机来说,秒是一个比较长的时间单位,于是redis还提供了一个pexpire用于设置毫秒级的过期时间:
pexpire key milliseconds
redis 的过期策略是如何实现的?(面试题)
- 定期删除:定期抽取一部分数据检查是否到达过期时间(因为redis是单线程,如果数据量大抽取全部数据会导致阻塞)
- 惰性删除:由于定期删除每次只检查一部分数据,很有可能某个数据到达过期时间了还没有被删除,当这个数据被访问到时,redis就会立刻删除这个key。
虽然有了上面两种策略,但整体的删除效果还是一般,于是redis还提供了一系列的内存淘汰策略(这里不展开叙述感兴趣可以自行了解) 。
注意:redis并没有采用定时器的方式来实现过期策略
6. type
type key
返回key对应的value的数据类型