redis 通用命令

目录

通用命令是什么

SET & GET

keys

EXISTS

DEL

EXPIRE

TTL

redis 的过期策略

定时器策略

基于优先级队列定时器

基于时间轮的定时器

TYPE


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

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

通用命令是什么

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

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

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

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

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

127.0.0.1:6379> ping
PONG

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

SET & GET

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

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

  • set:把 key 和 value 设置进去

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

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

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

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

127.0.0.1:6379> SET key1 value1
OK

下面可以通过 key 来获得 value

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

KEYS

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

KEYS pattern
  • pattern 就是匹配模式

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

  • *:匹配任意多个字符

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

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

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

下面可以试一下

插入一批数据

127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 1
OK
127.0.0.1:6379> set hbllo 1
OK
127.0.0.1:6379> set heeeeello 1
OK
127.0.0.1:6379> keys *
1) "hallo"
2) "hbllo"
3) "heeeeello"
4) "hello"
5) "key1"
  • 匹配任意一个字符

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

  • 匹配任意多个字符

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

  • 匹配括号里的内容

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

  • 匹配非括号里面内容

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

  • 匹配括号里范围

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

EXISTS

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

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

  • 返回查询到 key 的个数

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

  • 查询

    127.0.0.1:6379> exists hello hallo
    (integer) 2

DEL

  • 删除 key 以及对应的 value

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

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

  • 删除一个数据

    127.0.0.1:6379> del hello
    (integer) 1

  • 删除多个数据

    127.0.0.1:6379> del hallo hbllo
    (integer) 2

  • 删除不存在的数据

    127.0.0.1:6379> del abc
    (integer) 0

EXPIRE

  • 设置过期时间,单位秒

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

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

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

  • 设置过期时间

    127.0.0.1:6379> expire hello 10
    (integer) 1

  • 为空 key 设置过期时间

    127.0.0.1:6379> expire abc 10
    (integer) 0

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

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

TTL

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

ttl key
  • 返回的单位是 秒

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

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

  • 设置过期时间

    127.0.0.1:6379> expire hello 30
    (integer) 1

  • 查看过期时间

    127.0.0.1:6379> ttl hello
    (integer) 25

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

    127.0.0.1:6379> ttl key1
    (integer) -1

  • 查看没有 key 的过期时间

    127.0.0.1:6379> ttl abc
    (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

  • 插入不同数据

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

  • 查看不同数据类型

    127.0.0.1:6379> type key1
    string
    127.0.0.1:6379> type key2
    list
    127.0.0.1:6379> type key3
    set
    127.0.0.1:6379> type key4
    hash