Redis中的数据对象
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','2'这种会使用int类型存储,redis默认初始化了10000个数字对象
- 对于长度小于32的字符串类型,例如'hello',redis会使用embstr类型存储数据
- 对于长度超过32的使用row存储原字符
ps: embstr类型的字符串在修改后总会变成row编码类型
列表
列表的编码可以是linkedlist或者ziplist
- 当列表对象保存的所有字符串长度小于64字节
- 当列表对象保存的元素数量小于512个的时候
这个时候会使用,ziplist来作为列表对象的编码, 当不满足这两个条件的时候使用linkedlist
ps:这两个值是更改的,list-max-ziplist-value 和 list-max-ziplist-entries
哈希对象
哈希对象的编码可以是ziplist或者hashtable
字典的每一个键和值都是一个字符串对象
- 哈希对象保存的所有键和值的长度都小于64字节
- 哈希对象保存的键值对数量小于512个的时候
满足以上两个条件,使用ziplist存储,否则采用hashtable存储
ps:这两个值是更改的,hash-max-ziplist-value 和 hash-max-ziplist-entries
集合
集合对象的编码可以是intset或者hashtable
当集合对象满足以下两个条件的时候采用intset
- 集合对象保存的元素都是整数
- 集合对象保存的元素数量不超过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编码
- 有序集合元素数量小于128
- 有序集合元素长度小于64
不能满足以上两个条件的使用skiplist
回收
redis的对象资源垃圾回收是基于引用计数
当一个对象被使用一次,引用计数增加1
当一个引用被销毁,对象的引用计数会减1
当一个对象的引用计数为0,会被销毁
对象共享
redis默认创建了0到9999的数字对象供1万个
其他用到这些对象的时候可以不用创建新对象,直接使用已有的对象
Redis中的数据对象的更多相关文章
- 往redis中存储数据是利用pipeline方法
在redis中保存数据时,保存和设置有效时间是分开写的话,如果中间出现的异常,这会导致数据永久有效,因此就可以采用pipeline方法. # 创建redis管道对象,可以一次执行多个语句 pipeli ...
- 如何将redis中的数据导入到本地MongoDB和MySQL数据库
将redis中的数据导入到本地MongoDB数据库 创建一个process_items_mongodb.py文件(文件名自定义): #!/usr/bin/env python # -*- coding ...
- 多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中【我】
多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中 package com.xxx.xx.reve.service; import java.util.ArrayL ...
- Redis 中的数据持久化策略(RDB)
Redis 是一个内存数据库,所有的数据都直接保存在内存中,那么,一旦 Redis 进程异常退出,或服务器本身异常宕机,我们存储在 Redis 中的数据就凭空消失,再也找不到了. Redis 作为一个 ...
- oracle中的数据对象
oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(1 ...
- 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots
读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots 以下为异常详细信息: Exception in thread &q ...
- 关于Redis中的字符串对象
一.SDS redis中定义Object types有5种 /* Object types */ #define REDIS_STRING 0 #define REDIS_LIST 1 #define ...
- redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换
一. 概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...
- 转载:善待Redis中的数据
Redis是我们数据的保管者,我们可以随时存随时取,大的小的,重要的不重要的,它都毫无怨言的帮我们保存着,甚至有些时候,我们变得很懒,存东西进去的时候顺便还贴张纸:"过了一个星期就帮我扔了吧 ...
随机推荐
- windows下配置mysql数据库主从
所用到工具: Mysql.Navicat Premium: 主库设置: 一.设置my.ini 文件: 1.在安装目录下找到my.ini 文件: 默认路径:C:\Program Files\MySQL\ ...
- JavaScript常用的方法和函数(setAttribute和getAttribute )
仅记录学习的新知识和示例,无干货. 1.setAttribute和getAttribute (Attribute:属性) setAttribute:为元素添加指定的属性,并为其赋值: ...
- iOS 发布证书提示 此证书的签发者无效 解决办法
1. 打开钥匙串 查看发布证书 都是提示 此证书的签发者无效 解决办法 : 2. 到了 第 4 步骤 再去 查看 发布证书 就会 显示 此证书有效 3. 如果还不可以 就 把 Apple W ...
- [刷题]算法竞赛入门经典(第2版) 5-7/UVa12100 - Printer Queue
题意:一堆文件但只有一个打印机,按优先级与排队顺序进行打印.也就是在一个可以插队的的队列里,问你何时可以打印到.至于这个插队啊,题目说"Of course, those annoying t ...
- mysql语句优化总结(一)
Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A. inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.nam ...
- 关于微信小程序的Request请求错误处理
在学微信小程序的request请求的时候,一开始报“不在以下合法域名列表中,请参考文”的错误,后来又莫名其妙的报“400 Bad Request”错误,经过半天的研究,终于搞定了,把遇到的错误给大家分 ...
- javaWeb学习总结(3)- Servlet总结(servlet的主要接口、类)
Servlet总结01——servlet的主要接口.类 (一)servlet类 Servlet主要类.接口的结构如下图所示: 要编写一个Servlet需要实现javax.servlet.Servlet ...
- java.util.Properties工具类
import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import ...
- php回调函数的使用
1.array_map — 将回调函数作用到给定数组的单元上 参数:array array_map ( callable $callback , array $arr1 [, array $... ] ...
- 快速找到ARP病毒源
第一招:使用Sniffer抓包 在网络内任意一台主机上运行抓包软件,捕获所有到达本机的数据包.如果发现有某个IP不断发送请求包,那么这台电脑一般就是病毒源.原理:无论何种ARP病毒变种,行为方式有两种 ...