一、Redis是什么
Redis是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持数据结构,如字符串、哈希、列表、集合、带范围查询的排序集合、位图、超日志、带半径查询的地理空间索引和流。Redis具有内置的复制、Lua脚本、LRU逐出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和带有Redis集群的自动分区提供高可用性。
二、Redis的数据类型
Redis不是一个简单的键值存储,它实际上是一个数据结构服务器,支持不同类型的值。这意味着,在传统的键值存储中,将字符串键与字符串值相关联,而在Redis中,该值不仅限于简单的字符串,还可以保存更复杂的数据结构。这些数据结构包括:
数据结构 | 描述 |
---|---|
string | 二进制安全字符串。 |
List | 根据插入顺序排序的字符串元素集合。 |
Set | 唯一的、未排序的字符串元素的集合。 |
Sorted set | 类似于集合,但每个字符串元素都与一个浮点数(称为score)相关联。元素总是按其分数排序,因此与集合不同,可以检索一系列元素 |
Hashe | 它们是由与值关联的字段组成的映射。字段和值都是字符串。 |
Bit arrays (or simply bitmaps) | 使用特殊命令,可以像处理一个位数组一样处理字符串值:可以设置和清除单个位,将所有位设置为1,查找第一个设置或未设置的位,等等。 |
HyperLogLog | 这是一种概率数据结构,用于估计集合的基数。 |
Stream | 只追加提供抽象日志数据类型的类映射项集合 |
1、key
Redis的key是二级制安全的,可以用任意的二级制序列作为key,使用key有几点注意事项:
- 避免key过长,过长的key可以通过hash key 生成一个sha1串解决
- 避免key过短,尽量保持key的可读性的情况下缩短key的长度
- 建立一种key的Schema:例如 应用名:业务名:实体名:属性名
- key的最大允许值是512MB
2、string
string类型是可以与Redis键关联的最简单的值类型。与string相关的命令:
命令 | 描述 |
---|---|
set key value [expiration EX seconds|PX milliseconds] [NX|XX] | 如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。 expiration 表示key的生存时间 为空表示不设置生存时间,NX表示只在键不存在时, 才对键进行设置操作,XX表示只在键已经存在时, 才对键进行设置操作。 |
get key string | 检索一个key值 |
incr key | 为键 key 储存的数字值加上一。如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。INCR 命令会返回键 key 在执行加一操作之后的值。 |
SETNX key value | 只在键 key 不存在的情况下, 将键 key 的值设置为 value 。 若键 key 已经存在, 则 SETNX 命令不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 |
SETEX key seconds value | 将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。 如果键 key 已经存在, 那么 SETEX 命令将覆盖已有的值。 SETEX 和这两个命令的不同之处在于 SETEX 是一个原子(atomic)操作, 它可以在同一时间内完成设置值和设置过期时间这两个操作, 因此 SETEX 命令在储存缓存的时候非常实用。 |
PSETEX key milliseconds value | 这个命令和 SETEX 命令相似, 但它以毫秒为单位设置 key 的生存时间, 而不是像 SETEX 命令那样以秒为单位进行设置。 |
GET key |
返回与键 key 相关联的字符串值。 如果键 key 不存在, 那么返回特殊值 nil ; 否则, 返回键 key 的值。 如果键 key 的值并非字符串类型, 那么返回一个错误, 因为 GET 命令只能用于字符串值。 |
GETSET key value | 将键 key 的值设为 value , 并返回键 key 在被设置之前的旧值。 如果键 key 没有旧值, 也即是说, 键 key 在被设置之前并不存在, 那么命令返回 nil 。 当键 key 存在但不是字符串类型时, 命令返回一个错误。 |
STRLEN key | STRLEN 命令返回字符串值的长度。 当键 key 不存在时, 命令返回 0 。 当 key 储存的不是字符串值时, 返回一个错误。 |
APPEND key value | 如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾。 如果 key 不存在, APPEND 就简单地将键 key 的值设为 value , 就像执行 SET key value 一样。 返回 追加 value 之后, 键 key 的值的长度。 |
SETRANGE key offset value | 从偏移量 offset 开始, 用 value 参数覆写(overwrite)键 key 储存的字符串值。 不存在的键 key 当作空白字符串处理。 SETRANGE 命令会确保字符串足够长以便将 value 设置到指定的偏移量上, 如果键 key 原来储存的字符串长度比偏移量小(比如字符串只有 5 个字符长,但你设置的 offset 是 10 ), 那么原字符和偏移量之间的空白将用零字节(zerobytes, "\x00" )进行填充。 SETRANGE 命令会返回被修改之后, 字符串值的长度。 |
GETRANGE key start end | 返回键 key 储存的字符串值的指定部分, 字符串的截取范围由 start 和 end 两个偏移量决定 (包括 start 和 end 在内)。 负数偏移量表示从字符串的末尾开始计数, -1 表示最后一个字符, -2 表示倒数第二个字符, 以此类推。 GETRANGE 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。 GETRANGE 命令会返回字符串值的指定部分。 |
INCRBY key increment | 为键 key 储存的数字值加上增量 increment 。 如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。 如果键 key 储存的值不能被解释为数字, 那么 INCRBY 命令将返回一个错误。 返回 在加上增量 increment 之后, 键 key 当前的值。 |
INCRBYFLOAT key increment | 为键 key 储存的值加上浮点数增量 increment 。 如果键 key 不存在, 那么 INCRBYFLOAT 会先将键 key 的值设为 0 , 然后再执行加法操作。 如果命令执行成功, 那么键 key 的值会被更新为执行加法计算之后的新值, 并且新值会以字符串的形式返回给调用者。 |
DECR key | 为键 key 储存的数字值减去一。 如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECR 操作。 如果键 key 储存的值不能被解释为数字, 那么 DECR 命令将返回一个错误。 DECR 命令会返回键 key 在执行减一操作之后的值。 |
DECRBY key decrement | 将键 key 储存的整数值减去减量 decrement 。 如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECRBY 命令。 如果键 key 储存的值不能被解释为数字, 那么 DECRBY 命令将返回一个错误。 DECRBY 命令会返回键在执行减法操作之后的值。 |
MSET key value [key value …] | 同时为多个键设置值。 MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。 |
MSETNX key value [key value …] |