type
status
date
slug
summary
tags
category
icon
password
Property
Redis 提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
随着Redis版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增),
Redis
数据类型的应用场景:- String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等
- List 类型的应用场景:消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等
- Hash 类型:缓存对象、购物车等
- Set 类型:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等
- Zset 类型:排序场景,比如排行榜、电话和姓名排序等
- BitMap(2.2 版新增):二值状态统计的场景,比如签到、判断用户登陆状态、连续签到用户总数等
- HyperLogLog(2.8 版新增):海量数据基数统计的场景,比如百万级网页 UV 计数等
- GEO(3.2 版新增):存储地理位置信息的场景,比如滴滴叫车
- Stream(5.0 版新增):消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据
string字符串
String
是Redis
最基本的数据类型。字符串是一组字节,在Redis
数据库中,字符串具有二进制安全(binary safe)特性,这意味着它的长度是已知的,不由任何其他终止字符决定的,一个字符串类型的值最多能够存储512MB的内容。二进制安全:是一种主要用于字符串操作函数的计算机编程术语。只关心二进制化的字符串,不关心具体的字符串格式,严格的按照二进制的数据存取。这保证字符串不会因为某些操作而遭到损坏。
使用
SET
命令储存一个字符串,然后使用GET
命令查看它:使用 Redis 存储了一个键为
name
,值为xukai
的string
类型数据使用
MSET
命令一次性存储多个值,并使用MGET
命令查询多个key
:list列表
List
中的元素是字符串类型,其中的元素按照插入顺序进行排列,允许重复插入,最多可插入的元素个数为 个(大约40亿个),可以添加一个元素到列表的头部(左边)或者尾部(右边)。hash哈希散列
hash
散列是由字符串类型的field
和value
组成的映射表,可以把它理解成一个包含了多个键值对的集合。由于Hash
类型具有上述特点,所以一般被用来存储对象。使用HMSET
命令来存储一个包含了用户基本信息的对象:HMSET
可以同时设置多个字段,HGETALL
用来查询全部字段。userid:1
是键。一个Hash
中最多包含 个键值对。set集合
Set
是一个字符串类型元素构成的无序集合。在Redis
中,集合是通过哈希映射表实现的,无论是添加元素、删除元素,亦或是查找元素,它们的时间复杂度都为。通过
SADD
命令添加string
元素到Set
集合中,若添加成功则返回 1,如果元素已经存在,则返回 0:由于
Set
集合中的成员具有唯一性,所以重复插入元素不会成功。SMEMBERS
命令查看集合中元素,元素会无序排列。zset有序集合
zset
是一个字符串类型元素构成的有序集合,集合中的元素不仅具有唯一性,而且每个元素还会关联一 个double
类型的分数,该分数允许重复。Redis
正是通过这个分数来为集合中的成员排序。通过
zadd
命令添加元素到集合,若元素存在于集合中,则不能添加成功:zscore
查看指定成员的分值key键
Redis
是一种键值(key-value)型的缓存型数据库,它将数据全部以键值对的形式存储在内存中,并且key
与value
一一对应。这里的key
被形象的称之为密钥,Redis
提供了诸多操作这把“密钥”的命令,从而实现了对存储数据的管理。可以把
key
看成value
的变量,通过检索key
就可以找到对应的 value
值。key的类型
key
的类型对应着value
的类型,同样也有五种(string、list、hash、set、zset)。如果key
指向的是一个字符串类型的值,那么key
的类型就是字符串。可以通过TYPE
命令来查看 key
的类型:key的命名规范
key
的命名需要遵循以下规则:key
取值不可以太长,否则会影响value
的查找效率,并且浪费内存空间
key
取值也不能过短,否则会使得key
可读性变差
在
key
的取值上, Redis
官方建议使用“见名知意”的字符串格式,比如要现在存放一个用户的姓名,其信息如下:id | name |
01 | XiaoHong |
使用一个
key
来存储用户的名字,key
的设置如下所示:上述示例,自定义了
uesr:id:01:username
这个 key
,通过 key
不仅可以知道用户的 id
,还可以知道这 key
是用来存储用户名字的。注意,这里的:
只是起到分割符的作用,并不是固定的语法格式。在
Redis
中,也可以将一个空字符串设置成 key
:key
的类型并不局限于字符串,在 Redis
中 key
具有二进制安全的特性,这意味着它可以使用任何二进制序列,但是这种 key
过于复杂一般不建议采用。总之,“见名知意”就是 key 最佳的命名规范。对于相同数据类型而言,如果对已经存在的
key
重新设置了新的 value
,那么原来的 value
就会被覆盖掉,可以用这种方法来修改 key
存储的值。key过期时间
Redis
允许为 key
设置一个过期时间(使用 EXPIRE
等命令),也就是“到点自动删除”,这在实际业务中是非常有用的,一是它可以避免使用频率不高的key
长期存在,从而占用内存资源;二是控制缓存的失效时间。Redis
使用两种方式相结合的方法来处理过去的 key
:Redis
会把每个设置了过期时间的key
存放到一个独立的字典中,并且会定时遍历这个字典来删除到期的key
- 使用“惰性策略”来删除过期的
key
。所谓“惰性策略”指的是当客户端访问这个key
的时候,Redis
对key
的过期时间进行检查,如果过期了就立即删除。
Redis key命令格式
key
相关的命令,语法格式:COMMAND
:表示key
的命令
KEY_NAME
:表示key
的名字
例如,
DEL
代表删除命令,如果成功删除了键,则将的返回整数 1,否则将返回整数 0:常用的
Redis
键命令- DEL:用于删除 key
- DUMP:序列化给定 key ,并返回被序列化的值
- EXISTS:检查给定 key 是否存在
- EXPIRE:为给定 key 设置过期时间
- EXPIREAT:用于为 key 设置过期时间,接受的时间参数是 UNIX 时间戳
- PEXPIRE:设置 key 的过期时间,以毫秒计
- PEXPIREAT:设置 key 过期时间的时间戳(unix timestamp),以毫秒计
- KEYS:查找所有符合给定模式的 key
keys *
返回当前库中所有的键- SCAN cursor:基于游标的迭代器,用于迭代数据库中存在的所有键,cursor 指的是迭代游标
cursor
:指定游标,从 0 开始新的迭代pattern
:指定匹配的模式count
:返回多少个元素,默认值为 10- SSCAN 命令用于迭代集合键中的元素
- HSCAN 命令用于迭代哈希键中的键值对
- ZSCAN 命令用于迭代有序集合中的元素
语法格式:
SCAN cursor [MATCH pattern] [COUNT count]
参数说明:
SCAN 令可以迭代数据库中的所有键,如果想针对特定的数据类型迭代,那么命令自然也要做相应的变化:
- MOVE:将当前数据库的 key 移动到给定的数据库中
- PERSIST:移除 key 的过期时间,key 将持久保持
- PTTL:以毫秒为单位返回 key 的剩余的过期时间
- TTL:以秒为单位,返回给定 key 的剩余生存时间
- RANDOMKEY:从当前数据库中随机返回一个 key
- RENAME:修改 key 的名称
- RENAMENX:仅当 newkey 不存在时,将 key 改名为 newkey
- TYPE:返回 key 所储存的值的类型