浅谈redis数据结构
1. redis安装
正式的redis是安装在linux操作系统上的,但是考虑到很多小伙伴对windows是比较熟悉的。因此,redis windows安装的版本如下:https://github.com/MicrosoftArchive/redis/releases。从这个github上选择对应的release版本,比如,我这里安装的是3.0.504,下载msi或zip都可以,如下图所示:
我这里选择的是msi,后面的安装就不在累述。本地安装好以后,打开redis的安装路径,例如:我本地安装在D:\Program Files\Redis,如下图所示:
如图中标出来的两个exe文件:redis-server.exe和redis-cli.exe,分别是redis的服务端和redis的客户端。
下面我们启动redis服务,这里启动redis服务的方式有很多种,篇幅所限,我这里就介绍下,利用git客户端,启动redis服务,如下图所示:
redis服务启动成功后,我们再启动redis客户端,如下图所示:
2. 数据结构
熟悉redis的小伙伴都知道,redis存储的整体结构是(K,V)结构,即键-值结构。对于键(K),有一些通用的全局命令,这里只做几个简单的说明:
命令 | 描述 |
keys * | 查看所有键 |
dbsize | 键总数 |
exists key | 检查键是否存在 |
del key | 删除键 |
expire key seconds | 键过期 |
type key | 键的数据结构类型 |
对于值(V),redis中有五种数据结构。这五种数据结构分别是:
数据结构 | 描述 |
string | 字符串 |
hash | 哈希 |
list | 列表 |
set | 集合 |
zset | 有序集合 |
这种键-值结构,只是redis对外的数据结构,如下图所示:
这种对外的数据结构,其中每种数据结构实际上都有自己底层的内部编码实现,而且是多种实现。这样Redis会在合适的 场景 选择合适的 内部编码,如下图所示:
可以看到,每种数据结构都有两种以上的内部编码实现。例如:list数据结构包含了linkedlist和ziplist两种内部编码。同时有些内部编码,例如:ziplist,可以作为多种外部数据结构的内部实现,可以通过object encoding命令查询内部编码,如下图所示:
Redis这样设计有两点好处,其一:可以改进内部编码,而对外的数据结构和命令没有影响。例如:Redis3.2提供的quicklist,结合了ziplist和linkedlist 两者的优势,为列表类型提供了一种更加高效的内部编码实现;其二:不同内部编码可以在不同场景下发挥各自的优势。例如:ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置,将列表类型的内部实现转换为linkedlist。
3. 后续
由于篇幅限制,后续的文章中,会分别对redis的五种数据结构分别做研究。关于字符串数据结构的,请阅读:浅谈redis数据结构之字符串