博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换
阅读量:6610 次
发布时间:2019-06-24

本文共 2924 字,大约阅读时间需要 9 分钟。

一.  概述

  对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为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:6379> set msg "hello"    OK    127.0.0.1:6379> object idletime msg   --显示空转时长110秒    (integer) 110       127.0.0.1:6379> get msg    --再次被换醒    "hello"    127.0.0.1:6379> object idletime msg  --空转时长重新计算 3秒    (integer) 3

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

127.0.0.1:6379> config get maxmemory    1) "maxmemory"    2) "0"    127.0.0.1:6379> config get maxmemory-policy    1) "maxmemory-policy"    2) "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:6379> config get  databases    1) "databases"    2) "16"

  2.2 切换数据库

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

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

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

 

转载于:https://www.cnblogs.com/MrHSR/p/9990231.html

你可能感兴趣的文章
v-charts
查看>>
需要学习的编程语言
查看>>
(十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用
查看>>
1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
查看>>
再谈H5存储问题--浏览器无痕模式不支持
查看>>
JS原型与面向对象总结
查看>>
构建之法阅读笔记04
查看>>
Fixed元素在滚动时会抖动----开启硬件加速
查看>>
NodeJs安装步骤与淘宝镜像
查看>>
c语言字符数组与字符串的使用详解
查看>>
个人学习总结
查看>>
[POJ] 1135 Domino Effect
查看>>
设计模式之-享元模式
查看>>
灰度世界算法(Gray World Algorithm) 分类: 图像处理 ...
查看>>
yum安装nginx 加载image_filter 加载方式
查看>>
OAF 汇总行的做法
查看>>
CMD命令名详细大全
查看>>
IOS 定位服务与地图的应用开发
查看>>
CORS解决跨域问题
查看>>
Webstrom快捷键大全
查看>>