Redis 是一种基于内存的数据库,对于数据的读取都是在内存中操作所以非常快。常用于缓存,消息队列,分布式锁等场景。
Redis 提供了多种数据类型来支持不同的业务场景,比如(String)字符串,(hash)哈希,(List)列表,(Set)集合,(Zset)有序集合。(Bitmap)位图,(HyperLogLog)基数统计,(GEO)地理信息,(Stream)流,并对所有类型都是原子性的,因为执行命令都是单线程执行的,不存在并发竞争的情况。
除此之外,Redis还支持持久化,事务,Lua脚本,多种集群模式(哨兵,主从复制,切片机集群),发布订阅,内存淘汰,过期删除等机制。
都是内存的数据库,一般当缓存使用 都有过期策略 两者性能都非常高
Redis数据结构多于Memcached,Memcached只支持key=>value Redis指数据持久化 Redis原生支持集群化 Redis 支持发布订阅,Lua脚本,事务等功能
直接读取内存中的数据
单机设备的QPS是mysql的10倍。可轻松突破10w。
后期增加的有
struct SDS<t> { T capacity; //数组容量 T len; // 数组长度 byte flags; // 特殊标志位,不用理睬 byte[] content; // 数组内容 }
扩容策略字符串长度小于1M,扩容空间采用加倍扩。当超过1M之后,每次只扩容1M。 不仅可以保存文本数据,还可以保持二进制数据。 获取字符串长度复杂度为O(1)
当元素较少的时候,会使用一块连续内存存储,这个结构是(ziplist)压缩列表。它将所有元素彼此紧挨着一起存储,分配一块连续的内存。 当数据叫多的时候,会改成(quicklist)快速列表。将多个ziplist 用双向链表连接起来。
包含两个hashtable,通常情况下只有一个,但是在扩容缩容的时候,需要重新分配新的hashtable,然后渐进式的搬迁。 渐进式rehash,搬迁操作埋伏在对字典的后续指令之后,还有定时任务搬迁 hash 函数,redis 默认使用 siphash。siphash算法即使在输入key很小的情况下,也可以产生随机性很好的输出。 通常情况下,当元素超过数组的两倍之后就开始扩容,但是如果redis在做bgsave的时候,为了减少内存页,就暂时不会去做扩容处理。但是如果元素超过数组5倍,就会强制扩容。 当元素个数少于数组的10%之后就会执行。
特殊的字典,字典的所有value都是null
如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构; 如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;
本文作者:游戏币
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!