0
点赞
收藏
分享

微信扫一扫

2.1 RedisAPI之简介


1.通用命令

  • 遍历所有key

keys *

keys命令一般不在生产环境使用,主要原因是生产环境下通常有大量的key,列出所有key没有实际的意义并且会消耗很多内存资源。

  • 删除指定key

del key

  • 计算key的总数

dbsize

  • 检查key是否存在

exists key

  • key在seconds秒后过期

expire key seconds

  • 查看key剩余的过期时间

ttl key

如果返回值为负数,说明该key已经过期,Redis会自动执行del key操作。

  • 取消key的过期时间

persist key

  • 返回key的类型

type key

  • 返回值类型
  • string
  • hash
  • list
  • set
  • zset
  • none(该key不存在)

命令

时间复杂度

keys

O(n)

dbsize

O(1)

del

O(1)

exists

O(1)

expire

O(1)

type

O(1)

2.数据结构和内部编码
(1).key所对应的数据结构和内部编码

数据机构

内部编码

string

raw

string

int

string

embstr

hash

hashtable

hash

ziplist

list

linkedlist

list

ziplist

set

hashtable

set

intset

zset

skiplist

zset

ziplist

  • Redis是基于内存的key-value数据库,这样设计有利于合理高效地利用宝贵的内存资源。
  • 可以改进内部编码,而对外部的数据结构和命令没有影响,这样一旦开发出优秀的内部编码,无需改动外部数据结构和命令。
  • 多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist。

(2).redisObject
Redis源码内部有一个redisObject对象,使用Redis存储的数据,在内存中就是以redisObject对象保存的,它包含如下重要信息。

  • 数据类型(type):string、hash、list、set、sorted set
  • 编码方式(encoding):raw、int、ziplist、linkedlist、hashmap、intset
  • 数据指针(ptr)
  • 虚拟内存(vm)

3.单线程架构

(1).执行命令方式

单线程模式下,Redis是采用串行方式来执行命令的,保证前一次操作执行完后,才能执行下一次操作。

2.1 RedisAPI之简介_redis

(2).单线程为什么这么快

  • 纯内存(核心原因):绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)。
  • 避免线程切换和线程竞争消耗:采用单线程避免了不必要的线程切换和竞争,也不用考虑锁的问题,不存在加锁释放锁所带来的性能消耗。
  • 非阻塞IO:使用多路I/O复用模型。
  • 多路I/O复用模型是指利用select、poll、epoll可以同时监察多个流的I/O事件的能力,在空闲的时候,把当前线程阻塞,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且依次顺序处理就绪的流,这种做法就避免了大量的无用操作。
  • 这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路I/O复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且Redis在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,以上几点造就了Redis具有高吞吐量。

(3).注意

  • 一次只运行一条命令
  • 不要在线上使用长(慢)命令,如keys、flushall、flushdb、mutil/exec、operate等


举报

相关推荐

0 条评论