Redis学习笔记(持续更新中...)


Redis的应用非常广泛,现在互联网公司基本都有用到。Redis可以用作数据库,缓存,以及消息中间件。下面会分几个章节,对Redis作详细介绍

一、Redis简介

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

二、Redis的存储类型

1.字符串类型

Redis中最基本的数据类型,可以存储任何形式的字符串,包括二进制数据。一个字符类型件允许存储的最大容量是512M

内部数据结构

String类型通过int,SDS(simple dynamic string)作为存储结构,int用来存放整型数据,SDS用来存放字符串,字节,浮点型数据。在Redis源码中,为SDS定义了5sdshdr类型。

struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len;     //表示当前sds的长度(单位是字节)
    uint8_t alloc;  //表示已为sds分配的内存大小(单位是字节)
    unsigned char flags; //用一个字节表示当前sdshdr的类型,因为有sdshdr有五种类型,所以至少需要3位来表示000:sdshdr5,001:sdshdr8,010:sdshdr16,011:sdshdr32,100:sdshdr64。
    char buf[];    //sds实际存放的位置
};

以上只是其中一种,还有sdshdr5,sdshdr16,sdshdr32,sdshdr64,目的是为了满足不同长度字符串可以使用不同大小的Header,从而节省内存。

2.列表类型

列表类型可以存储有序的字符串列表,常用的操作是想列表两端添加元素或者获得某一片段。

内部数据结构

Redis3.2之前,list底层是采用ziplist加linkedlist,当数据量或元素长度小的时候会用ziplist减小内存占用,否则会用linkedlist
Redis3.2之后,list底层会采用quicklist,只是每个节点ziplist,其实就是ziplist和quicklist,结构图如下:
在这里插入图片描述

3、hash类型

在这里插入图片描述

内部数据结构

dictEntry

维护一个key-value的值,同时保留相邻元素的指针,用来维护哈希桶的内部链

typedef struct dictEntry {
void *key;
union {                  //因为value有多种类型,所以value用了union来存储
	void *val;
	uint64_t u64;
	int64_t s64;
	double d;
} v;
struct dictEntry *next;  //下一个节点的地址,用来处理碰撞,所有分配到同一索引的元素通过next指针链接起来形成链表key和v都可以保存多种类型的数据
} dictEntry;
dicht

哈希表的核心,实现一个hash表会使用一个buckets存放dictEntry的地址,一般情况下通过hash(key)%len得到的值就是buckets的索引,这个值决定了我们要将此dictEntry节点放入buckets的哪个索引里,这个buckets实际上就是我们说的hash表。dict.h的dictht结构中table存放的就是buckets的地址

typedef struct dictht {
	dictEntry **table;     //buckets的地址
	unsigned long size;    //buckets的大小,总保持为 2^n
	unsigned long sizemask;//掩码,用来计算hash值对应的buckets索引
	unsigned long used;    //当前dictht有多少个dictEntry节点
} dictht;
dict

只有一个dictht还不够,比如rehash、遍历hash等操作,所以redis定义了一个叫dict的结构以支持字典的各种操作,当dictht需要扩容/缩容时,用来管理dictht的迁移。

typedef struct dict {
	dictType *type;  //dictType里存放的是一堆工具函数的函数指针,
	void *privdata;  //保存type中的某些函数需要作为参数的数据
	dictht ht[2];    //两个dictht,ht[0]平时用,ht[1] rehash时用
	long rehashidx;  //当前rehash到buckets的哪个索引,-1时表示非rehash状态
	int iterators;   //安全迭代器的计数。
} dict;
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis全套学习笔记.pdf》是一本关于Redis数据库的学习笔记,内容涵盖了Redis的基本概念、原理、操作、应用等方面的知识。 首先,Redis是一种开源的内存数据库,它具有高性能、高可用性和高扩展性的特点。它可以用于缓存、消息队列、实时排行榜等场景,广泛应用于Web应用开发、大数据存储和分析等领域。 在学习笔记,首先介绍了Redis的基本概念,包括数据结构、持久化、单线程架构等方面的知识。数据结构包括字符串、哈希表、列表、集合和有序集合等,笔记详细介绍了它们的特点和使用方法。持久化方面,介绍了RDB快照和AOF日志两种持久化方式的原理和使用方法。同时,笔记也解释了为什么Redis选择单线程架构以及如何充分利用单线程的优势。 其次,学习笔记还包括了Redis的常用操作,例如数据的增删改查、事务和管道操作、过期时间设置等。这些操作是使用Redis进行开发和使用时必不可少的知识点,通过学习笔记可以快速掌握这些操作的使用方法。 此外,学习笔记还涉及了Redis的高级应用,如发布订阅、Lua脚本、事件通知等。这些高级应用可以帮助开发者更好地利用Redis的功能和特性,提升系统的性能和稳定性。 综上所述,《Redis全套学习笔记.pdf》是一本全面介绍Redis学习资料,通过学习这本笔记,读者可以了解Redis的基本概念和原理,掌握Redis的常用操作和高级应用,从而更好地使用Redis进行开发和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值