一 基本概述、
(1)
redis基本命令的时间复杂度如下:
可以看到,keys命令是一个比较重的命令,所以在开发环境中我们一般不使用(因为redis是单线程的,如果你keys一个一百万的命令,可能就会在这个命令上耗费10秒,那后面所有的命令都会需要等10秒钟)
(2)
下图是redis的数据结构与内部编码
数据结构是对外呈现的,而数据结构的底层就是内部编码,可以看到,每个数据结构都有几个内部编码,这是为了优化,比如hash,当我们需要使用时间换取空间的话,我们就可以使用如ziplist的压缩结构,而当我的数据量不多,需要以空间换取时间的话,我们就可以使用hashtable的数据结构。
(3)
对于redis内部源码中,有一个redisObject的结构对象:
(4)
单线程为什么这么快:
- 纯内存(主要原因)
- 非阻塞IO
- 避免线程切换和竞态消耗
单线程需要注意的几点是:
- 一次只运行一条命名
- 拒绝长(慢)命令:keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
- 有些命令不是单线程,如:fysnc file descriptor,close file descriptor
扫描二维码关注公众号,回复:
10455556 查看本文章
二 数据结构
2.1 字符串
字符串中的value可以是字符串,数字,二进制,甚至是json串。value最大大小限度是512MB
字符串结构在缓存,技术器,分布式锁等场景使用。
2.2 hash
hash结构如下图所示
下面我们比较下使用字符串和hash来存储用户属性的优劣
1.字符串方式1
2.字符串方式2
3.hash方式
三种方式的比较
2.3 List
数据结构如下
比如我们平时用的微博,里面有个按时间顺序排列的列表
这个就是通过redis里面的list的结构来完成,我们把微博内容存在list里,当有人新发了微博,我们就将此条微博的内容放入list(LPUSH)
2.4 set
数据结构如下
集合不仅支持集合内的操作,还支持集合间的操作
2.5 zset(有序集合)
有序集合可以用在排行榜