• redis 通用命令


    目录

    通用命令是什么

    SET & GET

    keys

    EXISTS

    DEL

    EXPIRE

    TTL

    redis 的过期策略

    定时器策略

    基于优先级队列定时器

    基于时间轮的定时器

    TYPE


    通过 redis 客户端和 redis 服务器交互。

    所以需要使用 redis 的命令,但是 redis 的命令非常多。

    通用命令是什么

    在 redis 中,对于存入的不同数据的操作的命令是不同的,但是还是有一些命令是通用的,而这些对所有数据类型都通用的命令就是 ”通用命令“。

    在介绍通用命令之前,其实我们可以去官方网站去学习一些有关 redis 的一些内容。

    [Redis](https://redis.io/) 

    我们就可以在主页面上有一个 search 可以用来搜索命令。

    这里我们可以启动客户端,然后我们可以使用 ping 命令来验证一下连通性。

    1. 127.0.0.1:6379> ping
    2. PONG

    如果联通成功的话,那么就会返回 pong,实际上 redis 的命令一般都是大写和 mysql 是一样的,虽然小写也可以支持。

    SET & GET

    redis 是按照键值对的方式来存储的。

    • get:根据 key 来获取对应的 value

    • set:把 key 和 value 设置进去

    这里的 key 和 value 都是字符串。

    1. set key value
    2. 如果设置成功返回 OK

    上面就是 set 的简单语法,set 后面跟一个 key 在跟一个value。

    上面虽然说 key 和 value都是字符串,但是在set 的时候并不需要加双引号或者单引号。

    1. 127.0.0.1:6379> SET key1 value1
    2. OK

    下面可以通过 key 来获得 value

    1. get key
    2. 如果有 key 就会返回对应的 value,否则就会返回 nil,上面的 nil 就是表示空或者不存在的意思
    1. 127.0.0.1:6379> get key1
    2. "value1"
    3. 127.0.0.1:6379> get key2
    4. (nil)

    KEYS

    • keys 可以查询当前 redis 中的 key

    KEYS pattern
    • pattern 就是匹配模式

    • ?:表示匹配任意多一字符

    • *:匹配任意多个字符

    • [abc..]:匹配方括号里面的字符

    • [^abc]:匹配除非方括号里面的字符

    • [a-b]:匹配a~b中的字符

    下面可以试一下

    插入一批数据

    1. 127.0.0.1:6379> set hello 1
    2. OK
    3. 127.0.0.1:6379> set hallo 1
    4. OK
    5. 127.0.0.1:6379> set hbllo 1
    6. OK
    7. 127.0.0.1:6379> set heeeeello 1
    8. OK
    9. 127.0.0.1:6379> keys *
    10. 1) "hallo"
    11. 2) "hbllo"
    12. 3) "heeeeello"
    13. 4) "hello"
    14. 5) "key1"
    • 匹配任意一个字符

      1. 127.0.0.1:6379> keys h?llo
      2. 1) "hallo"
      3. 2) "hbllo"
      4. 3) "hello"

    • 匹配任意多个字符

      1. 127.0.0.1:6379> keys h*llo
      2. 1) "hallo"
      3. 2) "hbllo"
      4. 3) "heeeeello"
      5. 4) "hello"

    • 匹配括号里的内容

      1. 127.0.0.1:6379> keys h[ab]llo
      2. 1) "hallo"
      3. 2) "hbllo"

    • 匹配非括号里面内容

      1. 127.0.0.1:6379> keys h[^e]llo
      2. 1) "hallo"
      3. 2) "hbllo"

    • 匹配括号里范围

      1. 127.0.0.1:6379> keys h[ab]llo
      2. 1) "hallo"
      3. 2) "hbllo"

    EXISTS

    • 该命令用来查询key 是否存在

    exixts key [key...]
    • 该命令可以在后面跟多个 key

    • 返回查询到 key 的个数

    • 时间复杂度位O(N) N为key 的个数

    • 查询

      1. 127.0.0.1:6379> exists hello hallo
      2. (integer) 2

    DEL

    • 删除 key 以及对应的 value

    del key [key...]
    • del 后面也可以跟多个 key

    • 返回值表示删除 key 的个数

    • 删除一个数据

      1. 127.0.0.1:6379> del hello
      2. (integer) 1

    • 删除多个数据

      1. 127.0.0.1:6379> del hallo hbllo
      2. (integer) 2

    • 删除不存在的数据

      1. 127.0.0.1:6379> del abc
      2. (integer) 0

    EXPIRE

    • 设置过期时间,单位秒

    expire key second
    • expire 必须要是已经有了的 key

    • 返回值为 1 表示设置成功,0 表示失败

    • 但是 second 对于计算机来说时间太长,其实还有一个 pexpire 的单位为毫秒

    • 设置过期时间

      1. 127.0.0.1:6379> expire hello 10
      2. (integer) 1

    • 为空 key 设置过期时间

      1. 127.0.0.1:6379> expire abc 10
      2. (integer) 0

    为已有的 key 设置过期时间返回 1,为没有的 key 设置过期时间返回 0,表示设置失败

    而且设置成功后,等时间到期后,该key 会自动删除

    TTL

    • 查看过期时间,和 expire 对对应

    ttl key
    • 返回的单位是 秒

    • 如果想要查看毫秒级的就是 pttl 也就是和pexpire 对应

    • 返回值为剩余的过期时间,如果是 -1 表示没有设置过期时间,如果是 -2 表示没有该 key

    • 设置过期时间

      1. 127.0.0.1:6379> expire hello 30
      2. (integer) 1

    • 查看过期时间

      1. 127.0.0.1:6379> ttl hello
      2. (integer) 25

    • 查看没有设置的过期时间 key 的过期时间

      1. 127.0.0.1:6379> ttl key1
      2. (integer) -1

    • 查看没有 key 的过期时间

      1. 127.0.0.1:6379> ttl abc
      2. (integer) -2

    redis 的过期策略

    redis 的过期策略主要是两个方面:

    • 定期删除

    • 惰性删除

    • 首先说这个惰性删除,惰性删除就是每当用户访问该数据的时候, redis 会进行一番检查,如果是过期的,那么 redis 就会删除掉该 key,然后返回 nil

    • 定期删除就是,每隔一段时间 redis 就会抽取一部分数据进行检查过期时间,如果过期的话就会删除

    • 为什么是一部分数据呢?因为 redis 是单线程的,如果数据量太大的话,那么就会是 redis 阻塞,导致其他的服务无法被处理,所以 redis 每次都抽取一部分数据进行检查

    • 但是两个策略结合效果却也是一般

    定时器策略

    redis 过期策略还可以通过定时器来解决,但是这个定时器 redis 并没有实现,但是可以介绍一下如果使用定时器那么可以如何实现

    基于优先级队列定时器

    • 可以将所有的过期时间的 key 都放到一个优先级队列里面

    • 优先级就是过期时间,过期时间越近,那么优先级越高

    • 所以第一个元素一定是最先过期的,所以我们只需要检查第一个元素即可

    • 而第一个元素也不一定要一直检查,可以隔一段时间检查一下

    • 然后就可以分一个线程,让该线程来检查过期时间,如果发现过期时间还没到,则可以先让该线程挂起

    基于时间轮的定时器

    • 首先可以有一个循环队列,而循环队列里面的每一格代表一个一段时间的过期时间

    • 每个格子里面可以保存一个链表,该链表里面的所有事件的过期时间都在该格子表示的时间范围

    • 其中一个指针从循环队列特定位置开始,每隔一段时间(格子表示的时间)就向后走一个,然后检查里面的过期时间,过期就删除

    • 遇到新的事件就查看该事件的过期事件,push 到对应的格子里

    虽然 redis 并没有使用这两种方法,但是这两种方法也是比较高效的处理过期事件的方法

    TYPE

    • 返回 key 对应的 value 的类型

    type key
    • 返回 key 对应的 value 的类型

    • 在 redis 里面 key 都是 string 类型

    • 如果没有key返回 none

    • 插入不同数据

      1. 127.0.0.1:6379> lpush key2 111 222 333
      2. (integer) 3
      3. 127.0.0.1:6379> sadd key3 aaa bbb ccc
      4. (integer) 3
      5. 127.0.0.1:6379> hset key4 field1 value1
      6. (integer) 1

    • 查看不同数据类型

      1. 127.0.0.1:6379> type key1
      2. string
      3. 127.0.0.1:6379> type key2
      4. list
      5. 127.0.0.1:6379> type key3
      6. set
      7. 127.0.0.1:6379> type key4
      8. hash

  • 相关阅读:
    JVM参数调优——G1收集器
    【SCAU数据挖掘】数据挖掘期末总复习题库选择题及解析
    vue - git
    数据结构实验教程-第一套
    Xilinx ISE系列教程(1):ISE开发环境下载、安装、注册(Windows 10 64位系统)
    Dotar(zsh,tmux,vim,ag)
    【Java基础】线程的概念、特点及创建线程的三种方式
    指针综合实训(专业)
    生鲜行业B2B交易管理系统:助力企业一体化管理,促进生鲜企业线上线下融合
    【Redis高手修炼之路】初识Redis
  • 原文地址:https://blog.csdn.net/m0_73455775/article/details/132678212