Redis五大数据类型

一、字符串(String)

1. 简介

String是Redis最基本的数据类型,一个key对应一个value。String类型是二进制安全的。意味着Redis的String可以包含任何数据,包括jpg图片或者序列化的对象。一个Redis字符串的value中最多可以存储512M的数据。

2. 常用命令

  • 添加键值对:set < key > < value >
  • 查询对应键的值:get < key >
  • 将给定value追加到原值的末尾:append < key > < value >
  • 获得值的长度:strlen < key >
  • 只有在值不存在的时候才设置key的值:setnx < key > < value >
  • 将key对应value中存储的值增加1,只能对数字操作,如果为空,新增值为1:incr < key >
  • 将key对应value中存储的值减少1,只能对数字操作,如果为空,新增值为-1:decr < key >
  • 将key中储存的数字值进行自定义增减数量:incrby/decrby < key > < 步长 >
  • 同时设置一个或者多个key-value:mset < key1 > < value1 > < key2 > < value2 >…
  • 同时获取一个或者多个key-value:mget < key1 > < key2 > < key3 >…
  • 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在(此操作具有原子性,有一个失败,全部失败):msetnx < key1 > < value1 > < key2 > < value2 >…
  • 获取范围内的字符串(索引从0开始):getrange < key > < 起始位置 > < 结束位置 >
  • 用value覆盖key所存储位置的字符串:setrange < key > < 起始位置 > < value >
  • 设置键值的同时,设置过期时间(单位秒):setex < key > < 过期时间 > < value >
  • 以新值换旧值,设置新值的同时获取旧值:getset < key > < value >

3. 数据结构

String的数据结构为简单动态字符串。是可以修改的字符串,内部结构实现有点类似于Java中的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。当字符串长度小于1M时,扩容都是加倍现有的空间,如果扩容超过了1M,扩容时一次只会多扩容1M的空间。

二、列表(List)

1. 简介

List是简单的字符串列表,按照插入顺序,可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际上是一个双向链表,对两端的操作性能很高,通过索引下标对中间节点的操作性能较差。

2. 常用命令

  • 从左边或者右边插入一个或者多个值:lpush/rpush < key1 > < value1 > < value2 > < value3 >
  • 从左边或者右边吐出一个值(值在健在,值光键亡):lpop/rpop < key >
  • 从key1列表吐出一个值,插入到key2列表中:lpoprpush < key1 > < key2 >
  • 按照索引下标获取元素(0表示左边第一个,-1表示右边第一个,0 -1表示获取所有):lrange < key > < start > < stop >
  • 按照索引下标获得元素:lindex < key > < index >
  • 获取列表长度:llen < key >
  • 在指定的value值后面插入一个newvalue:linsert < key > before < value > < newvalue >
  • 从左边删除n个value:lrem < key > < n > < value >
  • 将列表key下标为index的值替换为newvalue:lset < key > < index > < value >

3. 数据结构

在这里插入图片描述

List的数据结构为快速链表quickList。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是zipList,也即压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改为quickList。因为普通的链表需要的附加指针空间较大,即使列表中只存储一个int类型的数据,结构上还需要两个额外的指针prev和next。redis将链表和ziplist结合起来组成了quickList。就是将多个zipList使用双向指针串起来使用。这样既满足了快速的插入删除性能,也不会出现太大的空间冗余。

三、集合(set)

1. 简介

set对外提供的功能和list类似是一个列表的功能。但是set可以自动去重,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口。这个也是list所不能提供的。
redis的set是string类型的无序集合。它的底层其实就是一个value为null的hash表,所以添加、删除和查找的复杂度都是O(1)。

2. 常用命令

  • 将一个或者多个member元素添加到key集合中:sadd < key > < value1 > < value2 >…
  • 取出一个集合中的所有值:smembers < key >
  • 判断集合key中是否包含某个值value,包含的话返回1不包含返回0:sismember < key > < value >
  • 返回该集合的元素个数:scard < key >
  • 删除集合中的某个元素:srem < key > < value1 > < value2 >…
  • 随机从集合中吐出一个值:spop < key >
  • 随机从集合中取出n个值,不会从集合中删除:srandmember < key > < n >
  • 把一个集合中的值移动到另一个集合中:smove < source> < destination> < member >
  • 返回两个集合的交集元素:sinter < key1 > < key2 >
  • 返回两个集合的并集元素:sunion < key1 > < key2 >
  • 返回两个集合的差集元素(只存在于key1中,不包含key2中的元素):sdiff < key1 > < key2 >

3. 数据结构

Set的数据结构是dic字典,字典是用哈希表实现的。Java中的HashSet的内部实现使用的是HashMap,只不过所有的value都指向一个对象。Redis中的set结构也是一样的,它的内部也是使用Hash结构,所有的value都指向同一个内部值。

四、哈希(Hash)

1. 简介

hash是一个键值对集合。hash是一个string类型的field和value的映射表,hash特别适用于存储对象,类似Java中的Map<String,Object>。用户ID为查找的key,存储的value为用户对象包含姓名,年龄,生日等信息。

2. 常用命令

  • 为key集合中的filed键赋值value:hset < key > < filed > < value >
  • 从key集合中的filed键取出其值:hget < key > < filed >
  • 批量设置hash的值:hmset < key1 > < filed1 > < value1 > < filed2 > < value2 >…
  • 查看hash表中,给定域filed是否存在:hexists < key1 > < filed >
  • 列出该hash集合中的所有filed:hkeys < key >
  • 列出该hash集合中的所有value:hvals < key >
  • 为hash表key中的域filed的值加上增量1:hincrby < key > < filed > < increment >
  • 将hash表中域为filed的值设置为value(只有该hash表中不存在改filed域时才可以设置):hsetnx < key > < filed > < value >

3. 数据结构

Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当filed-value长度较短且个数较少的时候,使用ziplist,否则使用hashtable

五、有序集合(Zset)

1. 简介

Zset与普通集合十分相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合中的成员是唯一的,但是评分是可重复的

2. 常用命令

  • 将一个或者多个member元素添加到有序集合zset中:zadd < key > < score1 > < value1 > < score2 > < value2 >…
  • 返回有序集合中,分数在start和stop之间的元素(带WITHSCORES 可以让分数和值一起返回到结果集):zrange < key > < start > < stop > < WITHSCORES >
  • 返回有序集key中,所有scoure值介于min和max之间(包括等于min和max)的成员。有序集成员按照score值递增(从小到大)次序排列:zrangebyscore key min max [ withscores ] [ limit offsetcount ]
  • 为元素的score加上增量:zincrby < key > < increment > < value >
  • 删除指定集合下指定元素:zrem < key > < value >
  • 统计该集合下,分数区间内的元素个数:zcount < key > < min > < max >
  • 返回该值在集合中的排名(排名是从0开始的):zrank < key > < value >

3. 数据结构

Zset是redis中一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String,Double>,可以给每个元素value赋予一个权重score,另一方面又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表
Zset底层使用了两个数据结构

  1. hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到对应的score值
  2. 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值