Redis开发与运维学习笔记—(1)
- 2020 年 3 月 31 日
- 筆記
今天主要看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的可能性。