Redis如何存储对象
一 概述
Redis中String类型是组基本的数据类型,最大值可以存储512M的数据,同时String是二进制安全的,也就是说Redis中的String可以包含任何数据,如jpg图片或者序列化的对象。Redis是基于内存中的数据进行操作。
二 Redis保存对象的结构
Redis底层是由C语言编写的,但是其并没有使用C语言传统的字符串表示(即以空字符\0结尾的字符数组)。而是自己构建了一种名为简单动态字符串(SimpleDynamicString,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。
set name value 的命令会产生值为“name”和“value” 的两个sdshdr对象
Redis中对象的属性:
//String是最基本的数据类型,属于二进制安全
struct sdshdr {//buf 中已占用空间的长度int len;//buf中剩余可用空间的长度int free;//数据空间char buf[];
};
三 Redis不用C字符串作为字符存储对象的原因
- 二进制安全(即SDS中存入什么类的数据,取出来还是什么数据,不会对数据进行任何的修改,限制和过滤等),在C字符串中,遇到空格就会认为是一个新的字符串,这样导致无法存储图片的二进制数据,而Redis中的SDS兼容二进制,不仅能够保存一般的字符串,还可以保存图片的二进制数据,还可以保存对象。同时兼容C字符串,并且可以使用C字符串相关的函数,可以避免代码重复。
- Redis中可以通过直接获取len的值而获得字符串的长度,时间复杂度为O(1),而C字符串获取长度的时候需要遍历字符,时间复杂度为O(n)。
- [空间预分配]减少内存分配操作,因为C字符串直接加长可能导致缓冲区被覆盖,需要重新分配内存,然而内存分配时比较耗时,Redis为了减少内存分配的操作,每次修改字符串,如果buf[]的长度不够存储修改后的字符串的时候,会分配新字符串两倍的容量给buf[],即会使得len == free。 如属性 buf[]的长度为: 6,值为:sdshdr,len = 6,free = 0 ; 修改后:值为:RedisNoSQLDB,发现缓冲区不够,需要重新分配内存,需要的内存为12,此时buf[] = 24,len = 12,free = 12。 如果再对数据进行修改,但是此时的长度未超过24,则不会重新分配缓冲区,这样会大大提升写入性能。这是字符串长度均为小于1MB的情况,当字符串长度超过1MB的时候,此时的内存分配机制为字符串需要多少内存就分配多少内存。
- [惰性空间释放]减少内存分配操作,SDS用free记录buf中剩余的可用空间长度,当需要缩短字符串的时候,SDS是不会立即释放多余的内存空间,而是保留,然后修改free中的值。当free的长度够下次扩容的时候就可以直接使用,而不需要重新分配内存,从而减少内存的分配次数。
Redis如何存储对象相关推荐
- 用java在redis中存储对象
最近需要封装一个操作redis的工具类,不知道怎么向redis中存储对象,想到过用java反射去做.在网上搜索了一下,发现可以用序列化对象的方式去存储.再此我整理了一下 感谢,残剑_提供的方法:htt ...
- Redis Hash存储对象
Hash 哈希表是一种数据结构,而Redis Hash也是采用哈希表来实现的存储. Hash命令 1.赋值(hset key filed value) 127.0.0.1:6379> hset ...
- Redis怎么存储对象
在以往面试中,多次被问到Redis怎么存储对象,我支支吾吾半天回答不上来,毕竟我只用过String类型,为了避免以后的尴尬,今天花点时间来整理一下. 本人用的Jedis客户端 首先引入依赖 <d ...
- redis存php对象吗,redis怎么存储对象
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). zset(sorted set ...
- 【Redis-09】面试题之Redis数据结构与对象-RedisObject(下篇)
承接上篇[Redis-08]面试题之Redis数据结构与对象-RedisObject(上篇) 8. type-字符串string 8.1 字符串的三种encoding编码(int + embstr ...
- flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...
flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入vie ...
- ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象...
http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希 ...
- redis存储对象_redis内存优化总结
本文主要参考<>一书,主要分为以下六个部分: 1.redisObject对象 2.缩减键值对象 3.共享对象池 4.字符串优化 5.编码优化 6.控制key的数量 一. redisObje ...
- redis中存储java对象的两种方式
根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式 存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用red ...
最新文章
- 【Sql Server】数据库的3大服务
- python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...
- 搭建android开发环境,android studio + Genymotion
- 10分钟内把永远跑不完的存储过程变为2秒跑完
- GDOI2018 总结
- Web前端是做什么的?就业前景如何?
- 华思视频 CCNA 听而思
- html---textarea初始化时就有个table空格以及tab键操作无效
- 垃圾回收算法与实现系列-学习GC之前的准备工作
- Linux内核的同步机制
- 20200317_利用神经网络预测贷款率
- java 利用时间生成主键
- python实现汉诺塔(递归)
- 本地Exchange和exchange online混合部署后OWA统一登录的实现
- 史上最全天气数据接口包括环境、气象、预警、水文、预报、实况、格点,落区、等值面、雷达、云图、空气质量实况及预报、气候统计、雷电分布、灾害性天气、短临预报、航空气象、农业气象、旅游气象、生活指数等
- 人群密度分析算法调研
- html embed函数爬取,HTML DOM Embed用法及代码示例
- Android创建快捷方式-SHORTCUT
- 学了这么多年精益思想,居然不知道还有第八种浪费 | IDCF
- 自己搜的算法题2.0
热门文章
- 非WS_EX_TOOLWINDOW样式下隐藏任务栏图标的方法
- java毕业设计理发店会员管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
- pdf压缩工具在线,pdf在线压缩软件,在线压缩pdf文件大小的方法?
- linux开启UDP端口
- ABAP中的 CDS Table Function 与 AMDP的比较
- 怎么导出mysql数据库注释_数据库基础:如何查看并导出数据表中字段的注释信息...
- Unity技术艺术总监江毅冰:从游戏到实时电影
- 单级倒立摆从建模到仿真
- linux运行dll文件命令,linux下的动态链接库(DLL)
- 无论如何 特蕾莎修女