Redis相关知识

本文详细介绍了Redis中的数据类型,如String、List(QuickList)、Hash、Set和ZSet,以及Redis的线程模型、事务处理、持久化机制。讨论了Redis在不同数据量下的存储策略,如ziplist和QuickList的使用。此外,还涵盖了Redis的部署方案,包括主从模式、哨兵模式和Redis Cluster。最后,讨论了Redis的过期键删除策略,包括惰性删除、定期删除和内存不足时的清理策略。
摘要由CSDN通过智能技术生成

目录

一、数据类型及使用场景

(2)QuickList

3、Hash

4、set

5、zset

二、Redis

1、redis线程模型

2、redis事务

4、持久化机制

三、部署方案


一、数据类型及使用场景

 

redis是kv存储系统,key为字符串类型,值为redis对象。

由5种常用数据类型:String,List,Hash,Set,ZSet。

1、String

底层编码格式:

  • int:当保存数据时整形(64位long)时,如果是浮点数类型,redis是现将浮点数转为字符串然后再保存;
  • 简单动态字符串。

底层没有直接使用C字符串,而是使用简单动态字符串实现。区别:(1)是二进制安全的,不会遇到'\0'而终止,可以存储图像和序列化对象;(2)结构中有表示长度的字段,获取字符串长度时间复杂度时O(1);(3)空间不足时会自动扩容,大小小于1M时每次扩容一倍空间,大小大于等于1M时,每次扩容1M。惰性空间释放,数据修改导致长度变短时不会立即释放多余空间,而是把多余空间大小记录到free字段中,下次不够时优先使用多余空间,再进行扩容,减少了内存分配开销。

2、List

数据量小时使用ziplist存储,节省内存;当ziplist节点数超过512个,或者单个节点大小超过64字节,就会使用QuikList存储。

(1)ziplist

img ziplist是把节点存放在一块连续内存里,节点内存储上一节点大小和当前节点的大小。不采用双向链表形式是因为(1)链表的前驱和后继指针都占用额外的内存空间,在数据量少的情况下实际数据所占大小还不如指针浪费的多(2)每个链表节点单独分配内存,内存不连续续会产生内存碎片(3)根据局部性原理,连续内存也能更好的命中CPU Cache。

 操作时间复杂度:

  • 头尾压入/弹出操作,查询头尾元素时间复杂度都是O(1);
  • 对于中间元素查找复杂度是O(N),当新增/修改某个元素时内存空间要重新分配,可能会触发连锁更新。
  • 每种redis数据结构都有单独的字段保存该数据长度,因此获取长度是O(1).

ziplist连锁更新:

每个节点都包含一个字段prevlen表示上一节点的所占大小,该字段是变长编码的。当长度小于254时使用1字节存储prevlen,当大于

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值