API使用
- 安装Redis后大部分场景都是使用它的API(命令)
- 通用命令
- 数据结构和编码
- 单线程架构
通用命令
keys [pattern]
- 扫描所有键值对,
keys *
打印出全部的键,pattern是正则表达式 - 在生产环境不要随意使用,影响性能
- 什么时候使用?热备从节点和
scan
- 扫描所有键值对,
dbsize
- 得到key的总数
- 有个计数器在实时计数
exists key
- 判断键是否存在
- 一般可以任意使用
del key [...]
- 删除键,可一次删除多个
expire key seconds
- 设置键的过期时间(秒)
persist key
在过期之前可以取消设置的过期时间
type key
- 查看键值的类型
- 查看键值的类型
数据结构
- 概览
- 字符串
- 就是
value
的类型为字符串,一个key的value上限是512M,但一般100K以内 - 场景:缓存、计数器、分布式锁
- 计数器:从1开始
- 如果存在,
incrby
会加上之前的计数值 - 案例:缓存视频的基本信息(数据源在MySQL),后面是伪代码
- 案例:多线程并发获取唯一自增ID,使用
incr
即可
- 其他API
setnx
,在指定的 key 不存在时,设置指定的值setxx
,当指定的 key 存在时,设置指定的值(覆盖),默认的set是无则创建,有则改之mget
,一次获取多个 key,节省网络请求开销(n次和1次的区别);但是在服务端的复杂度是O(n),使用时需要节制!mset
,一次设置多个 key- 还有
getset append strlen
等
- 了解即可
- 就是
- 哈希
- 特点:value也由键值对组成,或者说
filed:value
,或者说MapMap的结构 - API
hlen
返回filed的数量
- 案例:记录每个用户的访问量,
hincrby user:1 pageviewnumber count
- 其他API:
- 谨慎使用
hgetall
,因为一个key中可能包含大量field:value - 案例:更新用户信息
- 使用string实现,value中全部保存为json格式的字符串
- 也可以将各个字段拆成各个key,比较浪费内存
- 使用hash实现,直观,可以节省空间,实现部分更新
- 特点:value也由键值对组成,或者说
- 列表
- 有序(按照插入顺序排序)、元素可重复,默认是字符串类型的value
ltrim key start end
,只保留指定取件的元素(包头包尾)- 从左侧或右侧都可以操作,这很方便
- 其他API:
- 实现常见结构:
- 有序(按照插入顺序排序)、元素可重复,默认是字符串类型的value
- 集合(set)
- 特点:无序、无重复(一个key里面的值不允许重复)
- 注意
smembers
有可能阻塞 - 案例:给用户添加标签,给标签添加用户(避免重复)
- 集合间交差并集:
- 差集就是前者有后者无的
- 特点:无序、无重复(一个key里面的值不允许重复)
- 有序集合(zset)
- 特点:类似hash,value由
score:value
组成(score用来排序),无重复
- 对比set
- 常用API
- 案例:排行榜(书籍、电影、音乐),这里可以通过控制score实现?
- 特点:类似hash,value由
单线程
- Redis是单线程模型,所有操作都是串行的
- 单线程为什么这么快?
- 纯内存(主要原因)
- 非阻塞IO(epoll),同时监听多条请求,基本上reday即可go
- 避免线程切换
- 一次只运行一条指令,拒绝慢命令