原创做者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。程序员
在上一篇文章中,咱们简单地讲了一下Redis
的应用场景、安装、如何链接等比较基础的知识,那么在这篇文章,咱们就再接再励,继续Redis
基础知识的学习吧。bash
在这篇文章中,咱们来说一讲Redis
的数据结构和通用命令。服务器
Redis
支持多种不一样的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构能够知足不一样的应用场景。数据结构
String
:字符串,是构建其余数据结构的基础学习
Hash
:哈希列表ui
List
:列表spa
Set
:集合,在哈希列表的基础上实现线程
Sort Set
:有序集合code
Bitmaps
:位图,在string的基础上进行位操做,能够实现节省空间的数据结构。cdn
Hyperloglog
:用于估计一个 set 中元素数量的几率性的数据结构。
Geo
: geospatial,地理空间索引半径查询。
BloomFilter
:布隆过滤器。
从上面的介绍,咱们看到支持的数据结构的不一样,但其实,Redis的
每一种数据结构都由一个key
和value
组成,能够抽象为:
而全部数据结构的key
的值都是任意合法的字符串,不一样的数据结构的区别就在于value
存储的值的不一样而不一样。
好比,最简简单的String数据结构,其value为String,因此String能够表示为:
而Hash数据结构,其value为一个哈希列表,因此Hash能够表示为:
这里就列出String和Hash来说解说明,关于更多数据结构的内部结构及详细操做,咱们在以后的文章在再谈谈吧。
Redis
官网将Redis
的命令按照功能划分为15个主题分组,其中,Kyes
主题的命令对全部的数据结构都通用,所以,有必要在了解其余数据结构命令前好好学习一下。
keys
命令的做用是列出Redis
全部的key
,该命令的时间复杂度为O(N),N随着Redis
中key
的数量增长而增长,所以Redis
有大量的key,keys
命令会执行很长时间,而因为Redis
是单线程,某个命令耗费过长时间,则会致使后面的的全部请求没法获得响应,所以,千万不要在生产服务器上使用keys
命令。
# key命令,时间复杂度为O(n)
keys pattern #pattern可为一个包含匹配模式的字符串,能够包含*,+,?,[a-z]等模式。
复制代码
示例
> mset hello_test1 one hello_test2 two helloa a hellob b
> keys hello*
1) "hello_test1"
2) "hello_test2"
3) "helloa"
4) "hellob"
> keys heelo?
1) "helloa"
2) "hellob"
> keys hello[a-z]
1) "helloa"
2) "hellob"
复制代码
exists
命令用于判断一个或多个key是否存在,判断多个key
时,key
之间用空格分隔,exists
的返回值为整数,表示当前判断有多少个key
是存在的。
# exists命令,时间复杂度O(1)
exists key [key ...]
复制代码
示例
> set test1 t1
> exists test1 test2
(integer) 1 #只有一个key存在
> exists test3 test3
(integer) 0 #key都不存在
复制代码
del
命令用于删除一个或多个key
,多个key
之间用空格分隔,其返回值为整数,表示成功删除了多少个存在的key
,所以,若是只删除一个key,则能够从返回值中判断是否成功,若是删除多个key,则只能获得删除成功的数量。
# del命令,时间复杂度O(n)
del key [key ...]
复制代码
示例
> set test t
> del test
(integer) 1
> mset test1 2 test2 1
> del test1 test2 test3
(integer) 2 # 返回2,表示成功删除两个
#再次删除,返回0,由于删除成功个数为0
> del test1 test2 test3
(integer) 0
复制代码
expire设置key在多少秒以后过时,pexpire设置key在多少毫秒以后过时,成功返回1,失败返回0。
# expire命令,时间复杂度为O(1)
expire key seconds
# pexpire命令,时间复杂度为O(1)
pexpire key milliseconds
复制代码
示例
> mset test test_value test1 test1_value
> expire test 10 #设置10秒后过时
(integer) 1
> pexpire test1_value 10000 #设置10000毫秒(10s)后过时
(integer) 1
> expire ttt 100
(integer) 0 # 不存在的key,设置失败,返回0
复制代码
ttl和pttl命令用于获取key的过时时间,其返回值为整型,表明的意义分为几种状况:
# ttl命令,时间复杂度O(1)
ttl key
# pttl命令,时间复杂度O(1)
pttl key
复制代码
示例(ttl的演示,pttl相似)
> set test test
> expire test 100
> ttl test
(integer) 98#返回剩下的秒数
> set test1 #永久有效
> ttl test1
(integer) -1
> ttl test2
(integer) -2#不存在或过时
#100秒后
> ttl test # test已过时
(integer) -2
复制代码
设置key在某个时间戳过时,expreat参数时间戳用秒表示,而pexpireat则用毫秒表示,与expire和pexpire功能相似,返回1表示成功,0表示失败。
#expireat命令,时间复杂度为O(1)
expireat key timestamp
#pexpireat命令,时间复杂度为O(1)
pexpireat key milliseconds-timestamp
复制代码
示例
> set test test
> expireat test 1560873600 # 2019-06-19 00:00:00
(integer) 1
> set test1 test1
> pexpireat test1 156087360000 # 2019-06-19 00:00:00的毫秒表示
(integer) 1
复制代码
移除key的过时时间,将key设置为永久有效,当key设置了过时时间,使用persist命令移除后返回1,若是key不存在或自己就是永久有效的,则返回0。
# persist命令,时间复杂度O(1)
persist key
复制代码
示例
> set test test
> ttl test
(integer) -1 # 表示永久有效
> persist test
(integer) 0 # 对永久有效或不存在的key使用persist命令,返回
> expire test 10
(integer) 1
> persist test
(integer) 1
复制代码
判断key是什么类型的数据结构,返回值为string
,list
,set
,hash
,zset
,分别表示咱们前面介绍的Redis
的5种基础数据结构。
geo,hyperloglog,bitmaps等复杂的数据结构,都是在这五种基础数据结构上实现,好比geo是zset类型,hyperloglog和bitmaps都为string。
# type命令,时间复杂度O(1)
type key
复制代码
示例
> set test test
> type test
string
> hset htest test test
> type htest
hash
复制代码
上面介绍的是Redis
中最经常使用的通用命令,虽然简单,但仍是很是有必要掌握其用法和使用方面要注意的事项,其实,对于普通开发人员来讲,不少时候,也只是使用这些基础通用的命令来操做Redis
而已。
你的关注,是我写做路上最大的鼓励!