Redis基础知识总结思维导图,系统的学习Redis。不定时更新。
主要包括:
- 基本数据和应用场景
- 常见问题分析
- 性能优化
- 持久化
- 集群模式
- 子模块
基本知识
基本数据类型和使用场景
基本数据类型
- string
- 二进制安全,可以包含任何数据,一个键最大能存储512M
- hash
- 键值对集合,存储、读取、修改用户属性
- list
- 链表(双向链表),可用于最新消息排行等功能(比如朋友圈的时间线)和消息队列
- set
- 哈希表实现,元素不重复。可用于利用唯一性,统计访问网站的所有独立ip和好友推荐时,根据tag求交集,大于某个阈值就可以推荐
- Sorted sets
- 将Set中的元素增加一个权重参数score,元素按score有序排列。
- 可用于排行榜,带权重的消息队列
- bitmaps
- 通过类似 map 结构存放 0 或 1 ( bit 位 ) 作为值。
- 可用于用户签到,百万用户在线状态统计,千万消费者数据去重。
- HyperLogLogs
- 可以接受多个元素作为输入,并给出输入元素的基数估算值
使用场景
- 缓存数据;
- 最新消息排行等功能(比如朋友圈的时间线);
- 消息队列、带权重的消息队列
- 共同好友
- 好友推荐时,根据tag求交集,大于某个阈值就可以推荐
- 排行榜
- 用户签到
- 百万用户在线状态统计
- 千万消费者数据去重
- 分布式锁
常见问题分析
客户端报错
- Could not get a resource from the pool
- 连接泄露,使用了的连接并未归还到连接池
- 并发量过大,连接池最大连接配置过小
- 存在执行较慢的命令
- Unexpected end of stream
- 多线程访问了Jedis对象,或者pipeline对象
- 客户端缓冲区满了
- 普通客户端缓冲区(normal):普通客户端缓冲区(normal):用于接受普通的命令,例如get、set、mset、hgetall、zrange等
- slave客户端缓冲区(slave):用于同步master节点的写命令,完成复制。
- 发布订阅缓冲区(pubsub):pubsub不是普通的命令,因此有单独的缓冲区。
- ERR illegal address
- ip 端口配置的不对
- ERR max number of clients reached
- 超过了Redis实例配置的最大maxclients
- 服务端maxclient配置过小
- 客户端连接池过多,过大
- 客户端存在连接泄露,服务端没有定时关闭连接
- 超过了Redis实例配置的最大maxclients
- java.net.SocketTimeoutException: Read timed out
- 读写超时设置的过短。
- 有慢查询或者Redis发生阻塞。
- 网络不稳定。
- NOAUTH Authentication required
- 客户端没有传密码
- OOM command not allowed when used memory > 'maxmemory'
- Redis实例内存已经写满,调大maxmemory,不建议大于10G
- LOADING Redis is loading the dataset in memory
- 如果Redis正在加载持久化文件,无法进行正常的读写。
- java.net.SocketTimeoutException: connect timed out
- 连接超时设置的过短。
- tcp-backlog满,造成新的连接失败。
- 客户端与服务端网络不正常。
- Please close pipeline or multi block before calling this method.
- 使用pipeline.syncAndReturnAll()来实现
服务端报错
- psync scheduled to be closed ASAP for overcoming of output buffer limits
- client-output-buffer-limit slave 设置为client-output-buffer-limit slave 0 0 0
性能优化
思维导图:
持久化
思维导图
集群模式
思维导图
子模块
思维导图
内核源码详解
内核部分包括:
- 内核启动过程
内核启动过程
TODO:将思维导图里面的东西总结的更详细。