一.  概述

  对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解。下面再了解类型检查,内存回收,对象共享,对象的空转时长。

  1.1   类型检查与命令多态

    redis中用于操作键的命令基本上可以分为两种类型,一种是可以对任何的键执行,如:del, expire,rename,type,object 这些命令等,对于这些命令属于多态命令。另一种命令只能针对特定类型的键执行,如:

Set, get, append, strlen 等命令只能对字符串键执行

Hdel,hset,hget,hlen 等命令只能对哈希键执行

Rpush, lpop, linsert,llen 等命令只能对列表键执行

Sadd, spop, sinter,scard 等命令只能对集合键执行

Zadd,zcard,zrank,zscore 等命令只能对有序集合键执行

  1.2. 内存回收

    在c语言中并不具备自动内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数来实现内存回收机制,通过这一机制,程序可以跟踪对象的引用 计数信息,在适当的时候自动释放对象并进行内存回收。

    每个对象的引用计数信息由redisObject结构的refcount属性记录。对象的引用计数信息会随着对象的使用状态而不断变化:

      (1)在创建一个新对象时,引用计数的值会被初始化为1;

      (2)当对象被一个新程序使用时,它的引用计数值会加 1;

      (3) 当对象不再被一个程序使用时,它的引用计数值会减1;

    当对象的引用计数值变为0时,对象所占用的内存就会被释放。OBJECT REFCOUNT <key> 返回给定 key 引用所储存的值的次数。此命令主要用于除错。

  1.3  对象共享

    上面讲到了refcount属性,除了对象引用计数,还有对象共享的作用。假设键A创建了一个包含整数值100的字符串对象作为值对象,键B也要保存一个同样的值,那么在redis中,会让多个键共享同一个值对象,来节约内存 (实际在redis 4.06版本中对象共享不能通过refcount来识别) 。

  1.4 对象的空转时长

    在前面章节中介绍了redisobject结构的type,encoding,ptr 还有refcount属性,在该结构里还有一个属性为lru属性,该属性记录了对象最后一次被命令程序访问的时间。

    OBJECT IDLETIME <key> 返回给定 key 自储存以来的空闲时间(idle, 没有被读取也没有被写入),以秒为单位。

    例如: 使用set命令新建一个key 为msg,  过一会时间使用object idletime命令打印该key的空转时长

    127.0.0.1:> set msg "hello"
OK
127.0.0.1:> object idletime msg --显示空转时长110秒
(integer)
127.0.0.1:> get msg --再次被换醒
"hello"
127.0.0.1:> object idletime msg --空转时长重新计算 3秒
(integer)

    如果服务器打开了maxmemory选项,并且服务器用于回收的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时。空转时长较高的那部分键会优先被服务器释放,从而回收内存。

    127.0.0.1:> config get maxmemory
) "maxmemory"
) ""
127.0.0.1:> config get maxmemory-policy
) "maxmemory-policy"
) "noeviction"

    maxmemory 表示redis-cache所能使用的最大内存(bytes),默认为0,表示"无限制"。maxmemory-policy表示当达到maxmemory最大内存时,触发的"清除策略"。包括以下取值:

内存清除策略选项

说明

noeviction

不做任何干扰操作,直接返回OOM异常

volatile-lru

对"过期集合"中的数据采取LRU(近期最少使用)算法。如果对key使用"expire"指令指定了过期时间,那么此key将会被添加到"过期集合"中。全部移除仍不能满足内存需求,将OOM

allkeys-lru

对所有的数据,采用LRU算法

volatile-random

对"过期集合"中的数据采取"随即选取"算法,并移除选中的K-V,直到"内存足够"为止. 全部移除仍不能满足,将OOM

allkeys-random

对所有的数据,采取"随机选取"算法,并移除选中的K-V,直到"内存足够"为止

volatile-ttl

对"过期集合"中的数据采取TTL算法(最小存活时间),移除即将过期的数据.

二. 切换数据库

  2.1  服务器中数据库

redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDB结构,每个redisDB结构代表一个数据库。在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。默认情况下会创建16个数据库。、

 struct redisServer{
redisDb* db;
int dbnum;
...
};
    127.0.0.1:> config get  databases
) "databases"
) ""

  2.2 切换数据库

  每个redis客户端都有自己的目标数据库,每当客户端执行数据库写命令或读命令的时候,就是操作自己的目标数据库。 默认情况下,redis客户端的目标数据库为0号数据库,但客户端可以通过执行select命令来切换目标数据库。

  下例客户端在0号数据库设置并读取键msg,之后切换到1号数据库再读取msg键时,提示没有该键,说明数据库之间具有隔离性。

    127.0.0.1:> set msg "hello"
OK
127.0.0.1:> get msg
"hello"
127.0.0.1:> select --切换到第2个数据库
OK
127.0.0.1:[]> get msg --没有该key
(nil)

redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换的更多相关文章

  1. Redis系列文章-数据结构篇

    Redis系列文章 前言: 工作原因,在学习mybatis知识后,2个月没有补充新的知识了,最近拿起书本开始学习.打算写下这个Redis系列的文章. 目录结构如下: Redis内置数据结构 Redis ...

  2. Java开发笔记(五十二)对象的类型检查

    前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好 ...

  3. 编译器开发系列--Ocelot语言6.静态类型检查

    关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...

  4. 这么设计,Redis 10亿数据量只需要100MB内存

    本文主要和大家分享一下redis的高级特性:bit位操作. 本文redis试验代码基于如下环境: 操作系统:Mac OS 64位 版本:Redis 5.0.7 64 bit 运行模式:standalo ...

  5. JVM内存回收对象及引用分析

    自动垃圾回收是Java相较于C++的一个重要的特点,想了解JVM的垃圾回收机制,首先我们要知道垃圾回收是回收什么地方的垃圾,我在我的上一篇博客<JVM内存区域划分>里面有写到JVM里面的内 ...

  6. 【目录】redis 系列篇

    随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...

  7. NoSql数据库Redis系列(1)——Redis简介

    一.redis介绍 (一).Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点 ...

  8. js 中调用 Object.prototype.toString()来检测对象的类型

    1.使用toString()方法来检测对象类型 可以通过toString() 来获取每个对象的类型.为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Fun ...

  9. redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系

    一.概述 在前面章节中,主要了解了 Redis用到的主要数据结构,包括:简单动态字符串.链表(双端链表).字典.跳跃表. 整数集合.压缩列表(后面再了解).Redis没有直接使用这些数据结构来实现键值 ...

随机推荐

  1. python: 列表的方法

    操作 函数 使用方法 备注 索引 index in: example.index(‘creative’) --- 1 in:example[1,] --- [’creative’, [’京东’,996 ...

  2. 安装docker以及问题解决办法

    1.使用官方推荐的方式安装 yum-utilsyum install -y yum-utils2.使用如下的命令设置稳定版的 repositoryyum-config-manager \    --a ...

  3. quartz之CronExpression表达式

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为1.秒(~).分钟(~).小时(~).天(月)(~,但是你需要考虑你月的天数).月(~).天(星期)(~ =SUN 或 SU ...

  4. Git是什么、Git的功能、为什么versioncontrol用Git、Git的常用命令、Git的优缺点

    Git是什么 git是目前世界上最先进的分布式版本控制系统(没有之一). Git是用于 Linux内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版 ...

  5. 安装es6编译babel

    1.它的安装命令如下. 全局安装 :$ npm install --global babel-cli项目下安装: $ npm install -g babel-cli --save-dev 2.配置. ...

  6. C++入门笔记(二)变量和基本类型

    变量和基本类型 一.基本内置类型 1.除去布尔类型和扩展的字符型外,其他整型可以分为带符号的和无符号的. 2.与其他整型不同,字符型被分为了三种:char.signed char 和 unsigned ...

  7. canvas生成海报

    虽然之前也做过类似的生成海报的项目,但是这个项目我又网上查找了一下,发现一个插件挺好用的  html2canvas.js http://html2canvas.hertzen.com/这里可以下载这个 ...

  8. 守护模式,互斥锁,IPC通讯,生产者消费者模型

    '''1,什么是生产者消费者模型 生产者:比喻的是程序中负责产生数据的任务 消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用 实现了生产者与消费 ...

  9. .htaccess 文件 访问二级域名 对应的 指定文件夹

    <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 绑定m.xxx.cc 到子目录m RewriteCond %{HTTP_ ...

  10. 浅谈微信小程序一二

    1.生命周期 1.onLoad():页面加载时触发,一个页面只加载一次. 2.onShow():页面显示切换的时候触发 3.onReady():页面初次渲染完成时触发.一个页面只会调用一次,代表页面已 ...