redis——基本概述、数据结构

 

一   基本概述、

(1)

redis基本命令的时间复杂度如下:

可以看到,keys命令是一个比较重的命令,所以在开发环境中我们一般不使用(因为redis是单线程的,如果你keys一个一百万的命令,可能就会在这个命令上耗费10秒,那后面所有的命令都会需要等10秒钟)

(2)

下图是redis的数据结构与内部编码

数据结构是对外呈现的,而数据结构的底层就是内部编码,可以看到,每个数据结构都有几个内部编码,这是为了优化,比如hash,当我们需要使用时间换取空间的话,我们就可以使用如ziplist的压缩结构,而当我的数据量不多,需要以空间换取时间的话,我们就可以使用hashtable的数据结构。

(3)

对于redis内部源码中,有一个redisObject的结构对象:

(4)

单线程为什么这么快:

  1. 纯内存(主要原因)
  2. 非阻塞IO
  3. 避免线程切换和竞态消耗

单线程需要注意的几点是:

  • 一次只运行一条命名
  • 拒绝长(慢)命令: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(有序集合)

有序集合可以用在排行榜

发布了114 篇原创文章 · 获赞 199 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_36582604/article/details/89374233