redis对象

redis中有五种常用对象

我们所说的对象的类型大多是值的类型,键的类型大多是字符串对象,值得类型大概有以下几种,但是无论哪种都是基于redisObject实现的

redisObject的结构如下

typedef struct redisObject {
unsigned type:4; //类型 有五种,分别对应五种常见的值类型
unsigned encoding:4; // 编码,标明底层数据结构的类型
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits decreas time). */
int refcount; //引用计数
void *ptr;// 存储结构指针
} robj;

type的可选值有五种.分别是

REDIS_STRING,
REDIS_LIST,
REDIS_SET,
REDIS_ZSET ,
REDIS_HASH

encoding的可选值有八种

REDIS_ENCODING_INT long型的整数
REDIS_ENCODING_EMBSTR embstr编码的简单动态字符串
REDIS_ENCODING_ROW 简单动态字符串
REDIS_ENCODING_LINKEDLIST 双端链表
REDIS_ENCODING_HH 字典
REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_ENCODING_INTSET 整数集合
REDIS_ENCODING_SKIPLIST 跳跃表

type和encoding共同决定了数值对象的底层结构和存储

字符串对象

字符串对象的编码可以是int,embstr和row

redis中的字符串对象是最常用的数据对象之一,redis中的许多键都是采用的字符串对象

字符串类型在redis中根据情况不同有3中情况

  1. 对于元素都是纯数字类型的, 例如,'1','2'这种会使用int类型存储,redis默认初始化了10000个数字对象
  2. 对于长度小于32的字符串类型,例如'hello',redis会使用embstr类型存储数据
  3. 对于长度超过32的使用row存储原字符

ps: embstr类型的字符串在修改后总会变成row编码类型

列表

列表的编码可以是linkedlist或者ziplist

  1. 当列表对象保存的所有字符串长度小于64字节
  2. 当列表对象保存的元素数量小于512个的时候

这个时候会使用,ziplist来作为列表对象的编码, 当不满足这两个条件的时候使用linkedlist

ps:这两个值是更改的,list-max-ziplist-value 和 list-max-ziplist-entries

哈希对象

哈希对象的编码可以是ziplist或者hashtable

字典的每一个键和值都是一个字符串对象

  1. 哈希对象保存的所有键和值的长度都小于64字节
  2. 哈希对象保存的键值对数量小于512个的时候

满足以上两个条件,使用ziplist存储,否则采用hashtable存储

ps:这两个值是更改的,hash-max-ziplist-value 和 hash-max-ziplist-entries

集合

集合对象的编码可以是intset或者hashtable

当集合对象满足以下两个条件的时候采用intset

  1. 集合对象保存的元素都是整数
  2. 集合对象保存的元素数量不超过512个

不满足以上两个条件都是用hashtable存储

ps: 该数值可以使用set-max-intset-entries设置

有序集合

有序集合对象的编码可以是ziplist或者skiplist

有序集合对象跟前面的几个对象不大一样

typedef struct zset{
zskiplist *zsl;
dict *dict;
} zset;

zsl中保存一个跳跃表,表节点的对象即使键,score即是分值,该结构主要为 zrange,zrank等函数服务

同时还保存一个dict,dict中也保存有键和对应的分值,获取某键的函数zscore使用这个结构,

同时持有字典和跳跃表是为了性能考虑

当有序集合满足一下两个条件时候,使用ziplist编码

  1. 有序集合元素数量小于128
  2. 有序集合元素长度小于64

不能满足以上两个条件的使用skiplist

回收

redis的对象资源垃圾回收是基于引用计数

当一个对象被使用一次,引用计数增加1

当一个引用被销毁,对象的引用计数会减1

当一个对象的引用计数为0,会被销毁

对象共享

redis默认创建了0到9999的数字对象供1万个

其他用到这些对象的时候可以不用创建新对象,直接使用已有的对象

Redis中的数据对象的更多相关文章

  1. 往redis中存储数据是利用pipeline方法

    在redis中保存数据时,保存和设置有效时间是分开写的话,如果中间出现的异常,这会导致数据永久有效,因此就可以采用pipeline方法. # 创建redis管道对象,可以一次执行多个语句 pipeli ...

  2. 如何将redis中的数据导入到本地MongoDB和MySQL数据库

    将redis中的数据导入到本地MongoDB数据库 创建一个process_items_mongodb.py文件(文件名自定义): #!/usr/bin/env python # -*- coding ...

  3. 多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中【我】

    多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中 package com.xxx.xx.reve.service; import java.util.ArrayL ...

  4. Redis 中的数据持久化策略(RDB)

    Redis 是一个内存数据库,所有的数据都直接保存在内存中,那么,一旦 Redis 进程异常退出,或服务器本身异常宕机,我们存储在 Redis 中的数据就凭空消失,再也找不到了. Redis 作为一个 ...

  5. oracle中的数据对象

    oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(1 ...

  6. 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots

    读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots   以下为异常详细信息: Exception in thread &q ...

  7. 关于Redis中的字符串对象

    一.SDS redis中定义Object types有5种 /* Object types */ #define REDIS_STRING 0 #define REDIS_LIST 1 #define ...

  8. redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

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

  9. 转载:善待Redis中的数据

    Redis是我们数据的保管者,我们可以随时存随时取,大的小的,重要的不重要的,它都毫无怨言的帮我们保存着,甚至有些时候,我们变得很懒,存东西进去的时候顺便还贴张纸:"过了一个星期就帮我扔了吧 ...

随机推荐

  1. MyEclipse9.0破解

    http://www.cnblogs.com/liulanglang/archive/2011/11/15/2249702.html

  2. django无法加载admin的静态内容的问题(Centos7+Nginx+uwsgi环境下)

    Nginx静态资源无法加载,导致admin没有CSS样式: 这个问题,主要是要理解: 1.Django不会去解析静态内容(css,js,img)等,而是交给Nginx去处理,所以nginx.conf要 ...

  3. ajax返回json数据示例

    前端发送请求与接收数据: $.ajax({        type : "post",        url : "/queryStudent",       ...

  4. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  5. 并发容器之CopyOnWriteArrayList(转载)

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这 个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改 ...

  6. 也许是目前实现最好的js模拟滚动插件

    finger-mover 是一个集成 Fingerd(移动端以手指为单位的事件管理方案) 和 Moved(微型运动方案) 为一体的移动端动效平台,finger-mover 本身并不能为你做什么,但是附 ...

  7. Django项目部署到Apache服务器

    本文讲述的是在阿里云服务器(ECS)上部署Django项目于Apache,服务器操作系统为ubuntu,公网Ip地址为123.56.30.151. 将Django部署到Apache服务器的原因 Dja ...

  8. BeanInstantiationException: Failed to instantiate [java.time.LocalDateTime]

    错误提示: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationExce ...

  9. 点击Input框弹出日期选项

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. LNMP1.3一键安装Linux环境,配置Nginx运行ThinkPHP3.2

    LNMP1.3一键安装Linux环境,配置Nginx运行ThinkPHP3.2 你是否遇见过:安装LNMP1.3环境后,运行ThinkPHP 3.2,只能打开首页,不能访问控制器,报404错误. 按照 ...