[toc]
redis
数据结构
image.png
字符串
- setnx可以作为分布式锁的实现方法;
- 内部编码
字符串类型的内部编码有3种:
·int:8个字节的长整型。
·embstr:小于等于39个字节的字符串。
·raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。
哈希表
- 内部编码
- ziplist
- hashtable
当field个数比较少且没有大的value时,内部编码为ziplist:
当有value大于64字节,内部编码会由ziplist变为hashtable:
当field个数超过512,内部编码也会由ziplist变为hashtable:
-
ziplist
image.png
- 场景
- 复杂api频控
列表
- 内部编码
- ziplist
- linkedlist
当元素个数较少且没有大元素时,内部编码为ziplist
当元素个数超过512个,内部编码变为linkedlist:
或者当某个元素超过64字节,内部编码也会变为linkedlist:
- 场景
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
集合
- 内部编码
- intset
- hashtable
当元素个数较少且都为整数时,内部编码为intset:
当元素个数超过512个,内部编码变为hashtable:
当某个元素不为整数时,内部编码也会变为hashtable:
- 场景
- 用户标签
- spop/srandmember=Random item(生成随机数,比如抽奖)
- sadd+sinter=Social Graph(社交需求)
有序集合
- 内部编码
ziplist
skiplist
当元素个数较少且每个元素较小时,内部编码为ziplist:
当元素个数超过128个,内部编码变为skiplist:
当某个元素大于64字节时,内部编码也会变为hashtable:
-
skiplist
image.png
- 场景
- 排行榜
其他
- 纯内存存储、IO多路复用技术、单线程架构是造就Redis高性能的三个因素
- 由于Redis的单线程架构,所以需要每个命令能被快速执行完,否则会存在阻塞Redis的可能,理解Redis单线程命令处理机制是开发和运维Redis的核心之一。
- move、dump+restore、migrate是Redis发展过程中三种迁移键的方式,其中move命令基本废弃,migrate命令用原子性的方式实现了dump+restore,并且支持批量操作,是Redis Cluster实现水平扩容的重要工具。
- scan命令可以解决keys命令可能带来的阻塞问题,同时Redis还提供了hscan、sscan、zscan渐进式地遍历hash、set、zset。