> 文章列表 > Redis五大数据类型及其相关操作

Redis五大数据类型及其相关操作

Redis五大数据类型及其相关操作

文章目录

  • 常用五大数据类型
    • Redis键(Key)有关操作
    • 库相关操作
    • 字符串(String)
    • 列表(List)
      • 相关知识点
      • 常见操作
    • 集合(Set)
      • 相关知识点
      • 常见操作
    • 哈希(Hash)
      • 相关知识点
      • 常用操作
    • 有序列表(Zset)
      • 相关知识点
    • 常用操作

常用五大数据类型

  • string
  • set
  • list
  • hash
  • zset

Redis键(Key)有关操作

  • 查看当前库所有的key:keys *
  • 判断某个key是否存在:exists <key>
  • 删除key:del key
  • 根据value选择非阻塞删除:unlink <key>,仅将keys从keyspace元数据中删除,真正的删除后续异步删除
  • 为给定key设置过期时间,单位秒:expire <key> <seconds>
  • 查看key还有多少秒过期:ttl <key>, -1表示用不过期,-2表示已经过期
  • 查看当前数据库key的数量:dbsize

库相关操作

Redis默认提供了16个数据库,0-15,默认为0

  • 切换数据库:select <n>
  • 清空当前库:flushdb
  • 通杀全部库:flushall

字符串(String)

相关知识点

  • String 类型是二进制安全的。意味着String类型可以包含任何数据,比如jpg图片和序列化的对象。

  • Redis中字符串value最多是512M

  • 对String的操作都是原子的,得益于Redis是单线程

  • String的数据结构为简单动态字符串,实现上类似于java的ArrayList,采用分配冗余空间的方式,来减少频繁分配空间。内部为当前字符串分配的空间一般是大于当前字符串长度的,当字符串长度小于1M时,为加倍扩容。当大于1M时,每次扩容1M,最大为512M。

常见操作

  • 设置key和value:set <key> <value>
  • 获取对应键值:get <key>
  • 将新的value追加到原值的末尾:append <key> <value>
  • 获取value的长度:strlen <key>
  • 只有在key不存在的时候设置key的值:setnx <key> <value>
  • 将key中存的数字增1:incr <key>,如果不存在,则set为1
  • 将key中的数字减1:decr <key>,如果不存在,则set为-1
  • 自定义减少/增加步长:incrby/decrby <key> <步长>
  • 同时设置一个或多个key-value对:mset <key1> <value1> <key2> <value2> ...
  • 同时获取一个活多个value:mget <key1> <key2>
  • 当key不存在时,同时设置多个key-value对:msetnx <key1> <value1> <key2> <value2> ...
  • 获取范围中的值:getrange <key> <start> <end>
  • 用给定的value覆写key所存储的支付串,从offset开始(索引从0开始):setrage <key> <offset> <value>
  • 设置key-value的同时设置过期时间,单位秒:setex <key> <seconds> <value>
  • 获取旧值同时设置新值:getset <key> <value>

列表(List)

相关知识点

  • List的数据结构为Quicklist(双向),每个节点为Ziplist(压缩列表,内存连续)。当列表元素较少时,直接为Ziplist,当元素过多时,会转换为Quicklist。这样做的原因是因为普通的双向列表,哪怕一个节点只存一个int值,都要花费额外的空间去存prev和next两个指针,空间利用率太低了,使用Ziplist之后可以大大减少存储prev和next的空间浪费。

常见操作

  • 从左边/右边插入一个或多个值:lpush/rpush <key> <value1> <value2> ...
  • 从左边/右边吐出一个值:lpop/rpop <key>,当列表为空时,键消失
  • 从列表1右边吐出一个值,插入到列2的左边:rpoplpush <key1> <key2>
  • 按照索引下标获得区间元素:lrange <key> <start> <end>
  • 获得所以元素:lrange <key> 0 -1
  • 按照索引下标获得元素:lindex <key> <index>
  • 获得列表长度:llen <key>
  • 在指定value前/后插入值:linsert <key> before/after <value> <newvalue>
  • 从左边依次删除n个value:lrem <key> <n> <value>
  • 将列表index的值替换为value:lset <key> <index> <value>

集合(Set)

相关知识点

  • Set是String类型的无序去重集合,它底层是一个哈希表,因此相关操作复杂的为O(1)

常见操作

  • 将一个或多个元素加入到集合中:sadd <key> <value1> <value2> ...
  • 取出集合所有值:smembers <key>
  • 判断集合是否含有某元素:sismember <key> <value>
  • 求集合的元素个数:scard <key>
  • 删除集合一个或多个元素:srem <key> <value1> <value2> ...
  • 随机吐出一个值:spop <key>
  • 随机取集合n个值(不会删除):srandmember <key> <n>
  • 将集合A中的一个值移动到集合B:smove <source> <destination> value
  • 求两个集合的交集:sinter <key1> <key2>
  • 求两个集合的并集:sunion <key1> <key2>
  • 求两个集合的差:sdiff <key1> <key2>

哈希(Hash)

相关知识点

  • Hash对应的数据结构有两种:Ziplist和Hashtable。当元素短且少时用Ziplist,反之使用Hashtable

常用操作

  • 给key中的field赋值:hset <key> <field> <value>
  • 取出key中field对应value:hget <key> <field>
  • 批量设置值:hmset <key> <field1> <value1> <field2> <value2>
  • 判断指定field是否存在:hexists <key> <field>
  • 取出所有field:hkeys <key>
  • 取出所有value:hvals <key>
  • 给指定field上增量:hincrby <key> <field> <increment>
  • 当且仅当field不存在时,给field赋值:hsetnx <key> <field> <value>

有序列表(Zset)

相关知识点

  • Zset和Set类似,是一个没有重复元素的集合,但是Zset多了一个score,因此他可以通过score进行排序了,也就是Zset是有序的。
  • Zset的底层数据结构为hash和跳跃表。hash的作用是关联value和score,确保value的唯一性;跳跃表的主要作用是给value排序

常用操作

  • 给集合添加元素:zset <key> <score1> <value1> <score2> <value2> ...
  • 返回下标在区间中的所有元素:zrange <key> <start> <end> [withscores],当带有withscores时,会返回分数
  • 返回score介于min、max之间(包括min、max)的元素,按min-max排序:zrangebyscore <key> <min> <max> [withscores]
  • 返回score介于min、max之间(包括min、max)的元素,按max-min排序:zrevrangebyscore <key> <max> <min> [withscores]
  • 为指定元素的score上增量:zincrby <key> <increment> <value>
  • 删除指定元素:zrem <key> <value>
  • 统计区间元素个数:zcount <key> <min> <max>
  • 返回一个值在集合中的排名,从0开始:zrank <key> <value>