×

数据库编程 redis

Redis Api的使用和理解之通用命令

feihu1996 feihu1996 发表于2020-05-17 13:44:20 浏览104 评论0

抢沙发发表评论

一、通用命令

1、通用命令

1.1 keys pattern

列出数据库中所有的key,可以根据pattern匹配

# 遍历所有key
keys *
# 遍历所有以he开头的key
keys he*
# 遍历第三个字母是从h到l的key
keys he[h-l]*
# 遍历以ph开头三个字母的key
keys ph?

keys命令一般不在生产环境中使用

生产环境中keys比较多

keys命令比较重,时间复杂度O(n)

单线程模型,运行慢,会堵塞其他命令

怎么用

  • 使用scan

  • 热备从节点

    从节点上使用

1.2 dbsize

计算key的总数

可以在生产环境中使用

  • redis内置计数器

  • 时间复杂度为O(1)

1.3 exists key

判断key是否存在

  • 如果key存在,返回1

  • 如果key不存在,返回0

可以在生产环境中使用

时间复杂度为O(1)

1.4 del key [key ...]

删除一个或多个键值

  • 如果删除成功,返回1

  • 如果key不存在则删除失败,返回0

可以在生产环境中使用

时间复杂度为O(1)

1.5 expire key seconds

key在seconds秒后过期

ttl key

  • 查看key剩余的过期时间

  • 返回-2,表示key已经不存在了

  • 返回-1,表示key存在,但是已经没有过期时间

persist key

去掉key的过期时间

可以在生产环境中使用

时间复杂度为O(1)

1.6 type key

查看键值类型

  • string

  • hash

  • list

  • set

  • zset

  • none: key不存在

可以在生产环境中使用

时间复杂度为O(1)

2、数据结构和内部编码

2.1 Redis每种数据结构都有自己的内部编码

Redis内存数据库

内存资源比较宝贵

空间换时间

  • 使用压缩的数据结构

  • 使用更小的空间达到更优的CPU/内存使用效果

时间换空间

Redis源码内部有一个叫做redisObject的结构体

  • type: 对外 数据类型

  • encoding: 对内 内部编码

  • ptr: 数据指针

  • vm: 虚拟内存

  • 其他信息

用户无需关心内部编码,只需关心如何使用对外的数据类型

2.2 key

string内部编码

  • raw

  • int

  • embstr

hash内部编码

  • hashtable

  • ziplist

list内部编码

  • linkedlist

  • ziplist

set内部编码

  • hashtable

  • intset

zset内部编码

  • skiplist

  • ziplist

3、单线程架构

3.1 在Redis主线程中,同一时间只能执行一条命令

3.2 单线程为什么这么快

纯内存

非阻塞I/O

  • 使用epoll模型作为I/O多路复用的实现

  • Redis自身实现了一个事件机制

  • 将epoll的连接、读写、关闭转换为自身的一个事件

  • 不在网络I/O上浪费太多的时间

避免线程切换和竞态消耗

3.3 拒绝长(慢)命令

  • keys

  • flushall

  • flushdb

  • slow lua script

  • multi/exec

  • operate big value(collection)

3.4 其实不是单线程

某些操作会有独立的线程来做

写aof

  • fsync file descriptor

  • close file descriptor

群贤毕至

访客