本文内容:

1.Redis服务器保存数据库的方法

2.客户端切换数据库的方法

3.数据库保存键值对的方法

4.数据库的添加,删除,查看,更新操作的实现方法

5.服务器保存键的过期时间的方法

6.服务器自动删除过期键的方法

7.服务器的复制模式

8.数据库通知功能的实现方法

1.服务器中的数据库

1.在redis.h文件中,有一个redisServer的结构体,该结构体中存在一个db数组,数组中存放的是一个个的数据库,为redisDb结构

2.Redis服务器默认会创建16个数据库

2.切换数据库

1.每个Redis客户端都有自己的目标数据库,每当客户端执行对数据库的读写命令时,目标数据库就会成为这些命令的操作对象

2.默认情况下,Redis客户端的目标数据库为0号数据库,但是客户端可以通过select命令来进行数据库切换

3.数据库键空间

键空间:

Redis是一个键值对数据库服务器,一个数据库由一个redisDb结构表示,redisDb结构的dict字典保存了该数据库所有的键值对,我们将这个字典叫做键空间

键空间的每个键都是一个字符串对象

键空间的键对应的值是五种对象中的任意一种(字符串对象,列表对象,哈希表对象,集合对象,有序集合对象)

因为数据库的键空间是一个字典,所以对数据库的增删改查都是在该字典上进行的

4.读写键空间时的维护操作

1.在读取一个键之后,服务器会更具键是否存在来更新服务器的键空间命中次数或者键空间不命中次数

2.在读取一个键后,服务器会更新键的LRU时间,这个时间可以用来计算键的闲置时间

3.如果服务器在读取一个键时发现这个键已经过期,那么服务器会先删除这个过期键,然后才执行其他操作

4.如果客户端使用WATCH命令监视了某个键,那么服务器在对被监视的键进行修改之后,会将这个键标记为脏,从而让事物程序注意到这个键已经被修改过

5.服务器每次修改一个键之后,都会对脏键计数器的值增加1,这个计数器会触发服务器的持久化及复制操作

6.如果服务器开启了数据库通知功能,那么在对键进行了修改之后,服务器将按照配置发生相应的数据库通知

5.过期键删除策略

键的过期时间都保存在过期字典中

三种不同的删除策略:定时删除,惰性删除,定期删除

定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作

惰性删除:放任键过期不管,只有当每次取得键的时候,如果键过期了就删除该键然后进行其他操作

定期删除:每隔一段时间,程序就对数据库进行一次检测,删除里面过期的键,至于删除多少个过期键,检测多少个数据库,则由算法决定

三种删除策略的优劣分析:

1)定时删除:

1.1)对内存友好,但是对CPU时间不友好,在内存不紧张但是CPU时间紧张的情况下,会对服务器的响应时间和吞吐量造成影响

1.2)定时删除需要定时器,每一个键就需要一个定时器,而且当前时间的实现方式是无序链表,查找一个时间事件的复杂度是O(N),这种无序链表的方式不能处理大量的时间事件

因此,要让服务器创建大量的定时器,从而实现定时删除策略的方式不合适,没有被redis采用

2)惰性删除

2.1)对CPU时间友好,但是对内存不友好

2.2)当键空间中存在大量的过期键,但是这些键一直都没有被访问的话,会造成内存泄漏,比如假设存储在redis中的是日志信息

3)定期删除-定时删除和惰性删除的折中策略

每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响

定期策略最难的就是确定删除操作执行的时长和频率

如果删除操作执行的太频繁或者执行的时间太长,那么定期删除策略就会退化成定时删除策略

如果删除操作执行的太少或者执行的时间太短,那么定期删除策略就会退化成惰性删除策略

所以,服务器必须根据自己的情况合理设置删除操作的执行时间和执行频率

redis服务器实际使用的是惰性删除策略和定期删除策略

6.RDB文件以及AOF文件

RDB文件:Redis持久化的一种方式,通过制定好的策略,按期将内存中的数据以镜像的方式转存到RDB文件中

生成RDB文件:已过期的键不会被保存到RDB文件中

载入RDB文件:生成RDB文件的时间和载入RDB文件的时间之间存在一定的时间差,这个时间差可能会导致某些键过期

当服务器以主服务器的模式运行时,那么载入RDB文件中过期的键会被忽略

当服务器以从服务器的模式运行时,那么载入RDB文件中过期的键不会被忽略

AOF文件:存储的是Redis每次执行的写命令

生成AOF文件:当服务器以AOF文件持久化模式运行时,如果数据库中的某个键已经过期,但它还没有被惰性删除或者定期删除,那么AOF文件不会因为这个过期键而产生任何影响,但是当过期键删除,程序会向AOF文件添加一条删除命令,来显示的记录该键已经被删除同时,数据库中包含过期的键不会对AOF的重写造成任何影响

7.服务器的复制模式

当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制,从服务器没有删除键的权利

1)主服务器删除一个过期键之后,会显式的向所有从服务器发送DEL命令,告知从服务器删除这个过期键

2)从服务器在执行客户端命令时,即使遇到过期键也不会处理,而是将过期键当作未过期的键一样使用

服务器采用复制模式的目的就是为了保证主从服务器数据一致性

8.数据库通知

通知功能:可以让客户端通过订阅给定的频道或模式,来获知数据库中键的变化,以及数据库中命令的执行情况

通过分为两类:键空间通知和键事件通知

键空间通知:某个键执行了什么命令

键事件通知:某个命令被什么键执行了

 

Redis学习之Redis服务器数据库实现的更多相关文章

  1. Redis学习笔记~Redis主从服务器,读写分离

    回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...

  2. Redis学习(1)---Redis概述

    什么是NoSQL 概述 NoSQL:Not Only SQL,意思不仅仅是SQL,它是属于非关系型数据库.那什么是关系型数据库?数据结构是一种有行有列的数据库. NoSQL数据库是为了解决高并发.高可 ...

  3. Redis学习笔记-Redis内部数据结构

    Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...

  4. redis学习之——redis.conf配置(基本)文件学习

    # Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...

  5. redis学习笔记-redis的安装

    Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...

  6. redis学习之——在分布式数据库中CAP原理CAP+BASE

    分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建立在网络之上的软件系统.正是因为软件的特性,所以分 ...

  7. Redis学习笔记01--主从数据库配置

    1.创建公共配置文件 所有配置文件添加到以下目录: /xxxx/redis-slave-master 创建公共的redis配置文件,直接使用redis的默认配置文件,修改以下配置项: bind 127 ...

  8. redis学习笔记——Redis过期键的删除策略

    Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...

  9. redis学习系列——redis持久化

    1.写操作的流程 2.RDB快照-redis的第一个持久化策略 第一种是以快照的形式持久化到本地磁盘(RDB文件). 持久化策略是: 1.配置(save N M)在N秒内,redis至少发生M次修改, ...

随机推荐

  1. Java生鲜电商平台-物流配送的设计与架构

    Java生鲜电商平台-物流配送的设计与架构 说明:由于Java开源生鲜电商平台是属于自建物流系统,也就是买家下的单,需要公司派物流团队进行派送.            业务需求中买家的下单时间控制在: ...

  2. mssql附加的数据库查询的时候没有搜索权限

    1.选中数据安全性-登录名-选择某个账户-右键-属性 2.服务器角色-选择public和systemadmin 3.用户映射-选中库-下面选中public 和owner

  3. opencv::KMeans方法概述

    KMeans方法概述 . 无监督学习方法 . 分类问题,输入分类数目,初始化中心位置 . 硬分类方法,以距离度量 . 迭代分类为聚类    //---------- //迭代算法的终止准则 //--- ...

  4. maven 学习---使用Maven构建项目

    要构建一个基于Maven的项目,打开控制台,进入到 pom.xml 文件所放的项目文件夹,并发出以下命令: mvn package 这将执行Maven的“package”阶段. Maven构建生命周期 ...

  5. ConstraintLayout 用法

    当前描述是基于constraint-layout:1.1.2. 一.前言 在以前,android是使用布局如LinearLayout .RelativeLayout等来构建页面,但这些布局使用起来很麻 ...

  6. 为什么我推荐你用 Ubuntu 开发?

    微信.QQ.TIM.企业微信.钉钉等 1.首先需要安装 wine 环境,这里使用到开源的 deepin-wine-ubuntu (项目地址: https://github.com/wszqkzqk/d ...

  7. swift(一)基础变量类型

    import Foundation println("Hello, World!") /* int a; */ var a = //隐式类型转换 a = println(a) le ...

  8. LeetCode——Nth Highest Salary

    Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...

  9. LCD RGB 控制技术讲解 — 时钟篇(上)【转】

    1. 时序图 下面是LCD RGB 控制的典型时序图 天啊,一下就上这玩意,怎么看??? 其实要解释上面的时序图,我们还需要了解一些LCD的显示过程.所以现在只是有个印象,稍后我们详细讲解. 2. L ...

  10. Linux命令——ethtool

    转自:https://www.cnblogs.com/kelamoyujuzhen/p/10116423.html 参考:9 Linux ethtool Examples to Manipulate ...