一、数据类型
Redis 5 支持以下多种数据类型:
- 二进制安全的字符串。
- Lists (列表) :根据插入顺序排序的字符串元素的集合。
- Sets (集) :未排序的不重复的字符串元素的集合。
- Sorted Sets (排序集) :类似于集,但每个字符串元素与被称为分数的值相关,元素总是按其分数排序。
- Hashes (散列) :由字段 (Field) 和值都是字符串组成的映射的集合。
- Bit Arrays (也称 bitmaps 位图) :Bitmaps 本身不是一种数据结构, 实际上它就是字符串,但是它可以对字符串的位进行操作,所以在 Redis 官方的分类当中将其单独归为一类。
- HyperLogLogs :实际类型为字符串类型 ,它是一种基数算法, 通过 HyperLogLog 可以利用极小的内存空间完成独立总数的统计。
- Streams (流) :Stream是 Redis 5.0 引入的一种新数据类型,用于在生产者和消费者之间建立数据通道。
二、常用命令
2.1 字符串
作用 | 命令格式 | 参数或示例 |
---|---|---|
设置值 | set key value [ex seconds][px milliseconds][nx | xx] setnx setex |
获取值 | get key | 如果获取的键不存在 ,则返回 nil |
批量设置 | mset key value [key value ...] | mset a 1 b 2 c 3 d 4 |
批量获取值 | mget key [key ...] | mget a b c d |
计数 | incr key decr key incrby key increment(指定数值自增) decrby key decrement(指定数值自减) incrbyfloat key increment (浮点数自增) |
值是整数时返回自增或自减后的结果; 值不是整数时返回错误; 键不存在时自动创建,并按照初始值为 0 进行自增或自减。 |
追加值 | append key value | 向字符串尾部追加值。 |
字符串长度 | strlen key | 获取字符串长度,中文占用三个字节 |
设置并返回原值 | getset key value | |
设置指定位置的字符串 | setrange key offeset value | |
获取部分字符串 | getrange key start end |
2.3 哈希
作用 | 格式 | 参数或示例 |
---|---|---|
设置值 | hset key field value | hset user:1 name tom hset user:1 age 12 |
获取值 | hget key field | hget user:1 name |
删除 field | hdel key field [field ...] | |
计算 field 个数 | hlen key | |
批量设置或获取 | hmget key field [field] hmset key field value [field value...] |
hmset user:1 name mike age 12 city tianjin hmget user:1 name city |
判断 field 是否存在 | hexists key field | |
获取所有 field | hkeys key | |
获取所有 value | hvals key | |
获取所有的 filed-value | hgetall key | 如果哈希元素个数比较多可能会阻塞Redis,此时可以使用 hscan 渐进式遍历 |
计数 | hincrby key field hincrbyfloat key field |
2.4 列表
作用 | 格式 | 参数或示例 |
---|---|---|
增 | 左侧插入:lpush key value [value ...] 右侧插入:rpush key value [value ...] 某个指定元素前后插入:linsert key before |
after pivot value |
查 | 获取指定范围内的元素列表:lrange key start end 获取列表指定索引下标的元素:lindex key index 获取列表指定长度:llen key |
lrange listkey 0 -1 |
删 | 从列表左侧弹出元素:lpop key 从列表右侧弹出元素:rpop key 删除指定元素:lrem key count value 截取列表:ltrim key start end |
count>0:从左到右, 删除最多 count 个元素。 count<0:从右到左, 删除最多 -count 个元素。 count=0: 删除所有 |
改 | 修改指定下标的元素:lset key index newValue | |
阻塞操作 | blpop key [key ...] timeout brpop key [key ...] timeout |
key[key...]: 多个列表的键。 timeout: 阻塞时间 |
2.5 集合
集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中的元素是无序的, 不允许有重复元素,不能通过下标获取元素。
作用 | 格式 | 参数或示例 |
---|---|---|
添加元素 | sadd key element [element ...] | 返回结果为添加成功的元素个数 |
删除元素 | srem key element [element ...] | 返回结果为成功删除的元素个数 |
计算元素个数 | scard key | |
判断元素是否在集合中 | sismember key element | |
随机返回 | srandmember key [count] | 随机从集合返回指定个数元素,count 默认为1 |
从集合随机弹出元素 | spop key | srandmember 不会从集合中删除元素,spop 会 |
获取集合中所有元素 | smembers key | 可用 sscan 代替 |
集合间操作 :
作用 | 格式 |
---|---|
求多个集合的交集 | sinter key [key ...] |
求多个集合的并集 | suinon key [key ...] |
求多个集合的差集 | sdiff key [key ...] |
将交集、并集、差集的结果保存 | sinterstore destination key [key ...] suionstore destination key [key ...] sdiffstore destination key [key ...] |
2.6 有序集合
有序集合中的元素可以排序。它给每个元素设置一个分数(score) 作为排序的依据。
作用 | 格式 | 参数或示例 |
---|---|---|
添加成员 | zadd key score member [score member ...] | nx: member 不存在时才可设置成功, 用于添加; xx: member 存在时可以设置成功, 用于更新; ch: 返回此次操作后, 有序集合内元素和分数发生变化的个数; incr:对 score 做增加, 相当于下面的 zincrby。 |
计算成员个数 | zcard key | |
计算某个成员的分数 | zscore key member | |
计算某个成员的排名 | zrank key member zrevrank key member | zrank是从分数从低到高返回排名, zrevrank 反之。 |
删除成员 | zrem key member [member ...] | |
增加成员分数 | zincrby key increment member | zincrby user:ranking 9 tom |
返回指定排名范围的成员 | zrange key start end [withscores] zrevrange key start end [withscores] |
zrange是从低到高返回, zrevrange 反之。 |
返回指定分数范围内的成员 | zrangebyscore key min max [withscores][limit offset count] zrevrangebyscore key max min [withscores][limit offset count] |
其中 zrangebyscore 按照分数从低到高返回, zrevrangebyscore 反之; [limit offset count] 选项用于限制输出的起始位置和个数; min 和 max 代表最小和最大值,支持开闭区间, 也可以使用 -inf 和+inf 代表无限小和无限大。 |
删除指定排名内的升序元素 | zremrangerank key start end | |
删除指定分数范围的成员 | zremrangebyscore key min max |
集合间操作 :
作用 | 格式 |
---|---|
交集 | zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum |
并集 | zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum |
- destination : 交集计算的结果保存到这个键。
- numkeys : 需要做交集计算键的个数。
- key[key...] : 需要做交集计算的键。
- weights weight[weight...] : 每个键的权重, 在做交集计算时, 每个键中的每个 member 会将自己分数乘以这个权重, 每个键的权重默认是1。
- aggregate sum|min|max : 计算成员交集后, 分值可以按照sum(和)、min(最小值)、max(最大值)做汇总, 默认值是 sum 。
2.7 全局命令
- 查看所有键: keys *
- 查看键总数:dbsize
- 检查键是否存在:exists key
- 删除键:del key [key ...]
- 键过期:expire key seconds ,使用 ttl 命令可以查看键剩余的过期时间, 它有以下三种返回值:
- 大于等于0的整数: 键剩余的过期时间。
- -1: 键未设置过期时间。
- -2: 键不存在
- 查看键的数据类型:type key
2.8 键过期
可以使用以下命令完成设置键的过期时间:
- expire key seconds : 键在 seconds 秒后过期;
- expireat key timestamp : 键在秒级时间戳 timestamp 后过期;
- pexpire key milliseconds : 键在 milliseconds 毫秒后过期;
- pexpireat key milliseconds-timestamp :键在毫秒级时间戳 timestamp 后过期。
注意事项:
- 如果 expire key 的键不存在, 返回结果为 0;
- 如果设置过期时间为负值, 键会立即被删除, 此时等价于 del 命令;
- persist key 命令可以将键的过期时间清除,使键变成永久的;
- 需要特别注意对于字符串类型键, 执行 set 命令会清除掉已有的过期时间;
- Redis 不支持对二级数据结构的内部元素设置过期时间, 例如不能对列表内的某个元素设置过期时间;
- setex 命令是 set+expire 的组合, 它是一个原子操作。
2.9 渐进式键遍历
使用 keys 命令遍历键可能会带来阻塞的风险,因为 Redis 提供了渐进式键遍历命令 scan ,使用格式如下:
scan cursor [match pattern] [count number]
- cursor :游标,第一次遍历从 0 开始, 每次遍历完都会返回当前游标的值, 直到游标值为 0, 表示遍历结束。
- match pattern :可选参数, 它的作用的是匹配特定模式的键;
- count number :可选参数, 它的作用是表明每次要遍历的键个数, 默认值是 10。
2.10 数据库管理
- 切换数据库:select dbIndex
- 清除数据库:flushdb/flushall,flushdb只清除当前数据库, flushall会清除所有数据库。