Redis开发与运维学习笔记—(1)

  • 2020 年 3 月 31 日
  • 筆記

最近准备开始拓宽视野,看看redis的东西,之前就了解过redis的部署方法和5种基本的数据结构,现在准备稍微深入的了解下redis,先写篇文章立个flag,这样以后就用动力写系列文章了。

今天主要看Redis中的数据库管理部分。

redis中的数据是通过key-value的方法存储的,类似C++中的map,我们通过key就可以获取value的值。redis提供了几个面向redis数据库的操作,分别是keys、exists、del、expire、type、dbsize、select、flushdb、flushall命令。今天来看这几个命令:

keys

我们使用keys *能够获得所有的redis键,但是该命令复杂度比较高,为O(n),不建议在线上环境直接使用。

127.0.0.1:7393> set hello world  OK  127.0.0.1:7393> keys *  1) "hello"  

exist keys

这个命令是判断键是否存在的,如果存在,返回1,如果不存在,返回0

127.0.0.1:7393[14]> exists hello  (integer) 1  127.0.0.1:7393[14]> exists yyz  (integer) 0  

del

del命令用来删除某个键

del key

举例如下:

127.0.0.1:7393[14]> del hello  (integer) 1  127.0.0.1:7393[14]> exists hello  (integer) 0  

del返回1表示有一个键删除成功,exists返回0表示不存在hello

expire key seconds

expire命令用来设置键的超时时间,一旦超过这个时间,则键会被自动删除。

127.0.0.1:7393[14]> set hello world  OK  127.0.0.1:7393[14]> expire hello 5  (integer) 1  127.0.0.1:7393[14]> exists hello  (integer) 1  127.0.0.1:7393[14]> exists hello  (integer) 0  

在这个过程中,我们可以使用ttl命令来查看键的剩余时间,如下:

127.0.0.1:7393[14]> set hello world  OK  127.0.0.1:7393[14]> expire hello 10  (integer) 1  127.0.0.1:7393[14]> ttl hello  (integer) 8  127.0.0.1:7393[14]> ttl hello  (integer) 5  127.0.0.1:7393[14]> ttl hello  (integer) -2  127.0.0.1:7393[14]> exists hello  (integer) 0  

当ttl返回大于0的整数时,该整数表示键的过期时间,单位为s,如果返回-1,则说明该键没有设置过期时间,如果返回-2,则说明键不存在。

type

type命令用来查看当前键的数据结构类型,结果可能有5中,string,hash,list,set,zset

127.0.0.1:7393[15]> set hello world  OK  127.0.0.1:7393[15]> type hello  string  

dbsize

这个命令是获取redis中键的个数,该命令在执行的时候,不会遍历所有的键,而是会直接获取redis内置的键总数变量,所以该命令的复杂度是O(1),而keys * 命令的复杂度是O(n),当redis保存了大量的键时,keys * 在线上环境中是需要禁用的。

select

和MySQL不同,redis中的数据库只是用数字来作为多个数据库的实现,redis默认配置中有16个数据库,每个数据库使用数字来区分。

127.0.0.1:7393> set hello world  OK  127.0.0.1:7393> get hello  "world"  127.0.0.1:7393> select 15  OK  127.0.0.1:7393[15]> get hello  (nil)  

上面的例子中,默认的hello,world都是进入到0号数据库的,当我们使用select 15语法,会切换到15号数据库,再去get hello的时候,就会得到空值nil

当我们使用redis-cli -h {ip} -p {port}的方法连接Redis的时候,默认使用的就是0号数据库,当选择其他数据库时,会有[index]标识,index就是数据库的下表。例如上面的例子中,我们可以看到,shell中有[15]字样,这意味着我们进入到了15号数据库中。

建议:

单机多库这种方法虽然类似MySQL中的数据库一样,可以让我们自由切换,但是由于redis是单线程的,如果使用多个数据库,那么这些数据库仍然使用同一个CPU,彼此之间还是会受到影响。

因此,redis中,如果我们想要实现多个redis数据库,最好的办法是起其他实例,用单机多实例的方法来弥补,这种方法的好处是可以最大程度使用CPU资源,而且使得运维和调试功能更加简便。

flushdb和flushall命令

这两个命令都是用于清理数据库的,二者的区别是flushdb只清楚当前数据库,而flushall会清楚所有数据库,如果某个redis实例中只有1个数据库有数据,那么这两个操作是等效的。

另外,如果redis的键值数量比较多,flushdb和flushall存在阻塞redis的可能性。