redis是一个客户端-服务器结构的程序。redis客户端和服务器可以在一台机器上,也可以在不同主机上。客户端和服务器之间通过网络进行通信。
Redis的客户端有很多形态,比如
- redis-cli是Redis服务器自带的命令行客户端。通过命令或命令进入客户端并连接到服务器。ctrl+d退出。
- 图形化界面的客户端。比如桌面程序,web程序。
- 基于redis的api自行开发客户端。
和内存中的操作变量比,就慢了。
redis在内存存储管理数据是先通过网络,再操作内存。同时redis可以把数据单独、持久化存储,服务器重启,并不会影响数据内容。而变量是直接操作内存,重启服务器后数据就没了。
通过redis-cli客户端和redis服务器交互,涉及到很多redis命令。大概是上百个吧。常用的掌握,不常用的在用到的时候查阅官方文档。
redis官方地址:
进入官网后,继续进入社区版
然后在搜索框中输入命令,
进入命令的官方文档:
set命令
set命令:把key和value存储到redis中。key和value都是字符串。
总结set的用法:
- :把键值对<字符串1-字符串2>存到redis中。键和值加不加引号无所谓。
get命令
get命令:根据key来取value。
总结get的用法:
- :通过键1取它对应的值。如果键1不存在,返回nil。nil就是null/NULL的意思。
redis通过数据结构组织数据。体现在两个方面:
- redis自身的这些键值对,是通过哈希表的方式来组织的。
- 在键值对中,key固定就是字符串,value实际上有很多数据类型,最常见的五种类型:字符串,哈希表,列表,集合,有序集合。操作不同的数据结构就会有不同的命令。
全局命令:能够搭配任意数据结构使用的命令。
keys命令:查询当前服务器上的key
命令:通过通配符描述key的样子,服务器中匹配上述样子的key就能被查询出来。
总结keys的用法:
- :pattern是包含通配符的字符串。在服务器中查询能匹配pattern的所有key。
patter的具体写法:
:匹配任意一个字符;
:匹配任意个字符;
:只能匹配a或e,其他字符不行,相当于给出固定选项;
:排除e和a,只有e和a匹配不了,其他的都能匹配;
:a到b区间的都能匹配,包括a和b。
比如:
keys命令的时间复杂度是O(N),redis执行命令时用的是单线程模型,所以如果redis中存储的key非常多,那么执行keys命令的时间会很长,会导致redis服务器堵塞,无法给其他客户端提供服务。
所以在生产环境中使用keys命令是危险操作。 - :查询当前服务器上的所有key。
生产环境
生产环境也叫线上环境。线上环境是外界用户能访问到的。
办公环境,开发环境,测试环境,统称为线下环境,外界用户无法访问。
一旦生产环境出现问题,会直接对用户使用产生影响。
exists命令:判定key是否存在
exists命令能一次性查一个或多个key是否存在。
redis组织key是按照哈希表的方式来组织的。所以 exists命令的时间复杂度是O(1)。
总结exists的用法:
- :查询服务器中是否存在键key1,键key2,键key3,返回key存在的个数。
一次查多个效率比较高。这主要是因为redis客户端和服务器之间通过网络进行通信。
每次网络通信都要对数据进行封装和分用,还是很花时间的。
而且在网络通信中是通过网卡进行数据传输等工作的,网卡属于IO设备,IO设备的效率低于内存,CPU。
一般情况下,Redis客户端和服务器还不定在一台机器上,此时网络传输消耗的时间也更多了。
Redis的很多命令都支持一次能操作多个key。
del命令:删除指定的key
同exists命令,del命令能一次删除一个或多个key。del命令的时间复杂度也是O(1)。
总结del的用法:
- :删除服务器中键key1,键key2,键key3,返回删除掉的key的个数。
expire命令:为指定的key设置过期时间。
总结expire命令的用法:
- :为key1设置过期时间,xxx秒后,key1被自动删除。返回0设置失败,返回1设置成功。key1必须存在。
通过pexpire命令也可以为指定的key设置过期时间。使用方法同expire,区别是设置的时间单位是ms。
ttl命令:查询指定key的过期时间
ttl 全称 time to live,即存活时间。
- :查询key1的过期时间还剩多少,时间单位是s。返回值如果是-1表示该key1没有设置过过期时间,返回值如果是-2表示该key1不存在。
pttl和ttl命令一样,区别是时间单位是ms。
type命令:查看key对应value的数据类型
type的命令的时间复杂度也是O(1)。
总结type的用法:
- :查看key1对应value的数据类型。如果key1不存在,返回值是none。
在redis中,操作不同数据类型的value的命令完全不同。操作前就可以先type一下。
一个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命令是危险操作。特别是。
- Redis中针对key的过期策略:定期删除+过期删除+内存淘汰机制三者结合。
- 定时器的两个高效实现思路:基于优先级队列实现和基于时间轮实现。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-yjs/31015.html