参考资料:
http://www.dengshenyu.com/%E5%90%8E%E7%AB%AF%E6%8A%80%E6%9C%AF/2016/01/09/redis-reactor-pattern.html
http://www.redis.cn/topics/data-types.html
http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html
https://toutiao.io/posts/546542/app_preview
http://ifeve.com/redis-persistence/
0. 环境
Redis server: 3.0.3
1. 数据类型
- 字符串(Strings)
字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据。一个字符串类型的值最多能存储512M字节的内容。
- 列表(Lists)
Redis列表是简单的字符串列表,按照插入顺序排序。
- 集合(Sets)
Redis集合是一个无序的字符串合集。添加、删除以及测试元素是否存在操作的时间复杂度为O(1)。
- 哈希(Hashes)
Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象的数据类型。
- 有序集合(Sorted sets)
Redis有序集合和Redis集合类似,是不包含相同字符串的合集。但每个有序集合的成员都关联着一个评分,这个评分用于把有序集合中的成员按最低分到最高分排列。
- Bitmaps 和 HyperLogLogs
Redis同样支持Bitmaps和HyperLogLogs数据类型,实际上是基于字符串的基本类型的数据类型,但有自己的语义。
2. Redis为什么速度快?
- 完全基于内存
- 单线程:CPU无需在多个线程之间来回切换
- I/O多路复用技术:异步非阻塞IO,既不会因为线程过多导致CPU频繁切换,又能充分利用服务器资源
3. Redis超时可能的原因及应对方法?
- 慢查询:确认是否使用慢查询,可以使用slowlog get num(例如slowlog get 10)查看相应的慢命令
- 内存不足:由于Redis完全基于内存,故内存使用率指标需要关注
- 连接客户端数量过多:连接客户端数量超过默认值容易导致超时
- 若redis主机为虚拟机,可能会有内存延迟:./redis-cli --intrinsic-latency 100这个命令可以在server端判断redis是否有延迟,在客户端通过-h -p 参数可以对比是否为网络导致的延迟
- 大量的删除、过期以及淘汰(由maxmemory-policy控制的)的大对象操作,需要释放相应的RAM,可能会造成redis阻塞,进而造成相应的延迟:若经常有比较大的对象进行删除、过期和淘汰,建议将这些对象分割成一些小对象。
- 持久化可能导致延迟,若数据集大的话,Redis启动持久化子进程很耗时,其间Redis可能短暂停止服务客户端:选择更合理的持久化方案,例如AOF + fsync every second
4. Redis持久化及其优缺点
- RDB持久化:可以在指定的时间间隔内生成数据集的时间点快照
- AOF持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集
优点 | 缺点 | |
RDB |
|
|
AOF |
|
|
5. Redis与Memcached的区别
- 实现机制不同:Redis单进程单线程,Memcached单进程多线程
- 持久化策略不同:Redis支持持久化,Memcached必须借助外部工具才能实现持久化
- Redis功能比Memcached更强大,Redis不仅仅是内存数据库(例如可利用Pub/Sub实现发布订阅的消息中间件),而Memcached仅仅是内存数据库