zoukankan      html  css  js  c++  java
  • 后端开发应该掌握的 Redis 基础

    640?wx_fmt=jpeg

    Redis的数据结构

    Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景。

    五种基础数据结构

    String:字符串,是构建其他数据结构的基础

    Hash:哈希列表

    List:列表

    Set:集合,在哈希列表的基础上实现

    Sort Set:有序集合

    复杂的数据结构

    Bitmaps:位图,在string的基础上进行位操作,可以实现节省空间的数据结构。

    Hyperloglog:用于估计一个 set 中元素数量的概率性的数据结构。

    Geo:geospatial,地理空间索引半径查询。

    BloomFilter:布隆过滤器。

    不同数据结构的相同之处

    从上面的介绍,我们看到支持的数据结构的不同,但其实,Redis的每一种数据结构都由一个key和value组成,可以抽象为:

    640?wx_fmt=jpeg

    Redis数据结构组成

    而所有数据结构的key的值都是任意合法的字符串,不同的数据结构的区别就在于value存储的值的不同而不同。

    比如,最简简单的String数据结构,其value为String,所以String可以表示为:

    640?wx_fmt=jpeg

    而Hash数据结构,其value为一个哈希列表,所以Hash可以表示为:

    640?wx_fmt=jpeg

    这里就列出String和Hash来讲解说明,关于更多数据结构的内部结构及详细操作,我们在之后的文章在再谈谈吧。

    Redis的通用命令

    Redis官网将Redis的命令按照功能划分为15个主题分组,其中,Kyes主题的命令对所有的数据结构都通用,因此,有必要在了解其他数据结构命令前好好学习一下。

    keys

    keys命令的作用是列出Redis所有的key,该命令的时间复杂度为O(N),N随着Redis中key的数量增加而增加,因此Redis有大量的key,keys命令会执行很长时间,而由于Redis是单线程,某个命令耗费过长时间,则会导致后面的的所有请求无法得到响应,因此,千万不要在生产服务器上使用keys命令。

    # key命令,时间复杂度为O(n)
    keys pattern #pattern可为一个包含匹配模式的字符串,可以包含*,+,?,[a-z]等模式。
    

    示例

    > mset hello_test1>> 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

    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

    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,pexpire

    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

    ttl和pttl命令用于获取key的过期时间,其返回值为整型,代表的意义分为几种情况:

    1. 当key不存在或过期时间,返回-2。

    2. 当key存在且永久有效时,返回-1。

    3. 当key有设置过期时间时,返回为剩下的秒数(pttl为毫秒数)

    # 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
    


    expireat,pexpireat

    设置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
    


    persist

    移除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
    


    type

    判断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而已。

    来源:juejin.im/post/5d078cd6f265da1b8466e62c

  • 相关阅读:
    【Azure 应用服务】由 Azure Functions runtime is unreachable 的错误消息推导出 ASYNC(异步)和 SYNC(同步)混用而引起ThreadPool耗尽问题
    【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中
    【Azure 应用服务】Azure Function 不能被触发
    【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?
    【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
    【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达
    【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)
    【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
    【Azure 应用服务】记一次Azure Spring Cloud 的部署错误 (az spring-cloud app deploy -g dev -s testdemo -n demo -p ./hellospring-0.0.1-SNAPSHOT.jar --->>> Failed to wait for deployment instances to be ready)
    【Azure 应用服务】App Service中抓取 Web Job 的 DUMP 办法
  • 原文地址:https://www.cnblogs.com/hgmyz/p/12350851.html
Copyright © 2011-2022 走看看