系列文章目录
Redis01 基础及安装
Redis02-架构及简单使用
Redis03-数据类型:应用及实操
Redis04-进阶使用(管道、发布/订阅)
Redis05-进阶使用(事务)
Redis06-进阶使用(过期 expire)
Redis07-RDB和AOF
Redis架构
首先要明确一个概念:redis是单线程,单实例
那么为什么并发那么多,redis依旧很快呢?因为redis调用了系统内核的epoll
IO发展小插曲:
Linux有内核kernal,客户端进行连接的时候,首先到达的是kernal。我们使用一个线程/进程 进行调用read和write函数。因为socket在这个时期是blocking(阻塞的),遇到高并发,就会阻塞,即我们所说的BIO。
随着kernal的发展,我们可以使用客户端进行轮询访问,即NIO,进线不会阻塞,但还是同步的。
但是,我们如果打进1000个线程访问,那么成本就会很大。所以出现了select,我们可以直接传1000个文件描述符,根据返回,再去调read函数。这个叫做多路复用的NIO。
但是select还是需要全量查询fds,所以就有了epoll。这时候在内存中有一个共享空间。(本质是红黑树+链表+mmap空间映射),我们将1000个文件描述符写进共享空间,如果我们的数据有返回,那么加入链表,我们从链表取出调用read进行读取。epoll是同步,非阻塞的多路复用。
ps:关于IO的系列后续再写
Redis简单使用
## 命令行使用
## 启动redis
service redis_6379 start
## 打开一个redis 客户端
redis-cli
exit ## 退出
redis-cli -7 ## 连接redis7号库
select db ## 选择库(0-16)
keys * ## 查看所有的keys
redis-cli --raw ## 根据编码集对value进行格式化
help @string ## 查询所有string的操作
help @list ## 查询所有list的操作
help @set ## 查询所有set的操作
help @sorted_set ## 查询所有sorted_set的操作
help @hash ## 查询所有hash的操作
set k v ## 设置一个k-v
set k1 v nx ## 只有当k1不存在时候才能操作成功,设置value
set k2 v xx ## 只有当k1存在的时候才能成功,更新value
mset k1 v1 k2 v2 ## 可以进行设置多个值
get k ## 返回一个v,没有返回nil
mget k1 k2 k3 ## 获取多个v
getrange k 0 -1 ## 获取一个索引从start到end,双闭合的区间,redis存在反向索引
setrange k 2 v ## 更新区间范围,我们可以从start的索引开始,更新value数据
del key ## 删除一条kv数据
keys pattern ## 用正则查询key,常用keys *
flushdb ## 清空db 还有一个flushall
append k v ## 给k的数据进行追加v这个数据
type k ## 查看value是什么类型
object encoding k ## 查看v的编码类型