Redis学习之Redis服务器数据库实现
本文内容:
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服务器数据库实现的更多相关文章
- Redis学习笔记~Redis主从服务器,读写分离
回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...
- Redis学习(1)---Redis概述
什么是NoSQL 概述 NoSQL:Not Only SQL,意思不仅仅是SQL,它是属于非关系型数据库.那什么是关系型数据库?数据结构是一种有行有列的数据库. NoSQL数据库是为了解决高并发.高可 ...
- Redis学习笔记-Redis内部数据结构
Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...
- redis学习之——redis.conf配置(基本)文件学习
# Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...
- redis学习笔记-redis的安装
Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...
- redis学习之——在分布式数据库中CAP原理CAP+BASE
分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建立在网络之上的软件系统.正是因为软件的特性,所以分 ...
- Redis学习笔记01--主从数据库配置
1.创建公共配置文件 所有配置文件添加到以下目录: /xxxx/redis-slave-master 创建公共的redis配置文件,直接使用redis的默认配置文件,修改以下配置项: bind 127 ...
- redis学习笔记——Redis过期键的删除策略
Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期 ...
- redis学习系列——redis持久化
1.写操作的流程 2.RDB快照-redis的第一个持久化策略 第一种是以快照的形式持久化到本地磁盘(RDB文件). 持久化策略是: 1.配置(save N M)在N秒内,redis至少发生M次修改, ...
随机推荐
- JDK1.8新特性——Optional类
JDK1.8新特性——Optional类 摘要:本文主要学习了JDK1.8新增加的Optional类. 部分内容来自以下博客: https://www.cnblogs.com/1ning/p/9140 ...
- Java面向对象——类的成员
Java面向对象——类的成员 摘要:本文主要介绍了类的常见成员. 属性 属性称为成员变量,一般来讲不用赋值,因为有默认值,另外显式赋值没有意义会导致所有由此类创建对象都是此值. 默认值 Boolean ...
- 好用的APS系统是什么样的?这篇文章来告诉你!
APS系统除了为生产部门提供生产制造的依据,还关系采购计划.安全库存.订单交付等各环节,管理起来十分复杂.一款好用的APS系统,不仅能全面集成生产相关的业务流程,确保生产计划顺畅进行,还能大大提升生产 ...
- map、filter、reduce函数的使用
1.filter() 作用:过滤 // 1.筛选出大于30的数. const array = [10, 20, 30, 40, 50, 60, 70, 80] // 普通写法 // let newar ...
- secruity
security3.x <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns=& ...
- Django Form 的主要内置字段介绍
修改 urls.py,添加 path('field.html', views.field), 在 templates 下创建 field.html, 内容如下: <!DOCTYPE html&g ...
- 【DB_MySQL】MySQL日志分析
MySQL数据库常见的日志有:错误日志(log_error).慢查询日志(slow_query_log).二进制日志(bin_log).通用日志(general_log) 开启慢查询日志并分析 开启慢 ...
- 【分布式搜索引擎】Elasticsearch之开启Elasticsearch的用户名密码验证
一.首先在elasticsearch配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启 xpack.security.ena ...
- 7. Transformer-XL原理介绍
1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...
- jQYERY
1.事件流: (1)事件捕获 (2)处于目标阶段 (3)事件冒泡 2.事件对象 对每一个事件都会回调函数,会有一个默认的事件对象,就是this event.target 触发的目标对象 event.t ...