redis 数据库

redis server有很多个数据库空间

如下如所示

dbnum表示的是数据库的数量,db指针指向的是一个redisdb数组,默认都是16个,每一个都是一个redisdb结构的数据库,redis client结构里面会有一个redisdb的指针,指向的就是其中的一个数据库

每一个redisdb里面都有一个字典,指向的就是kv结构。

过期时间和生存时间的问题,我们可以通过设置EXPIRE,PEXPIRE 设置时生存时间,精度分别为秒和毫秒

我们也可以通过EEXPIREAT和PEXPIREAT设置过期时间,精度类似

通过TTL和PTTL我们可以知道我们的key的剩余时间

上面4中设置生存和过期的时间,其实最后都是在不断的转换,调用的PEXPIREAT

redisdb中通过expire字典保存了过期时间,键是一个指针,指向redisdb中的键,值是一个longlong,表示的就是unix时间戳。

上图只是一个简化,实际中dict和expires中相同的键只有一个,之间会通过指针指向。节约了内存空间

PERSIST表示的是移除,就是把过期时间删除

过期键的删除策略

(1)定时删除:创建一个定时器,让定时器在键的过期时间来的时候,立刻执行删除操作

节省内存,占用cpu

(2)惰性删除:放任不管,但是当每次操作的时候,都先检查一下,是否过期了,如果过期了就删除

不会对cpu是、产生什么影响,但是大大的浪费了内存,对于一些非常依赖内存的server来说,这是不友好的。如果某些键一直不会被访问,他会一直存在数据库里面,这其实是一种内存泄漏

(3)定期删除:每隔一段时间,都会检查一部分数据库,如果过期就删除

定期删除其实看着可以解决上面两个存在的问题,但是难点在于设置时长和频率,如果设置的长,其实浪费cpu,如果设置的段,其实还会造成内存占用的问题

定期会有一个全局变量current_db表示遍历到了那个数据库,如果全部便利完了,会重置为0,

AOF,RDB复制对过期键的处理

执行SAVE和BGSAVE的时候,我们会生成一个新的RBD,如果键过期的话,不会保存到里面

在启动server的时候,如果server开启了RDB功能,那么在集群中,如果服务器以主服务器模式启动的话,对于过期的不会载入数据库,如果以从服务器模式运行的话,如果数据库键过期的话, 会被载入到数据库中

复制模式下过期键的处理,如果主服务器的键过期了,但是没有指定del,那么从服务器仍然存在,client范文主服务器的过期键没有,但是访问从服务器的过期键还是有的,只有主服务器删除了,才会向所有从服务发一个del命令,所有的从服务器收到了这个命令后,才会删除自己的过期键,这样的话,就实现主从一致的问题

时间: 2024-11-28 23:09:31

redis 数据库的相关文章

centos6.5 64 源码安装redis服务,建立可远程连接的redis数据库

安装环境:centos6.5 64位 使用的包:redis-2.8.19.tar.gz  tcl8.6.3-src.tar.gz 包的下载链接:http://downloads.sourceforge.net/tcl/tcl8.6.3-src.tar.gz http://download.redis.io/releases/redis-2.8.19.tar.gz 本次安装的目录/home/hadoop/redis为任意目录 代码实现: 1,安装需要的支持环境 su root cd /home/h

Ubuntu上使用Redis数据库存储SessionID并实现Session共享

p { margin-bottom: 0.1in; direction: ltr; color: #00000a; line-height: 120%; text-align: left; orphans: 2; widows: 2 } p.western { font-family: "Liberation Serif", serif; font-size: 12pt } p.cjk { font-family: "Noto Sans CJK SC Regular"

Redis数据库各种数据结构的内部实现。

Redis数据库是一种非关系型数据库,基于key/value对,运行时加载到内存,对value支持虚拟内存, 支持多种数据结构,支持持久化,以性能著称,可用于存储,缓存,消息队列等场景.主要介绍下Redis运行时维护的数据结构,以展示其工作方式. 1.总体设计. 首先,Redis没有MySQL那样的索引机制,因为其内建一个基于hash的字典,如下图: Redis 计算哈希值和索引值的方法如下: # 使用字典设置的哈希函数,计算键 key 的哈希值 hash = dict->type->hash

CentOS7安装redis数据库及php-redis扩展

redis 首先把redis安装到服务器中 1.wget http://download.redis.io/redis-stable.tar.gz 下载redis源码 2. tar xvzf redis-stable.tar.gz 解压 3.cd redis-stable 4.make   make的时候可能出现问题,我的就出现了异常 异常一: make[2]: cc: Command not found 异常原因:没有安装gcc 解决方案:yum install gcc-c++ 异常二: zm

node.js应用Redis数据库

node.js下使用Redis,首先: 1.有一台安装了Redis的服务器,当然,安装在本机也行 2.本机,也就是客户端,要装node.js 3.项目要安装nodejs_redis模块 注意第 3 点,不是在本机安装就行了,而是说,要在项目中安装(引用). 方法是,DOS窗口,在项目目录下,输入 npm install redis 这样就将nodejs_redis下载一份,放到当前目录下了.看看,多了一个文件夹:node_modules\redis 编写以下代码,保存到当前目录下\hello.j

NoSQL数据库之Redis数据库:Redis的介绍与安装部署

 NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显的力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展. NoSQL的特点: 特点一: 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准.ACID属性.表结构等等,这

Python学习之使用Python操作Redis数据库

最近在写一个检查一台服务器上所有游戏区服配置文件中redis某个key值大小的脚本,本打算使用shell+awk+sed的方式去解决这个问题,但是由于redis的配置信息是php数组形式.shell脚本一时没有写出来,就请教他人帮忙写了个python脚本,但是自己python不是很精通,于是按照脚本中涉及到的python知识现学现用,然后根据自己的需求更改脚本.这里分享一下如何使用python操作redis数据库. Redis的Python驱动源码下载地址是https://github.com/

C++操作Redis数据库

今天,Mayuyu来学习如何用C++来操作redis数据库.通过hiredis.h接口来实现,目前只能在Linux环境使用. hiredis.h的下载地址为:https://github.com/redis/hiredis 主要包括如下四个方法 1. redisContext* redisConnect(const char *ip, int port) 该函数用来连接redis数据库, 两个参数分别是redis数据库的ip和端口,端口号一般为6379.类似 的还提供了一个函数,供连接超时限定,

redis数据库主从复制

redis数据库 一.安装和配置redis 1.安装redis [[email protected] ~]# wget http://download.redis.io/releases/redis-3.2.8.tar.gz [[email protected] ~]# tar -zxvf redis-3.2.8.tar.gz -C /usr/local/src/ [[email protected] ~]# ln -sv /usr/local/src/redis-3.2.8/ /usr/loc

(Windows Maven项目)Redis数据库的安装和操作实现

Redis是一个内存数据库,他会把你写入当中的数据缓存到内存中,之后会周期性的往磁盘中写入.这篇文章中介绍的是在Windows环境下利用Maven工具编译运行Java文件实现Redis数据库的操作.         首先.我们须要下载Redis工具:http://redis.io/download,之后解压就能够了.我们会看到解压的文件夹下存在着这样一些文件: 当中,两个可运行文件须要考虑,redis-server.exe/redis-cli.exe.它们各自是redis服务和redisclie