服务器卸载wordpress,飓风seo刷排名软件,wordpress本地网站怎么访问,建设公司网站的会计分录Redis#xff1a;通用命令 数据类型 通用命令SETGETKEYSEXISTSDELEXPIRETTLTYPEFLUSHALL 数据类型 Redis的客户端提供了很多命令用于操控Redis#xff0c;在Redis中#xff0c;key的类型都是字符串#xff0c;而value有多种类型#xff0c;每种类型都有自己的操作命… Redis通用命令 数据类型 通用命令SETGETKEYSEXISTSDELEXPIRETTLTYPEFLUSHALL 数据类型 Redis的客户端提供了很多命令用于操控Redis在Redis中key的类型都是字符串而value有多种类型每种类型都有自己的操作命令但是也有一些与类型无关的命令称为通用命令。
本博客讲解Redis中的通用命令以及数据类型。
redis的命令不区分大小写由于小写可读性更好所以博客后续使用小写。
通用命令
SET
设置一个键值对
set key value此处要求key和value都是字符串可以加单引号或双引号也可以不加。 GET
获取键对应的值
get key此处由于先前以及插入了key1成功查询到value1。如果查询不存在的值会返回nil这表示不存在相当于C语言的NULL。 KEYS
获取所有满足正则的key
keys pattern常见的正则符号
?匹配一个任意字符*匹配任意多个任意字符[abc]只能匹配a、b、c三者之一匹配一次[^a]排除e其它的都能匹配匹配一次[a-c]匹配a到c范围内的字符匹配一次
再多的正则匹配法则就不讲解了以上五个是官方给出的五种匹配法则。 如图一开始插入了四个键值对随后根据以上五种正则进行匹配筛选出了不同的key。
要注意的是keys会遍历Redis内部的所有数据时间复杂度为O(N)。生产环境中一般会禁止使用这个命令。 EXISTS
判断一个或多个key是否存在
exists key [key ...]在exists后可以跟着多个key最后返回存在的key的个数。
因为底层使用哈希表组织数据所以该操作的复杂度为O(1)。 上例中先同时查询了hallo和hello返回2说明两个都存在。后面又分别查询两者。
问题来了同时查询多个key和分开查询有什么区别吗
其实区别可大了因为Redis是基于网络实现的客户端敲入的每一个命令都要包装为一个请求发给客户端客户端再进行响应。如果一次性查询多个key一次请求就可以完成查询而多次查询则需要多个网络请求效率会低很多。
因为网络要与硬件进行IO封装层数多速度是非常慢的。这是Redis的缺陷因此Redis在设计时就尽可能支持让一个命令完成多个操作。 DEL
删除指定的key
del key [key ...]同样的del也支持多个key同时删除。 EXPIRE
为指定的key添加秒级的过期时间
expire key seconds所谓过期时间就是一个数据的有效期当数据超过过期时间数据就会被自动删除。比如说常见的验证码就可以用这个过期时间实现。
返回1表示成功0表示失败如果对不存在的key设置过期时间就会失败。 如图设置了一个hello变量并设置过期时间为5 s随后立刻查询可以查询到hello再过一段时间就被自动删除了查询结果为nil。
如果想要更加精确的时间可以使用pexpire命令该命令的时间单位是毫秒。 TTL
获取key的秒级过期时间
ttl key如果key没有过期时间返回-1如果key不存在返回-2其他情况返回剩余时间。 如图设置hello后查询ttl由于key没有设置过期时间此时返回-1。设置过期时间为5 s后两次查询分别查询到4、1为剩余的过期时间。最后一次查询结果为-2表示key不存在因为已经过期删除了。
另外的ttl也有毫秒级别的指令pttl。
那么Redis是如何实现定期删除的
此处采用了定期删除惰性删除的策略
定期删除每隔一段时间抽取一部分数据检查看是否有过期的数据将其删除惰性删除当用户操作数据时检测一遍这个数据是否过期如果过期就删除再给用户返回key不存在
因为Redis内部要存储不少数据轮询一遍所有数据要浪费很多时间所以不会遍历所有数据判断过期。而是等待用户访问数据才删除或者抽样检查删除以降低删除过期数据带来的时间浪费。 TYPE
返回key对应的value的类型
type key在Redis中所有的key都是字符串类型而value有多种类型。如果返回none表示key不存在。 FLUSHALL
删除Redis中所有数据
flushall这个命令在生产环境中千万不要敲这就是删库操作只是在学习过程中可能要清除以前的数据才需要用到。 数据类型
官方文档中给出了以下基础数据类型
String字符串Hash哈希List列表Set集合Sorted set有序集合Stream流Bitmap位图Bitfield位字段Geospatial地理信息
除此之外Redis还支持一些其它的扩展类型。在基础类型中最常用的是前五种类型。
Redis非常追求高效在数据类型方面向用户承诺这些数据类型使用起来可以达到指定效果但是底层具体如何实现这就不能保证了。就比如说哈希表它保证用户用起来和哈希表没有区别可以以O(1)的时间复杂度完成增删查改但是底层是不是使用哈希表就不一定了
每种数据类型都可能会有多种实现方式Redis称其为编码方式常见编码方式如下表
数据类型内部编码stringrawintembstrhashhashtableziplistlistlinkedlistziplistsethashtableintsetzsetskiplistziplist
string raw最基本的字符串底层就是一个字符数组int当value是一个整数此时会用int来保存embstr针对短字符串的优化
value默认传入时都是字符串如果检测到字符串是一个数字就转为int存储。比如说字符串12345678如果用字符串存储需要8 byte但是Redis检测到其为整数后转为int存储只需要4 byte。 hash hashtable标准的哈希表ziplist压缩列表当哈希表元素比较少可以通过该结构压缩空间 list linklist标准的链表ziplist压缩列表当链表元素比较少可以通过该结构压缩空间
在Redis 3.2后list统一使用quicklist取消了linklist和ziplist因为quicklist兼顾了两者的特性。简单来说quicklist基本结构是一个linklist而每一个链表节点是一个ziplist也就是说耦合了前两者。
set hashtable基于哈希表实现的集合intset如果集合都是整数会优化为该结构
在现代编程语言中常会使用平衡二叉搜索树比如红黑树来实现set其时间复杂度为O(lgN)。但是Redis为了更加高效采用了O(1)时间复杂度的哈希表实现set。
zset skiplist跳表ziplist 压缩列表当集合元素比较少可以通过该结构压缩空间
此处的跳表也是一种搜索结构时间复杂度属于O(lgN)级别与平衡二叉搜索树属于同一级别。
如果想要查看数据类型底层具体使用了什么编码可以使用指令object encoding
object encoding key如图同为string类型的三个value最后底层编码使用了不同的方式。