基本数据类型和key
2023-3-22
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

Redis 提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)
notion image
notion image
随着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字符串

StringRedis 最基本的数据类型。字符串是一组字节,在Redis 数据库中,字符串具有二进制安全(binary safe)特性,这意味着它的长度是已知的,不由任何其他终止字符决定的,一个字符串类型的值最多能够存储512MB的内容。
二进制安全:是一种主要用于字符串操作函数的计算机编程术语。只关心二进制化的字符串,不关心具体的字符串格式,严格的按照二进制的数据存取。这保证字符串不会因为某些操作而遭到损坏。
使用SET命令储存一个字符串,然后使用GET命令查看它:
使用 Redis 存储了一个键为name,值为xukaistring类型数据
 
使用MSET命令一次性存储多个值,并使用MGET命令查询多个key
 

list列表

List中的元素是字符串类型,其中的元素按照插入顺序进行排列,允许重复插入,最多可插入的元素个数为 个(大约40亿个),可以添加一个元素到列表的头部(左边)或者尾部(右边)。

hash哈希散列

hash散列是由字符串类型的fieldvalue组成的映射表,可以把它理解成一个包含了多个键值对的集合。由于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)型的缓存型数据库,它将数据全部以键值对的形式存储在内存中,并且keyvalue一一对应。这里的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的类型并不局限于字符串,在 Rediskey 具有二进制安全的特性,这意味着它可以使用任何二进制序列,但是这种 key 过于复杂一般不建议采用。总之,“见名知意”就是 key 最佳的命名规范。
对于相同数据类型而言,如果对已经存在的 key 重新设置了新的 value,那么原来的 value 就会被覆盖掉,可以用这种方法来修改 key存储的值。
 

key过期时间

Redis允许为 key 设置一个过期时间(使用 EXPIRE 等命令),也就是“到点自动删除”,这在实际业务中是非常有用的,一是它可以避免使用频率不高的key长期存在,从而占用内存资源;二是控制缓存的失效时间。
 
Redis使用两种方式相结合的方法来处理过去的 key
  • Redis会把每个设置了过期时间的key存放到一个独立的字典中,并且会定时遍历这个字典来删除到期的 key
  • 使用“惰性策略”来删除过期的key。所谓“惰性策略”指的是当客户端访问这个key的时候,Rediskey的过期时间进行检查,如果过期了就立即删除。
 

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 指的是迭代游标
        • 语法格式:SCAN cursor [MATCH pattern] [COUNT count]
          参数说明:
        • cursor:指定游标,从 0 开始新的迭代
        • pattern:指定匹配的模式
        • count:返回多少个元素,默认值为 10
        •  
          SCAN 令可以迭代数据库中的所有键,如果想针对特定的数据类型迭代,那么命令自然也要做相应的变化:
        • SSCAN 命令用于迭代集合键中的元素
        • HSCAN 命令用于迭代哈希键中的键值对
        • ZSCAN 命令用于迭代有序集合中的元素
      • MOVE:将当前数据库的 key 移动到给定的数据库中
      • PERSIST:移除 key 的过期时间,key 将持久保持
      • PTTL:以毫秒为单位返回 key 的剩余的过期时间
      • TTL:以秒为单位,返回给定 key 的剩余生存时间
      • RANDOMKEY:从当前数据库中随机返回一个 key
      • RENAME:修改 key 的名称
      • RENAMENX:仅当 newkey 不存在时,将 key 改名为 newkey
      • TYPE:返回 key 所储存的值的类型
       
    • Redis
    • 命令行模式底层数据结构
      目录