一、string

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

redis 127.0.0.1:6379> SET runoob "菜鸟教程"
OK
redis 127.0.0.1:6379> GET runoob
"菜鸟教程"

字符串对象的编码可以是intrawembstr,为啥它有3个?还不是因为用的多,最常用了,所以作者才特别关照对它千方百计的优化。如果一个字符串保存的是整数值,并且这个值可以用long类型表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里。并将字符串编码encoding设置为int。此处要注意,1-9999之间的数值字符串在内存中可以复用。如果保存的是一个字符串的值,并且长度大于44字节(redis3.0之前是39),那么字符串对象将使用raw编码的简单动态字符串保存这个值。如果长度小于等于44,将使用embstr编码的简单动态字符串保存这个值。
39/44这个值从哪里来的:
要先看下当字符串类型时,redisObject的结构:

原因是,3.0版本之前,sdshdr这个结构里len和free记录了这个SDS的长度和空余空间,是unsigned int类型的,可以保存很大的数字,但是对于很短的SDS就浪费空间了(2个unsigned占8个字节)。而Redis分配内存一般是8 16 32 64这种分配的,redisObject占16个字节,最初free和len各占4个字节,字符串buf后面还有1个\0字节。所以当buf中为39字节时,16+8+39+1=64字节。当字符数少于39都会分配64字节的长度,3.0之前的39界限从这里得来的。3.0之后发现对于一些短的这样做不太合理,于是做了一次优化,优化点主要就在len free这2个属性上,之前一个len和一个free分别占用4字节,现在分别占用1个字节,又加了一个标识位flag占用1个字节,于是从原来的8到现在的 1*2+1=3。刚好缩短了5个字节,从39变成了44。另外embstr是只读的,在它进行运算时会先转成raw类型。

二、List

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>

列表对象的编码可以是ziplist、linkedList结构。也就是压缩列表和双向链表结构。ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点保存了一个列的元素。如下:
zlbytes记录整个压缩列表占用的内存字节数,在对压缩列表进行内存重分配或计算zlend的位置时使用。zltail记录压缩列表尾节点距离压缩列表的起始地址有多少字节,通过这个偏移量,可以直接确定尾节点的位置。zllen记录压缩列表包含的节点数量,xxx/yyy/zzz表示各种节点,数量和长度不一定。zlend用于标记压缩列表的末端。

三、hash

Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"

实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。

列表对象的编码可以是ziplist、linkedList结构。也就是压缩列表和双向链表结构哈希对象的底层编码可以是ziplist或者hashtable,目前仅分析之前版本的ziplist结构的哈希。
ziplist作为哈希对象的底层实现的时候,每当有新的键值对要加入到哈希对象时,程序会先把键放到ziplist的末尾,再把值放在ziplist的末尾。因此键值总是挨在一起的,键在前,值在后。如下图所示:

哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
哈希对象保存的键值对数量小于512
这2个值也是在配置文件中可以修改的在redis.conf

四、set

Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob1) "redis"
2) "rabitmq"
3) "mongodb"

注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

集合对象也有2种编码,分别是intset整数集合和hashtable哈希表。简单介绍一下:
intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。

另一方便,hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为null.

直接切入正题:编码转换,当集合对象同时满足下面2个条件,使用intset,否则使用hashtable

  1. 集合里所有元素都是整数值
  2. 集合元素个数不超过512(可配置,redis.conf)
localhost:6379> sadd numbers 1 2 3 4 5
(integer) 5
localhost:6379> object encoding numbers
"intset"
localhost:6379> sadd numbers aaa
(integer) 1
localhost:6379> object encoding numbers
"hashtable"
localhost:6379>

五、zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

底层编码可以是ziplist或者skiplist结构,压缩列表特性之前说过,每个元素的集合使用2个位置相邻的节点保存,在有序集合中,第一个存放的是元素本身,第二个存放的是元素的分值score。压缩列表的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的位置。

redis(二)基本数据类型相关推荐

  1. Redis数据库(二)——数据类型

    Redis数据库(二)--数据类型 一.String数据类型 1.set / get / append / strlen 2.incr / decr / incrby / decrby 3.getse ...

  2. Redis二:redis-cli操作各种数据类型

    Redis二:redis-cli操作各种数据类型 1. redis-cli的登录与常用数据类型 2. 各种数据类型的操作 2.1 String(数值在这里也被视为字符串) 2.3 Hash(可以将一个 ...

  3. Python运维项目中用到的redis经验及数据类型

    先感叹下,学东西一定要活学活用!   我用redis也有几年的历史了,今个才想到把集合可以当python list用.  最近做了几个项目都掺杂了redis, 遇到了一些个问题和开发中提高性能的方法, ...

  4. Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透

    Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透 简单介绍一个redis? redis是内存中的数据结构存储系统,一个key-value类型的非关系型数据库,可持久化的数据库 ...

  5. NoSQL(1)之 Redis的五大数据类型使用方法的详细介绍

    Redis的五大数据类型也称五大数据对象:了解过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包含了五大数据对 ...

  6. redis的zset的底层实现_Redis(三)--- Redis的五大数据类型的底层实现

    1.简介 Redis的五大数据类型也称五大数据对象:前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包 ...

  7. Redis五种数据类型及应用场景

    Redis五种数据类型及应用场景 MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样 ...

  8. redis中各种数据类型对应的jedis操作命令

    2019独角兽企业重金招聘Python工程师标准>>> redis中各种数据类型对应的jedis操作命令 博客分类: 缓存 http://www.fwqtg.net/redis%E4 ...

  9. java hmget 最大值,【Redis】基本数据类型及命令操作(超详细)

    一.String 可以直接看每一大节的命令示例部分,敲一遍就大体会了 1.1 概述 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数 ...

  10. Redis中的数据类型及其应用场景

    redis中有哪些数据类型?这个问题我被面试官问过好多次了,下面总结下这5种数据类型的特点,命令,还有应用场景 redis客户端的一些通用命令: ping # 测试redis是否链接 如果已链接返回 ...

最新文章

  1. 数据结构之列表 timeit
  2. Python 在编程语言中是什么地位?为什么很多大学不教 Python?
  3. Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用1
  4. JAVA基础知识需要注意的细节
  5. mysql e 变量_mysql 变量简介
  6. 深入理解分布式事务,高并发下分布式事务的解决方案
  7. LabView学习笔记(五):数据类型综合实验
  8. java字符串字符排列组合_如何在Java中查找字符串的所有排列
  9. redhat7 安装 docker
  10. UG模具设计工程师需要哪些条件?潇洒UG模具设计
  11. Xshell连接新浪云服务器
  12. 计算机网络语音传输杂音回音,语音时有回音和杂音,怎么消除?
  13. ios手机添加frida软件源
  14. 八皇后问题(回溯算法)
  15. vue-symbol
  16. Doris:部署Broker
  17. TCP/IP之大明王朝邮差
  18. Windows nginx 操作和配置
  19. 互联网结合产业,并不是为了继续建筑互联网与实体产业之间的高墙
  20. STM32中0x1u 0u的含义

热门文章

  1. 基克的聚合 机器人_7.12出装新思路:基克的聚合成坦克必备?
  2. TF-A 项目的长期支持介绍
  3. 联通光纤入户,光猫连接无线路由器不能上网
  4. word/excel打开超链接时,提示“找不到Internet服务器或代理服务器”
  5. java调用爱查快递接口
  6. tenacity retry重试和defaultdict包、sorted字典排序
  7. python中单例模式是什么_Python中单例模式总结
  8. 计算机绘图自考知识点,湖南自考本科07885图学与计算机绘图考试大纲 - 湖南自考生网...
  9. 【NOI2019模拟2019.6.27】幻化成风(集合容斥系数,胡乱dp)
  10. 博图V15.1下载及安装过程