这篇文章是我个人对redis的一些理解,可以帮助大家系统的认识redis。本文的目标读者是使用过redis,但对redis了解不深的朋友。文章内容以redis为主,也会少量提到memcached。文章从redis的设计目的、工作模式、应用场景等方面阐述,最后会讲解一些具体的应用场景,还会夹带一些代码作为“干货”。
鉴于本人水平有限,文中如有不准确的内容,敬请斧正。
redis是什么
redis是一种内存型的数据存储器,使用场景
- 数据库
- 缓存
- 消息代理(message broker)
同memcached对比
memcached是分布式的内存对象缓存系统,设计意图为通过缓解数据库压力来加快web应用的响应速度。
上面的描述分别被放在了redis和memcached的官网首页最显眼的位置,这也回答了redis和memcached的本质区别。
redis的工作模式
redis的工作模式为单进程,这意味着redis只能利用到一个cpu内核。
redis对请求的处理是串行的,对于同时涌进来的多个请求,redis首先把请求存入队列,按请求到达的先后顺序串行处理。
了解单进程和串行这两个特点,有助于我们使用redis时“扬长避短”。
之前有同事提到过,为何redis不适合存储大块的数据?从redis的工作模式我们可以窥知一二:大块的数据意味着需要较长的io时间,包括内存io和网络的io,cpu资源在io过程中是一直被占用的,这会阻塞其它请求,从而影响redis的整体性能。
数据类型
大家对redis的数据类型已经比较熟悉了,主要有以下5种。
- string
- list
- hash
- set
- sorted set
各种数据类型的常用操作
string
- set,get,setnx,setex,psetex
- 拼接
- 增加、减少(整数型字符串)
- 位操作
list
- 入列,出列(这两个命令都有阻塞模式)
- 按排位获取部分元素
hash
- 设置某个索引
- 获取某个索引
- 增加/减少某个索引的值(整数型字符串)
- 获取所有索引的值
set
集合是一个数学概念,啰嗦提一下:集合中的元素都是唯一的
- 加入元素
- 删除元素
- 检查元素是否在集合
- 获取集合中的元素数量
- 取差集/并集/交集
- 元素转移(从集合a移至集合b)
zset
有序集合,每个元素都有一个分值,用于对元素进行排序
- 取交集/并集
- 获取一个元素的rank
- 获取分值在某个范围内的元素数量
- 获取分值在