【Redis_Day3】Redis通用命令
【Redis_Day3】Redis通用命令
- redis客户端的三种形态
- redis的快与慢
- redis通用命令
- 阅读redis官方文档
- redis中两个核心命令
- set命令
- get命令
- redis全局命令
- keys命令:查询当前服务器上的key
- 生产环境
- exists命令:判定key是否存在
- del命令:删除指定的key
- expire命令:为指定的key设置过期时间。
- ttl命令:查询指定key的过期时间
- type命令:查看key对应value的数据类型
- Redis中key的过期策略实现原理(浅析)
- 定时器的实现原理(浅析)
- 小结一下~
redis客户端的三种形态
redis是一个客户端-服务器结构的程序。redis客户端和服务器可以在一台机器上,也可以在不同主机上。客户端和服务器之间通过网络进行通信。
Redis的客户端有很多形态,比如
- redis-cli是Redis服务器自带的命令行客户端。通过命令
redis-cli
或命令redis-cli -h IP地址 -p 端口号
进入客户端并连接到服务器。ctrl+d退出。
- 图形化界面的客户端。比如桌面程序,web程序。
- 基于redis的api自行开发客户端。
redis的快与慢
和mysql这样的关系型数据库相比,redis的最大特点是快。
mysql是在硬盘存数据,redis是在内存存数据。
和内存中的操作变量比,就慢了。
redis在内存存储管理数据是先通过网络,再操作内存。同时redis可以把数据单独、持久化存储,服务器重启,并不会影响数据内容。而变量是直接操作内存,重启服务器后数据就没了。
redis通用命令
通过redis-cli客户端和redis服务器交互,涉及到很多redis命令。大概是上百个吧。常用的掌握,不常用的在用到的时候查阅官方文档。
阅读redis官方文档
redis官方地址:redis.io
进入官网后,继续进入社区版
然后在搜索框中输入命令,
进入命令的官方文档:
redis中两个核心命令
redis是按照键值对的方式存储数据的。
redis中命令不区分大小写。
set命令
set命令:把key和value存储到redis中。key和value都是字符串。
总结set的用法:
set 字符串1 字符串2
:把键值对<字符串1-字符串2>存到redis中。键和值加不加引号无所谓。
get命令
get命令:根据key来取value。
总结get的用法:
get 键1
:通过键1取它对应的值。如果键1不存在,返回nil。nil就是null/NULL的意思。
redis全局命令
redis通过数据结构组织数据。体现在两个方面:
- redis自身的这些键值对,是通过哈希表的方式来组织的。
- 在键值对中,key固定就是字符串,value实际上有很多数据类型,最常见的五种类型:字符串,哈希表,列表,集合,有序集合。操作不同的数据结构就会有不同的命令。
全局命令:能够搭配任意数据结构使用的命令。
keys命令:查询当前服务器上的key
keys
命令:通过通配符描述key的样子,服务器中匹配上述样子的key就能被查询出来。
总结keys的用法:
keys pattern
:pattern是包含通配符的字符串。在服务器中查询能匹配pattern的所有key。
patter的具体写法:
?
:匹配任意一个字符;
*
:匹配任意个字符;
[ae]
:只能匹配a或e,其他字符不行,相当于给出固定选项;
[^ea]
:排除e和a,只有e和a匹配不了,其他的都能匹配;
[a-b]
:a到b区间的都能匹配,包括a和b。
比如:
keys命令的时间复杂度是O(N),redis执行命令时用的是单线程模型,所以如果redis中存储的key非常多,那么执行keys命令的时间会很长,会导致redis服务器堵塞,无法给其他客户端提供服务。
所以在生产环境中使用keys命令是危险操作。keys *
:查询当前服务器上的所有key。
生产环境
生产环境也叫线上环境。线上环境是外界用户能访问到的。
办公环境,开发环境,测试环境,统称为线下环境,外界用户无法访问。
一旦生产环境出现问题,会直接对用户使用产生影响。
exists命令:判定key是否存在
exists命令能一次性查一个或多个key是否存在。
redis组织key是按照哈希表的方式来组织的。所以 exists命令的时间复杂度是O(1)。
总结exists的用法:
exists key1 key2 key3
:查询服务器中是否存在键key1,键key2,键key3,返回key存在的个数。
一次查多个效率比较高。这主要是因为redis客户端和服务器之间通过网络进行通信。
每次网络通信都要对数据进行封装和分用,还是很花时间的。
而且在网络通信中是通过网卡进行数据传输等工作的,网卡属于IO设备,IO设备的效率低于内存,CPU。
一般情况下,Redis客户端和服务器还不定在一台机器上,此时网络传输消耗的时间也更多了。
Redis的很多命令都支持一次能操作多个key。
del命令:删除指定的key
同exists命令,del命令能一次删除一个或多个key。del命令的时间复杂度也是O(1)。
总结del的用法:
del key1 key2 key3
:删除服务器中键key1,键key2,键key3,返回删除掉的key的个数。
expire命令:为指定的key设置过期时间。
key存活时间超过设定的过期时间,key就会被自动删除。设置的时间单位是s。实践复杂度也是O(1)。
比如在该验证码五分钟内有效,该外卖优惠劵在今日24.00过期等等场景下。
总结expire命令的用法:
expire key1 xxx
:为key1设置过期时间,xxx秒后,key1被自动删除。返回0设置失败,返回1设置成功。key1必须存在。
通过pexpire命令也可以为指定的key设置过期时间。使用方法同expire,区别是设置的时间单位是ms。
ttl命令:查询指定key的过期时间
ttl 全称 time to live,即存活时间。
ttl命令的功能是查看指定key的过期时间还剩多少。
总结ttl命令的用法:
ttl key1
:查询key1的过期时间还剩多少,时间单位是s。返回值如果是-1表示该key1没有设置过过期时间,返回值如果是-2表示该key1不存在。
pttl和ttl命令一样,区别是时间单位是ms。
type命令:查看key对应value的数据类型
type的命令的时间复杂度也是O(1)。
总结type的用法:
type key1
:查看key1对应value的数据类型。如果key1不存在,返回值是none。
在redis中,操作不同数据类型的value的命令完全不同。操作前就可以先type一下。
Redis中key的过期策略实现原理(浅析)
一个redis中同时存在很多的key,这些key中可能有很大一部分都有过期时间,此时,redis服务器是如何知道哪些key已经过期要被删除,哪些key还没过期的。
直接遍历所有的key,效率太低行不通。
redis中采取的基本策略是:定期删除和惰性删除结合。
惰性删除:假设key1已经到了过期时间,但是redis并没有删除它。直到key1接下来被访问到时,才会触发redis服务器删除key1的操作,并返回给客户端一个nil。
定期删除:redis每隔一段时间抽取一部分key检查它们的过期时间,对过期key执行删除操作。在这个过程中,控制每次抽取检查的数量,保证定期删除的过程要足够快。redis处理主要任务都是使用单线程模型,如果扫描过期key消耗时间太长,会导致redis正常处理命令被阻塞。
通过上述策略,依然可能存在有很多过期的key被残留,不能及时删除掉。为了解决这个问题,redis中还提供了一系列的内存淘汰策略。
定时器的实现原理(浅析)
定时器:在某个时间到达之后,执行指定的任务。
实现一个定时器,有以下两种比较高效的方式:分别是基于优先级队列(堆)和时间轮。
基于优先级队列实现定时器:现假设redis服务器中有很多设置了过期时间的key,把这些key加入到一个优先级队列中,指定优先级规则是过期时间早的先出队列。此时队首元素就是最早的要过期的key,给定时器中分配一个线程(多线程),让这个线程去检查队首元素,看队首元素是否过期,这个线程不需要频繁扫描队首元素,只要根据当前时刻和队首元素的过期时间,设置一个等待,当等待时间结束后,系统唤醒这个线程,这个线程去检查队首元素即可。
基于时间轮实现定时器:把时间划分成多个时间槽,每个槽代表一个固定的时间间隔。根据任务的超时时间把任务放进时间槽中,每个时间槽中存储多个定时任务。设置一个指向当前时间槽的指针,这个指针每隔固定时间就往后走一个时间槽,每次走到一个时间槽,就会尝试执行里面的定时任务。
控制指针向后走的线程并没有频繁扫描。一共多少个时间槽,每个槽代表间隔多少都是根据具体场景设计的。
上述两种方案都涉及到了多线程,Redis中没有采取上述两种方案。
小结一下~
- redis中六个常用的全局命令:
- keys:查看匹配规则的key
- exists:判定指定key是否存在
- del:删除指定的key
- expire/pexpire:设置过期时间
- ttl/pttl:查看key的过期时间
- type:查询key对应的value类型
- 两个核心命令:
- set:把key和value存储到redis中。
- get:根据key来取value
- 在生产环境中使用keys命令是危险操作。特别是
keys *
。 - Redis中针对key的过期策略:定期删除+过期删除+内存淘汰机制三者结合。
- 定时器的两个高效实现思路:基于优先级队列实现和基于时间轮实现。