Redis数据类型

目前7.0版本Redis一共有10种数据类型

字符串(Strings)

Redis StringsRedis最基本的类型,最大可以存储512MB的字符串。一个Key对应一个ValueString类型是二进制安全的,意思就是Redis

String可以包含任何数据,比如jpg图片或者序列化对象。可以对字符串进行一些特殊的操作,比如追加、覆盖、自增、自减等等。

简单说明

SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

SET命令有EXPXNXXX以及KEEPTTL五个可选参数,其中KEEPTTL6.0版本添加的可选参数,其他都是2.6.12版本添加的可选参数。

SET命令使用EXPXNX参数,其效果等同于SETEXPSETEXSETNX命令。根据官方文档描述,未来版本中SETEXPSETEXSETNX 命令可能会被淘汰。EXATPXAT以及GET6.2新增的可选参数。

  • EX seconds :以秒为单位设置过期时间。

  • PX milliseconds :以毫秒为单位设置过期时间。

  • EXAT unix-time-seconds :设置以秒为单位的UNIX时间戳所对应的时间为过期时间。

    在JAVA中可以这样获取设置指定KEY过期的Unix时间,单位为秒:

    Long.toString(System.currentTimeMillis()/1000L)
    
  • PXAT unix-time-milliseconds :设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间。

    在JAVA中可以这样获取设置指定KEY过期的Unix时间,单位为毫秒:

    Long.toString(System.currentTimeMillis())
    
  • NX :键不存在的时候设置键值。

  • XX :键存在的时候设置键值。

  • KEEPTTL :保留设置前指定键的生存时间。

    • 在不使用 KEEPTTL 参数时覆盖,会导致过期时间也被覆盖。

      127.0.0.1:6379> SET KEY1 V1 EX 100
      OK
      127.0.0.1:6379> TTL KEY1
      (integer) 93
      127.0.0.1:6379> SET KEY1 V2
      OK
      127.0.0.1:6379> TTL KEY1
      (integer) -1
      
    • 使用 KEEPTTL 参数时覆盖,则会保留覆盖前指定键的生存时间。

      127.0.0.1:6379> SET KEY1 V1 EX 100
      OK
      127.0.0.1:6379> TTL KEY1
      (integer) 95
      127.0.0.1:6379> SET KEY1 V2 KEEPTTL
      OK
      127.0.0.1:6379> TTL KEY1
      (integer) 80
      
  • GET :返回指定键原本的值,若键不存在则返回nil

设置成功则返回OK;返回nil则表示未执行SET命令,如不满足NXXX条件等。若使用GET参数,则返回该键原来的值,或在键不存在时返回nil

列表(Lists)

Redis Lists列表是简单的字符串列表,按照插入顺序排序。按照插入顺序排序。可以在列表的两端进行插入、删除操作,也可以通过索引来访问列表中的元素。它的底层实际是一个双端链表,最多可以包含232-1个元素(4294967295,每个列表超过40亿的元素)。

简单说明

Redis Lists是一个双端链表的结构,对两端的操作性能很高,但是通过索引操作中间的节点性能会较差。主要功能有PUSH/POP等,一般用在栈、队列、消息队列等场景。双端都可以插入添加。

  • 如果键不存在则创建新的链表。
  • 如果键已经存在,新增内容。
  • 如果值全移除了,对应的键也就消失了。
Value1Value2Value3Value4Value5Value6Value7Value8

哈希表(Hashs)

Redis Hashs哈希表是一个键值对的集合,其中的值可以是字符串、列表、集合、有序集合等数据类型。可以对哈希表进行增删改查等操作。最多可以包含232-1个键值对(4294967295,每个列表超过40亿的元素)。

集合(Sets)

Redis Sets集合是一组无序的字符串(String)集合,其中不允许有重复的元素。可以对集合进行交、并、差等操作。其是使用的哈希表实现的,所以添加、删除、查找的复杂度都是O(1)
最多可以包含232-1个元素(4294967295,每个列表超过40亿的元素)。

有序集合(Sorted Sets)

Redis Sorted Sets有序集合和集合类似,也是一组无序的字符串集合、不允许有重复的元素,但是每个元素都会关联一个double类型的分数,Redis就是通过这个分数来排序的。可以对有序集合进行交、并、差等操作。虽然元素不能重复,但是其分数(score)是可以重复的。这个类型也是通过哈希表来实现的,所以添加、删除、查找的复杂度都是O(1)。最多可以包含232-1个元素(4294967295,每个列表超过40亿的元素)。

地理空间(Geospatial

Redis Geospatial可以将地理位置信息和字符串进行关联,实现基于地理位置的查询。可以对存储的信息进行操作,包括:

  • 添加地理位置坐标。
  • 获取地理位置坐标。
  • 计算两个位置之间的距离。
  • 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

基数统计(HyperLogLog)

Redis HyperLogLog可以用于估算一个集合中的元素数量,用于大数据场景的去重操作。优点是在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且时非常小的。
在Redis里面每个HyperLogLog键只需要花费12KB内存,就可以计算接近264个不同元素的基数。这和计算基数时,元素越多耗费内存越多的集合形成鲜明对比。但是HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样返回输入的每个元素。

位图(Bitmaps)

Redis Bitmaps(Bit Arrays)位图是一种特殊的字符串类型,可以对其进行位操作,用于存储二进制位的状态。
由0和1状态表示的二进制位的
bit
数组:

一个字节(一个byte)=8位,上图每个格子(每个bit)里面只能放0或者1,用它来判断Y/N状态。

位域(Bitfields)

Redis Bitfields是一种高效地存储和操作二进制位的数据类型。可以实现对二进制位的精确控制,包括读取、设置、清除和计数等操作。通过bitfield命令可以一次性操作多个比特位域(指的时连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。

流(Streams)

Redis Streams流是一个基于时间序列的数据结构,可以用于记录和处理多个事件的数据流。Redis SteamsRedis5.0版本新增加的数据结构。其主要用于消息队列(MQ),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但是它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。但是Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

Redis常用命令

官网查看: