Redis数据类型
目前7.0版本Redis一共有10种数据类型。
字符串(Strings)
Redis Strings是Redis最基本的类型,最大可以存储512MB的字符串。一个Key对应一个Value。String类型是二进制安全的,意思就是Redis
的String可以包含任何数据,比如jpg图片或者序列化对象。可以对字符串进行一些特殊的操作,比如追加、覆盖、自增、自减等等。
简单说明
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
SET
命令有EX
、PX
、NX
、XX
以及KEEPTTL
五个可选参数,其中KEEPTTL
是6.0版本添加的可选参数,其他都是2.6.12版本添加的可选参数。
SET
命令使用EX
、PX
、NX
参数,其效果等同于SETEX
、PSETEX
、SETNX
命令。根据官方文档描述,未来版本中SETEX
、PSETEX
、SETNX
命令可能会被淘汰。EXAT
、PXAT
以及GET
为6.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
命令,如不满足NX
、XX
条件等。若使用GET
参数,则返回该键原来的值,或在键不存在时返回nil
。
列表(Lists)
Redis Lists列表是简单的字符串列表,按照插入顺序排序。按照插入顺序排序。可以在列表的两端进行插入、删除操作,也可以通过索引来访问列表中的元素。它的底层实际是一个双端链表,最多可以包含232-1个元素(4294967295,每个列表超过40亿的元素)。
简单说明
Redis Lists是一个双端链表的结构,对两端的操作性能很高,但是通过索引操作中间的节点性能会较差。主要功能有PUSH/POP等,一般用在栈、队列、消息队列等场景。双端都可以插入添加。
- 如果键不存在则创建新的链表。
- 如果键已经存在,新增内容。
- 如果值全移除了,对应的键也就消失了。
哈希表(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 Steams是Redis5.0版本新增加的数据结构。其主要用于消息队列(MQ),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但是它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。但是Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
Redis常用命令
官网查看: