redis的数据类型

redis的数据类型

redis支持5种数据类型(对象)。分别是字符串(String)、列表(list)、哈希(hash)、集合(set)、有序集合(zset/sorted set)。
redis中的键和值都是一个对象。
redis使用引用计数实现内存回收,当一个对象不再被使用时,会被回收。
每个对象也会记录最后一次被访问的时间,可用于计数空转时间(回收算法为lru时有用)

字符串String

  • 字符串对象的编码可以是int、raw、embstr。当保存的是整型,则是int,不大于某个阈值(不同版本阈值可能不一样)的字符串,则为embstr,其余大字符串则是raw,raw本质上是SDS(简单动态字符串)。
  • 字符串对象是二进制安全的,因为其使用的是len来记录长度,和c语言不同,所以可以存放图片等二进制数据。
  • redis会共享值为0-9999的字符串对象。
  • 可通过OBJECT ENCODING key来查看编码。其它类型也一样。
  • 常见命令:
# 设置指定 key 的值
SET key value
# 获取指定 key 的值
GET key 
# 返回 key 中字符串值的子字符
GETRANGE key start end
# 将给定 key 的值设为 value ,并返回 key 的旧值
GETSET key value
# 设置指定key的值和过期时间。单位秒
SETEX key seconds value
# 只有在 key 不存在时设置 key 的值
SETNX key value
# 返回key所储存的字符串值的长度
STRLEN key
# key值+1
INCR key
# key值增加increment
INCRBY key increment
# key值增加increment 浮点类型
INCRBYFLOAT key increment
# key值-1
DECR key
# key值减少increment
DECRBY key decrement
# 指定key追加value
APPEND key value

列表list

  • 列表对象的编码可以是ziplist或linkedList。
  • ziplist使用压缩列表实现,linkedList使用双端链表实现。
  • 长度和元素个数满足条件(不超过,不同redis版本不一样)才会使用ziplist,超过则使用linkedlist
  • linkedlist编码的列表对象底层还有使用string对象。字符串对象是redis的5种对象中唯一一种会被其它四种对象嵌套的对象。
  • 常见命令
# 将一个或多个值插入到列表头部
LPUSH key value1 [value2]
# 在列表尾部中添加一个或多个值
RPUSH key value1 [value2]
# 列表长度
LLEN key
# 移出并获取列表的第一个元素
LPOP key
# 移除列表元素
LREM key count value
# 移除列表的最后一个元素,返回值为移除的元素
RPOP key

哈希Hash

  • 哈希对象的编码可以是ziplist或hashtable
  • ziplist使用压缩列表实现(键值依次压入列表尾),hashtable使用字符串实现,键和值都是一个字符串对象
  • 长度和元素个数满足条件(不超过,不同redis版本不一样)才会使用ziplist,超过则转换为hashtable
  • 常见命令:
# 删除哈希表中指定字段的值
HDEL key field1 [field2]
# 获取哈希表中指定字段的值
HGET key field
# 查看哈希表 key 中,指定的字段是否存在
HEXISTS key field
# 获取哈希表key的所有字段和值
HGETALL key
# 获取所有哈希表中的字段
HKEYS key
# 获取哈希表中字段的数量
HLEN key+ 

集合set

  • 集合对象的编码可以是intset或hashtable
  • intset使用整数集合实现,有序。hashtable使用字典实现,字典的值都设为null
  • 长度和元素个数满足条件(不超过,不同redis版本不一样),并且保存的值不包含字符串时才会使用intset,否则转换为hashtable。
  • 常见命令:
# 向集合key添加一个或多个成员
SADD key member1 [member2]
# 获取集合的成员数
SCARD key
# 返回给定所有集合的差集
SDIFF key1 [key2]
# 判断 member 元素是否是集合 key 的成员
SISMEMBER key member

有序集合sorted set

  • 有序,不允许重复
  • 有序集合对象的编码可以是ziplist或skiplist
  • ziplist使用压缩列表作为底层实现,每个集合元素使用2个紧挨的压缩节点保存,一个保存元素,一个保存元素的分值(score)。压缩列表内的元素按分值从小到大排序。
  • skiplist编码使用zset结构作为底层实现,zset结构包含一个字典和一个跳跃表。字典dict保存了元素的成员到分值的映射,键是成员,字典的值则是元素对应的分值,利用字典可以用O(1)的时间复杂度找到给定成员的分值。跳表则按分值从小到大保存了集合的成员,通过跳表可以进行范围查找。
  • 为什么同时使用跳表和字典?因为跳表不适合根据成员找到分值,时间复杂度O(logN),而字典是无序的,每次范围查找都要额外排序O(NlogN)时间复杂度和O(N)空间复杂度。
  • 字典和跳表通过指针来共享元素的成员和分值。不会存储重复的成员和分值。
  • 长度和元素个数满足条件(不超过,不同redis版本不一样)才会使用ziplist,超过则使用skiplist。
  • 常见命令:
# 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD key score1 member1 [score2 member2]
# 获取有序集合的成员数
ZCARD key
# 计算在有序集合中指定区间分数的成员数
ZCOUNT key min max
# 有序集合中对指定成员的分数加上增量 increment
ZINCRBY key increment member
# 返回有序集合中指定成员的索引
ZRANK key member
# 返回有序集中,成员的分数值
ZSCORE key member

小结

对于上面5中对象可能用到的编码总结如下:

对象类型编码
字符串int、raw、embstr
列表ziplist、linkedlist
哈希ziplist、hashtable
集合intset、hashtable
有序集合ziplist、skiplist

对于各自编码所对应的数据结构,会在后面有空的时候另行总结。

本文总结自《redis设计与实现》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值