目录
通过 redis 客户端和 redis 服务器交互。
所以需要使用 redis 的命令,但是 redis 的命令非常多。
在 redis 中,对于存入的不同数据的操作的命令是不同的,但是还是有一些命令是通用的,而这些对所有数据类型都通用的命令就是 ”通用命令“。
在介绍通用命令之前,其实我们可以去官方网站去学习一些有关 redis 的一些内容。
我们就可以在主页面上有一个 search 可以用来搜索命令。
这里我们可以启动客户端,然后我们可以使用 ping 命令来验证一下连通性。
- 127.0.0.1:6379> ping
- PONG
如果联通成功的话,那么就会返回 pong,实际上 redis 的命令一般都是大写和 mysql 是一样的,虽然小写也可以支持。
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 可以查询当前 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"
该命令用来查询key 是否存在
exixts key [key...]
该命令可以在后面跟多个 key
返回查询到 key 的个数
时间复杂度位O(N) N为key 的个数
查询
- 127.0.0.1:6379> exists hello hallo
- (integer) 2
删除 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 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 会自动删除
查看过期时间,和 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 就会删除掉该 key,然后返回 nil
定期删除就是,每隔一段时间 redis 就会抽取一部分数据进行检查过期时间,如果过期的话就会删除
为什么是一部分数据呢?因为 redis 是单线程的,如果数据量太大的话,那么就会是 redis 阻塞,导致其他的服务无法被处理,所以 redis 每次都抽取一部分数据进行检查
但是两个策略结合效果却也是一般
redis 过期策略还可以通过定时器来解决,但是这个定时器 redis 并没有实现,但是可以介绍一下如果使用定时器那么可以如何实现
可以将所有的过期时间的 key 都放到一个优先级队列里面
优先级就是过期时间,过期时间越近,那么优先级越高
所以第一个元素一定是最先过期的,所以我们只需要检查第一个元素即可
而第一个元素也不一定要一直检查,可以隔一段时间检查一下
然后就可以分一个线程,让该线程来检查过期时间,如果发现过期时间还没到,则可以先让该线程挂起
首先可以有一个循环队列,而循环队列里面的每一格代表一个一段时间的过期时间
每个格子里面可以保存一个链表,该链表里面的所有事件的过期时间都在该格子表示的时间范围
其中一个指针从循环队列特定位置开始,每隔一段时间(格子表示的时间)就向后走一个,然后检查里面的过期时间,过期就删除
遇到新的事件就查看该事件的过期事件,push 到对应的格子里
虽然 redis 并没有使用这两种方法,但是这两种方法也是比较高效的处理过期事件的方法
返回 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