本文内容:

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. asp.net 获取当前,相对,绝对路径

    一.C#获取当前路径的方法: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...

  2. List的Clear方法与RemoveAll方法用法小结

    转自:https://blog.csdn.net/yl2isoft/article/details/17059093 结果分析 执行List的Clear方法和RemoveAll方法,List将清除指定 ...

  3. Java中配置文件的三种配置位置及读取方式

    XML 和properties properties: 1.存放于src根目录下 //获取到同包下的资源文件,将其转换成流对象 //InputStream is= PropertiesDemo.cla ...

  4. idea修改filetype

    settings/editor/file types把不小心改成Text类型的文件的wildcard去掉即可.

  5. tkinter为多个窗口设置相同的icon报错

    import threading import tkinter from PIL import Image, ImageTk def show_window(): window = tkinter.T ...

  6. PHP 数组函数大全

    PHP数组函数是核心的一部分.无需安装即可使用这些函数 函数名称 描述 array_change_key_case 将数组中的所有键名修改为全大写或小写 array_chunk 将一个数组分割成多个 ...

  7. FCC-学习笔记 Spinal Tap Case

    FCC-学习笔记   Spinal Tap Case 1>最近在学习和练习FCC的题目.这个真的比较的好,推荐给大家. 2>中文版的地址:https://www.freecodecamp. ...

  8. SQL Server 使用union all查询多个条件数据合并分组显示,同比统计

    ),a.created_yearmonth,) created_yearmonth, a.countaccount countaccount, a.yxsl yxsl, a.sccdsl sccdsl ...

  9. Centos7 下安装Redis4.0.6

    一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@iZwz991stxd ...

  10. 安装教程-VMware 12 安装Ubuntu 19.04 桌面版

    VMware 12 安装Ubuntu 19.04 桌面版 1.实验描述 在虚拟机中,手动安装 Ubuntu 19.04 操作系统,为学习 Linux 桌面版提供平台,因此,有的参数有些差异,请勿较真. ...