Redis设计与实现

【Redis】Redis的内部设计与实现 Redis 为各种文件事件需求编写了多个处理器,若客户端连接Redis,对连接服务器的各个客户端进行应答,就需要将socket映射到连接应答处理器写数据到Redis,接收客户端传来的命令请求,就需要映射到命令请求处理器从Redis读数据,向客户端返回命令的执行结果,就需要映射到命令回复处理器当主服务器和从服务器进行复制操作时, 主从服务器都需要映射到特别为复制功能编写的复制处理器。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。 阅读详情

转载收藏一下这篇文章

Redis缓存设计 
设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效.  
1) 缓存击穿:对于一些设置了过期时间的key, 刚好过期的时候,这时候有个高并发的请求,会导致直接访问数据库,危险.(批量放入时这么用的)先把缓存更新,再更新数据库。单个的时候先更新数据库,再更新缓存 
2) 缓存穿透:查询一个一定不存在的数据,导致直接访问数据库。 解决方法:如果一个查询返回的数据为空,我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 
3) 缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效。 随机设置过期时间。

Redis五种基本数据结构 
String类型 
这种数据结构的应用举例,设置过期时间,发短信的时候,设置验证码的过期时间。key一定是String类型,此时value用的是String类型。 
List类型 
应用举例:最近访客可以用这种数据结构。采用双端队列的形式。此类型允许重复 
Hash类型 
举例:在一些不确定有多少字段的时候可以使用。 
Set集合 
应用举例:点赞功能实现,就是有喜欢的集合与不喜欢的集合。不允许重复 
Sorted set集合 
应用举例:排名功能命令举例,分别为String类型,list类型, hash类型,hash过期时间设置, set类型, sorted set类型: 
这里写图片描述

redis设计与实现之SDS 
  https://www.jianshu.com/p/b51bde79be25 
  设置过期时间,发短信的时候验证码的过期时间。还可以实现点赞啥的,高并发。  

 private void sendLoginMsgCode(AclUser aclUser, String sid) {
        long start = System.currentTimeMillis();
        String code = String.valueOf(Math.round(Math.random() * (899999) + 100000));
        String smsMsg = String.format(Constants.MOBILE_CODE_FORMAT, code);
        LOG.info(smsMsg);
      sendMessageService.sendMessage(aclUser.getMobile(), smsMsg);
        final int smsType = 16021;
        smsMsg=code;
        smsPageonService.sendMessage(aclUser.getMobile(), smsMsg,smsType);
        ssoCacheService.setObject(smsKey(sid), 300, code);
        userService.saveMessageCode(aclUser.getLoginName(), smsMsg);
        LOG.info("sendLoginMsgCode {}", System.currentTimeMillis() - start);
}




redis设计与实现之双端队列 
  https://www.jianshu.com/p/e57e126c81c7 
  代码实践:redis list将缓存进行排序,过期的则清掉

private void saveLoginLogCache(String username){
        LoginLogCache loginLogCache = new LoginLogCache();
          loginLogCache.setIp((String)TraceContext.get(Constants.CONTEXT_IP_KEY));
        loginLogCache.setTime(System.currentTimeMillis());
        short type = (short)LoginLogType.USERNAME.getIndex();
        if(TraceContext.get(Constants.CONTEXT_LOGIN_TYPE_KEY) != null){
            type = ((Integer)TraceContext.get(Constants.CONTEXT_LOGIN_TYPE_KEY)).shortValue();
        }
        loginLogCache.setType(type);
        loginLogCache.setUa((String)TraceContext.get(Constants.CONTEXT_UA_KEY));

        long start = System.currentTimeMillis();
        ssoCacheService.lpushObject(buildLoginLogKey(username), loginLogCache);
        ssoCacheService.expire(buildLoginLogKey(username), LOGIN_LOG_EXPIRE);
        ssoCacheService.ltrim(buildLoginLogKey(username), 0, LOGIN_LOG_MAX_SIZE - 1);

        LOG.info("UserLogService.saveLoginLogCache " + (System.currentTimeMillis()-start));
}


redis设计实现之字典 
  这里写图片描述
  dict中 
  1) rehashidx=-1表示不需要再rehash 
   2) iterators记录当前dict中的迭代器数,主要是为了避免在有迭代器时rehash,在有迭代器时rehash可能会造成值的丢失或重复,这就跟在for循环删除增加元素一个道理 
   3)dictType *type;   一些函数 
   4) void *privdata;  一些私有数据 这两个是为了创建多态类型的键值对做准备的. 
   dictht中 
   1) size表示大小 
  2)used表示使用数,sizemask表示hash表大小掩码总是等于size-1用于计算数组索引值.具体的在hash算法中给出 
  3) table为dictEntry **类型 
  dictEntry中 
  存了key,value还有指向dictEntry 类型的指针.链表法解决hash冲突. 
  哈希算法: 
  计算索引位置 
  hash=dict->type->hashFunction(key); 这个函数返回值类型是 unsigned int 就是无符号型的int 
index=hash&dict->ht[x].sizemask . 
  加入新加一个k0,v0 计算出hash=8, 那index= 8&3 =0; 
  当Index值相同时就会产生hash冲突,这时候就采用链地址法解决. 
  rehash: 
  rehash之前: 
  这里写图片描述
  加入现在要拓展到8,那将会变成: 这中间其实是先拓展ht[1] 再将ht[0]复制到ht[1],清空ht[0],再将ht[1]设置成ht[0]方便下次拓展. 
  这里写图片描述
  服务器拓展的时机是跟数据持久化操作有关.下回分解. 
  渐进式rehash 
  由于ht[0]比较大的时候整体rehash会造成服务器出问题所以,会渐进的rehash,比如渐进4个rehashidx会从-1 变到0,1,2,3再到-1 
  这时候就可以进行增删操作,查找时是先找ht[0]再找另外个,增加是增加ht[1]里面的. 
  hash当那些键比较小的时候可以用压缩列表来做. 
sorted set 跳跃表作为底层实现 
从链表开始谈起 
这里写图片描述
 在只有底下一层链表的情况下,如果我们要查找23这个数字时间复杂度是O(n),在加了第二层的情况,查找的情况可以等同于一个二分查找,但是这种结构在插入一个节点的时候会打乱这种严格的2:1关系. 
 跳表 
 这里写图片描述
 跳表在插入数据时层数是随机生成,而且新插入一个节点不会影响其它节点的层数。因此,插入操作只需要修改插入节点前后的指针,而不需要对很多节点都进行调整。实际上,这是skiplist的一个很重要的特性,这让它在插入性能上明显优于平衡树的方案。这在后面我们还会提到。 
  结构分析 
  跳表结构总览 
 这里写图片描述
 节点结构  
 其中跨度是用来计算排名的,排名根据score和对象大小排出来: 
 这里写图片描述
 管理节点的结构  
 其中结算最高节点的高度是不包括头节点,当计算某个分数的逆排名就可以用总长度减去正排名: 
 这里写图片描述
 zadd命令举例分析 
 插入的源码:  

for (i = zsl->level-1; i >= 0; i--) {
        while (x->level[i].forward &&
            (x->level[i].forward->key < key ||
                (x->level[i].forward->key == key &&
                x->level[i].forward->value < value))) {
            x = x->level[i].forward;
        }
        update[i] = x;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  跳表的查找,插入  
  在查找到该插入的地方之后,只需要改动前后节点的指针就好了,这比红黑树效率高 
 这里写图片描述
  删除过程可以想象,跳表是如何保证在插入的过程中保持比红黑树高效? 
  首先,每个节点肯定都有第1层指针(每个节点都在第1层链表里)。 
  如果一个节点有第i层(i>=1)指针(即节点已经在第1层到第i层链表中),那么它有第(i+1)层指针的概率为p。 
  节点最大的层数不允许超过一个最大值,记为MaxLevel(超过配置文件里面的这个值时,会变成跳表+字典)。 
 * 这种概率能够保证性能的粗略概括就是(从爬k层所要查找的平均步数分析) 
首先分析出一个节点平均层数,泰勒展开可证: 
 
现在很容易计算出: 
当p=1/2时,每个节点所包含的平均指针数目为2; 
当p=1/4时,每个节点所包含的平均指针数目为1.33。这也是Redis里的skiplist实现在空间上的开销 
  其次现在假设我们从一个层数为i的节点x出发,需要向左向上攀爬k层(从已经找到的位置开始逆向考虑,参考光的可逆性)。这时我们有两种可能: 
    如果节点x有第(i+1)层指针,那么我们需要向上走。这种情况概率为p。 
    如果节点x没有第(i+1)层指针,那么我们需要向左走。这种情况概率为(1-p)。 
  用C(k)表示向上攀爬k个层级所需要走过的平均查找路径长度(概率期望),那么: 
    C(k)=(1-p)(C(k)+1) + p(C(k-1)+1) //移项 
    C(k)=1/p+C(k-1) 
    C(k)=k/p 
  这就是说每爬一层,平均查找长度为1/p. 
   总的来说,第1层链表固定有n个节点;第2层链表平均有n*p个节点;第3层链表平均有n*p2个节点;第k层有n*pk个节点,即为n/(1/p)k,可以对比二分查找,第一次n,第二次n/2,第k次n/2k,二分查找的时间复杂度为log n(这种类比是简要类比,实际更复杂可参考William Pugh的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》),则需要查找平均个数为log(1/p) (n),而爬一层需要查找长度为1/p所以总的平均查找为C(log(1/p) (n)*1/p)=log(1/p) (n)*1/p;可以简单理解为log n 利用log (a) (b)=log x b/log x a; 分母理解为常数 
与红黑数对比 
skiplist和各种平衡树(如AVL、红黑树等)的元素是有序排列的,而哈希表不是有序的。因此,在哈希表上只能做单个key的查找,不适宜做范围查找。所谓范围查找,指的是查找那些大小在指定的两个值之间的所有节点。 
在做范围查找的时候,平衡树比skiplist操作要复杂。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在skiplist上进行范围查找就非常简单,只需要在找到小值之后,对第1层链表进行若干步的遍历就可以实现。 
Redis 数据库 
  这里写图片描述
  Redis 使用的策略: 
  Redis 使用的过期键删除策略是惰性删除加上定期删除, 这两个策略相互配合,可以很好地在合理利用 CPU 时间和节约内存空间之间取得平衡。 
总结: 
  1)数据库主要由 dict 和 expires 两个字典构成,其中 dict 保存键值对,而 expires 则保存键的过期时间。 
  2)据库的键总是一个字符串对象,而值可以是任意一种 Redis 数据类型,包括字符串、哈希、集合、列表和有序集。 
  3)expires 的某个键和 dict 的某个键共同指向同一个字符串对象,而 expires 键的值则是该键以毫秒计算的 UNIX 过期时间戳。 
  4)Redis 使用惰性删除和定期删除两种策略来删除过期的键。 
  5)更新后的 RDB 文件和重写后的 AOF 文件都不会保留已经过期的键。 
  6)当一个过期键被删除之后,程序会追加一条新的 DEL 命令到现有 AOF 文件末尾。 
  7)当主节点删除一个过期键之后,它会显式地发送一条 DEL 命令到所有附属节点。附属节点即使发现过期键,也不会自作主张地删除它,而是等待主节点发来 DEL 命令,这样可以保证主节点和附属节点的数据总是一致的。 
  8)数据库的 dict 字典和 expires 字典的扩展策略和普通字典一样。它们的收缩策略是:当节点的填充百分比不足 10% 时,将可用节点数量减少至大于等于当前已用节点数量。 
RDB持久化 
RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。 RDB保存方式有save,bgsave命令,检查save选项所设置(save 900 1 每隔900秒…)的保存条件是否已经满足,如果满足的话,就执行BGSAVE命令(不会阻塞) 
SAVE命令会阻塞Redis服务器进程,BGSAVE命令会派生出一个子进程。 
RDB与AOF的执行时机,RDB的回复时机。 
这里写图片描述 
在BGSAVE命令执行期间,服务器处理SAVE、BGSAVE、BGREWRITEAOF三个命令的方式会和平时有所不同: 
服务器禁止SAVE命令和BGSAVE命令同时执行是为了避免父进程(服务器进程)和子进程同时执行两个rdbsave调用,防止产生竞争条 
BGREWRITEAOF和BGSAVE两个命令的实际工作都由子进程执行,不能同时执行它们只是一个性能方面的考虑–并发出两个子进程,并且这两个子进程都同时执行大量的磁盘写入操作。 
RDB文件结构: 
REDIS db_version databases EOF check_sum. 
AOF持久化 
AOF 文件的生成过程具体包括命令追加,文件写入,文件同步三个步骤。 
Redis 打开 AOF 持久化功能后,Redis 在执行完一个写命令后,都会将执行的写命令追回到 Redis 内部的缓冲区的末尾。 
接下来,缓冲区的写命令会被写入到 AOF 文件,这一过程是文件写入过程。对于操作系统来说,调用write函数并不会立刻将数据写入到硬盘,为了将数据真正写入硬盘,还需要调用fsync函数,调用fsync函数即是文件同步的过程。只有经过文件同步过程,AOF 文件才在硬盘中真正保存了 Redis 的写命令。appendfsync 配置选项正是用来配置将写命令同步到文件的频率的。 
AOF重写:由于 Redis 会不断地将被执行的命令记录到 AOF 文件里面,所以随着 Redis 不断运行,AOF 文件的体积会越来越大。另外,如果 AOF 文件的体积很大,那么还原操作所需要的时间也会非常地长。 
AOF优缺点: 
AOF 持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis 最多也就丢失 1 秒的数据而已。 
AOF 文件使用 Redis 命令追加的形式来构造,因此,即使 Redis 只能向 AOF 文件写入命令的片断,使用 redis-check-aof 工具也很容易修正 AOF 文件。 
AOF 文件的格式可读性较强,对于具有相同数据的的 Redis,AOF 文件通常会比 RDF 文件体积更大。 
虽然 AOF 提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。但在 Redis 的负载较高时,RDB 比 AOF 具好更好的性能保证。 
RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,因此从理论上说,RDB 比 AOF 方式更健壮。 
Redis事件 
文件事件(socket通信的时候),时间事件(执行定期函数的时候) 
主从复制 
Sentinel高可用性

Redis设计与实现_redis设计与实现_ redis设计与实现 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。 立即下载

相关推荐

【强化学习的数学原理-赵世钰】课程笔记(一)基本概念

在B站上学习强化学习的课程笔记,笔记非常详细清晰,会持续更新

qq_64671439的博客 1万+

redis的设计与实现

redis已经变成了后端必用数据库

qq_52286612的博客 3153

道岔故障监测系统设计(源码+开题)

通过实时监控道岔的工作状态,系统能够及时发现异常情况,预防潜在的安全隐患,从而减少事故发生的概率。此外,监测系统还能够为维护人员提供详细的数据支持,帮助他们更准确地判断道岔的磨损程度和故障类型,优化维修计划,延长道岔的使用寿命。随着智能化、自动化技术的发展,道岔故障监测系统的设计与应用也将推动铁路行业的技术进步,为实现智能铁路和未来交通系统的构建奠定基础。因此,开展道岔故障监测系统的设计研究,不仅具有重要的工程实践价值,也有助于推动铁路运输行业向更高水平的发展。

灵军程序设计 771

redis设计与实现

redis设计与实现,redis原理以及redis使用的时候常见问题和解决方案

u012588879的专栏 742

基于HPM5E00的EtherCAT从站开发实战:从硬件解析到软件调试

实时工业以太网通信是工业自动化与运动控制领域的核心技术,它通过硬件与协议栈的协同,实现了微秒级的高确定性数据交换。其技术价值在于为多轴同步、机器人控制等复杂场景提供了高实时性、高同步精度的通信基础。在应用场景上,广泛服务于数控机床、包装机械、半导体设备等高端制造领域。本文聚焦于EtherCAT从站开发,深入解析了基于先楫HPM5E00高性能MCU与专用从站控制器(ESC)的硬件架构设计,并详细阐述了开源协议栈SOES的移植、对象字典配置以及过程数据(PDO)映射等核心软件实践,为开发者快速构建稳定可靠的实时

weixin_30915951的博客 501

机器学习参数寻优:方法、实例与分析

机器学习模型的性能很大程度上依赖于其参数的选择。参数寻优(Hyperparameter Tuning)是提升模型表现的关键步骤之一。本文将详细介绍主流的参数寻优方法,包括网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesian Optimization)、和超参数优化库(如Optuna和Hyperopt)等,并探讨它们的优缺点及适用场景。

甜盐的博客 2840

Redis的设计与实现(进阶篇)

如果开启多线程,至少要4核的机器,且Redis实例已经占用相当大的CPU耗时的时候才建议采用,否则使用多线程没有意义。Redis不能这样,因为每一次获取系统时间戳都是一次系统调用,系统调用相对来说是比较费时间的,作为单线程的Redis承受不起,所以它需要对时间进行缓存,由一个定时任务,每毫秒更新一次时间缓存,获取时间都是从缓存中直接拿。Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。

爱晴禹 1081

C语言新手必练:10个实战小项目带你快速上手(附完整代码)

本文为C语言初学者精选10个实战项目,从基础的温度转换器到高级的迷宫求解算法,涵盖输入输出、条件判断、循环控制、数组操作等核心知识点。每个项目配有完整代码和详细解析,帮助新手通过实践掌握编程思维,特别适合刚学完语法但缺乏实战经验的学习者。

weixin_29208077的博客 736

Redis 设计与实现

• 订阅模式的信息由服务器进程维持的redisServer.pubsub_patterns 链表保存,链表的每个节点都保存着一个pubsubPattern 结构,结构中保存着被订阅的模式,以及订阅该模式的客户端。• 带WATCH 命令的事务会将客户端和被监视的键在数据库的watched_keys 字典中进行关联,当键被修改时,程序会将所有监视被修改键的客户端的REDIS_DIRTY_CAS 选项打开。• 数据库的dict 字典和expires 字典的扩展策略和普通字典一样。

谜底的博客 808

新手避坑指南:从GEO数据库下载单细胞测序数据的5个关键步骤(附实操截图)

本文为单细胞测序数据下载新手提供5个关键避坑步骤,涵盖数据搜索准备、样本量评估、文件选择决策、元数据诊断及高效下载技术。通过实操截图和代码示例,帮助研究者快速锁定GEO数据库中的优质单细胞测序数据,避免常见错误。

weixin_30296405的博客 658

lammps案例:热导率模拟案例讲解(NEMD方法)

lammps计算热导率大体可以分为三种方法:EMD、NEMD、rNEMD。 本文介绍非平衡模拟(NEMD)热导率的计算方法。 NEMD下热导率计算公式为: k=dQ*dZ/dt k:热导率 dQ:能量通量。 dT/dZ:温度梯度。 非平衡态下计算热导率的原理是在材料的两端或者中间设置热源和冷源。 在热源输入热量,在冷源抽取等量的热量,在这个过程中计算材料内部会有热量的传递,产生温度梯度。 在lammps模拟中得到能量通量和温度梯度,代入公式即可求得热导率。 热量的输入方式有多种,如fix langevin

lammps_jiayou的博客 1万+

Redis 设计与实现 — Redis 设计与实现

Redis 设计与实现 — Redis 设计与实现Redis 设计与实现

weixin_33809981的博客 251

【EB_Tresos专题】-01-EB Tresos导入工程

<--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ...

「汽车电子助手」的博客 6433

Redis设计与实现-集群

如有侵权,请联系~如有错误,也欢迎批评指正~本篇文章大部分是来自学习《Redis设计与实现》的笔记。

m0_50149847的博客 1217

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Redis设计与实现之事务

一:Redis设计与实现之事务

li-zhang-yu的博客 169

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Redis设计与实现 - 书签补全版

Redis设计与实现 - 书签补全版 【下载地址】Redis设计与实现-书签补全版 - **文件名**: 《Redis设计与实现》.(黄健宏).[大部分标记书签].pdf- **文件类型**: PDF- **文件大小**: [文件大小]- **文件描述**: 该PDF文件在原书的基础上,补全了大部分重要章节的详细书签,方...

gitblog_06609的博客 502

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Redis设计与实现之复制

一:Redis设计与实现之复制

li-zhang-yu的博客 149

Redis设计与实现思维导图

读完Redis设计与实现,把知识点大概整理了下,但是哨兵、集群、Lua脚本理解不够。

ABOOMMMMM的博客 239

Redis设计与实现之客户端

一:Redis设计与实现之客户端

li-zhang-yu的博客 173

《Redis设计与实现》全面知识整理

最近在看Redis的实现原理,看到《Redis设计与实现》这本书,发现这本书对Redis的讲解可以说是很透彻了,不仅从Redis的设计方案以及其各种功能是如何实现的,均有很清晰的讲解 通过看这本书,能够很清晰的对Redis的整体结构有很清晰的了解。最近我花费了三四天将这本书的知识点整理出来了,希望能让大家对Redis的整体认识有一定提升。 整理的是一个xmind文件格式,知识点很多,很多都合起来了,大家可以下载下来看看。示例图: Redis知识整合梳理: ...

落尘 309

Redis设计与实现-数据结构

redis中的字符串都是简单动态字符串(SDS)的形式存在的。不止是set key value的键和字符串值value,连其他数据结构中存储的字符串也是以SDS形式存储,如rpush fruits "apple " “banana”,队列保存的中的"apple " "banana"两个字符串元素也是SDS存储。SDS除了保存字符串以外,还用在缓冲区:AOF缓冲区、客户端输入输出缓冲区。int len;// 字符串的长度(已使用的字节数)int free;// 未使用的字节数(空闲空间)

m0_50149847的博客 1285

Redis设计与实现之发布与订阅

一:Redis设计与实现之发布与订阅

li-zhang-yu的博客 174

Redis设计与实现-引言

本文主要是作为自己的读书笔记,以便对知识进行总结,日后可以快速回忆相关内容 书名:《Redis设计与实现》 网站:http://www.redisbook.com 正版图书购买链接:京东 这本书主要讲解了Redis内部机制与实现方式,对redis大多数单机功能以及舵机功能的实现原理记性了介绍。 本书共分为四部分: 第一部分:数据结构域对象 介绍了Redis中各种对象以及数据结构,并说明这些数据结构如何影响对象的功能和性能 第二部分:单机数据库实现 包括数据库实现原理(包括键值对的存储方法、对过期时间

weixin_43987610的博客 232
上一篇: 再谈PHP错误与异常处理(转载)
下一篇: 数据库常见索引解析(B树,B-树,B+树,B*树,位图索引,Hash索引)
Tim_PHPer
博客等级 码龄11年 227粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值