一 概述

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字符串作为字符存储对象的原因

  1. 二进制安全(即SDS中存入什么类的数据,取出来还是什么数据,不会对数据进行任何的修改,限制和过滤等),在C字符串中,遇到空格就会认为是一个新的字符串,这样导致无法存储图片的二进制数据,而Redis中的SDS兼容二进制,不仅能够保存一般的字符串,还可以保存图片的二进制数据,还可以保存对象。同时兼容C字符串,并且可以使用C字符串相关的函数,可以避免代码重复。
  2. Redis中可以通过直接获取len的值而获得字符串的长度,时间复杂度为O(1),而C字符串获取长度的时候需要遍历字符,时间复杂度为O(n)。
  3. [空间预分配]减少内存分配操作,因为C字符串直接加长可能导致缓冲区被覆盖,需要重新分配内存,然而内存分配时比较耗时,Redis为了减少内存分配的操作,每次修改字符串,如果buf[]的长度不够存储修改后的字符串的时候,会分配新字符串两倍的容量给buf[],即会使得len == free。  如属性 buf[]的长度为: 6,值为:sdshdr,len = 6,free = 0 ; 修改后:值为:RedisNoSQLDB,发现缓冲区不够,需要重新分配内存,需要的内存为12,此时buf[] = 24,len = 12,free = 12。 如果再对数据进行修改,但是此时的长度未超过24,则不会重新分配缓冲区,这样会大大提升写入性能。这是字符串长度均为小于1MB的情况,当字符串长度超过1MB的时候,此时的内存分配机制为字符串需要多少内存就分配多少内存。
  4. [惰性空间释放]减少内存分配操作,SDS用free记录buf中剩余的可用空间长度,当需要缩短字符串的时候,SDS是不会立即释放多余的内存空间,而是保留,然后修改free中的值。当free的长度够下次扩容的时候就可以直接使用,而不需要重新分配内存,从而减少内存的分配次数。

Redis如何存储对象相关推荐

  1. 用java在redis中存储对象

    最近需要封装一个操作redis的工具类,不知道怎么向redis中存储对象,想到过用java反射去做.在网上搜索了一下,发现可以用序列化对象的方式去存储.再此我整理了一下 感谢,残剑_提供的方法:htt ...

  2. Redis Hash存储对象

    Hash 哈希表是一种数据结构,而Redis Hash也是采用哈希表来实现的存储. Hash命令 1.赋值(hset key filed value) 127.0.0.1:6379> hset ...

  3. Redis怎么存储对象

    在以往面试中,多次被问到Redis怎么存储对象,我支支吾吾半天回答不上来,毕竟我只用过String类型,为了避免以后的尴尬,今天花点时间来整理一下. 本人用的Jedis客户端 首先引入依赖 <d ...

  4. redis存php对象吗,redis怎么存储对象

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). zset(sorted set ...

  5. 【Redis-09】面试题之Redis数据结构与对象-RedisObject(下篇)

     承接上篇[Redis-08]面试题之Redis数据结构与对象-RedisObject(上篇) 8. type-字符串string 8.1 字符串的三种encoding编码(int + embstr ...

  6. flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...

    flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入vie ...

  7. ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象...

    http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value   (存一个对象的时候key存) 将哈希 ...

  8. redis存储对象_redis内存优化总结

    本文主要参考<>一书,主要分为以下六个部分: 1.redisObject对象 2.缩减键值对象 3.共享对象池 4.字符串优化 5.编码优化 6.控制key的数量 一. redisObje ...

  9. redis中存储java对象的两种方式

    根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式 存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用red ...

最新文章

  1. 【Sql Server】数据库的3大服务
  2. python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...
  3. 搭建android开发环境,android studio + Genymotion
  4. 10分钟内把永远跑不完的存储过程变为2秒跑完
  5. GDOI2018 总结
  6. Web前端是做什么的?就业前景如何?
  7. 华思视频 CCNA 听而思
  8. html---textarea初始化时就有个table空格以及tab键操作无效
  9. 垃圾回收算法与实现系列-学习GC之前的准备工作
  10. Linux内核的同步机制
  11. 20200317_利用神经网络预测贷款率
  12. java 利用时间生成主键
  13. python实现汉诺塔(递归)
  14. 本地Exchange和exchange online混合部署后OWA统一登录的实现
  15. 史上最全天气数据接口包括环境、气象、预警、水文、预报、实况、格点,落区、等值面、雷达、云图、空气质量实况及预报、气候统计、雷电分布、灾害性天气、短临预报、航空气象、农业气象、旅游气象、生活指数等
  16. 人群密度分析算法调研
  17. html embed函数爬取,HTML DOM Embed用法及代码示例
  18. Android创建快捷方式-SHORTCUT
  19. 学了这么多年精益思想,居然不知道还有第八种浪费 | IDCF
  20. 自己搜的算法题2.0

热门文章

  1. 非WS_EX_TOOLWINDOW样式下隐藏任务栏图标的方法
  2. java毕业设计理发店会员管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  3. pdf压缩工具在线,pdf在线压缩软件,在线压缩pdf文件大小的方法?
  4. linux开启UDP端口
  5. ABAP中的 CDS Table Function 与 AMDP的比较
  6. 怎么导出mysql数据库注释_数据库基础:如何查看并导出数据表中字段的注释信息...
  7. Unity技术艺术总监江毅冰:从游戏到实时电影
  8. 单级倒立摆从建模到仿真
  9. linux运行dll文件命令,linux下的动态链接库(DLL)
  10. 无论如何 特蕾莎修女