redis学习笔记(二)——基本API的理解和使用
本章主要讲述Redis API的理解和使用。主要包括通用命令的介绍、五种数据结构的重要API和其内部数据结构的简单梳理、适用场景。
通用命令
keys
计算redis里所有的键
keys *
// 遍历所有key
keys [pattern]
// 查找所有符合给定模式 pattern 的 key
keys命令一般不在生产环境使用,它是一个比较重的命令,线上数据多,使用它还会阻塞其他命令(redis是单线程的)
dbsize
算出redis里key的总数
dbsize可以在线上环境使用。它并不是每次跑一遍数据库,而是在redis内部有一个计数器,会实时更新key的总数。
exists key
判断一个键是否存在
del key [key ...]
删除key(删除多个key)
expire key seconds
设置过期时间。该key会在一段时间后自动删除,这对于很多使用缓存的场景很有帮助。
expire key seconds // key在seconds秒后过期
expireat key TIME_IN_UNIX_TIMESTAMP // 时间戳后过期
pexpire key milliseconds // key在milliseconds毫秒后过期
ttl key // 查看key剩余的过期时间
persist key // 去掉key的过期时间
比如下面例子,设置time1的过期时间为30秒
可以看到,在过期时间未到时,ttl返回了当前剩余时间。此时可以get到key的对应value值。
过期后,再调用ttl,返回-2,-2代表key已经不存在了。此时无法get到对应value值。
第二个例子设置了time2,30秒后过期。在过期前调用了persist命令,取消了过期时间。
取消后,再次调用ttl,返回-1,-1表示key存在,并且没有过期时间。此时可以get到对应value值
type key
type key // 返回key的类型
判断key的数据类型,如下
返回值一共有6种:string, hash, list, set, zset, none。其中none是在对应key不存在的时候返回的。
时间复杂度
上述六个命令除了keys的时间复杂度是O(n),其他均为O(1),因此除了keys,其他五个命令大部分情况下都能够在线上环境使用。
数据结构和内部编码
上述图片简单描述了redis中数据结构和内部编码的联系
以hash为例子,对于用户来说一个key的value是hash,但是他的内部是由hashtable(哈希表)和ziplist(压缩表)构成的。目前这两个东西具体实现暂时不用讨论,只需要大概知道为什么这么设计即可。
首先需要意识到redis是基于内存的数据库,内存相对于硬盘来说还是比较昂贵的,因此为了节约空间,针对于较大的hash表可以采用压缩的方式来进行存储,以时间换取空间(解压时间)。当然针对较小的hash不会压缩,这样访问速度会更快,以空间换取时间。
简单来说,redis内部编码的设计是为了保证访问时间和空间占用的一个平衡。更具体的我也不清楚了,之后学到了再谈。
单线程
redis是一个单线程的应用。单线程很好理解,它同时只能执行一条命令,不能执行多条命令,如下图所示:
使用时需要意识到以下两点:
- redis一次只会运行一条命令;
- 操作时要拒绝长(慢)命令,如keys、flushall、flushdb等,会导致阻塞其他命令;