redis cluster的批量操作
之前项目中都在使用redis的单机或者主从,后来迁移到集群的时候,出现了一系列问题,下面整理一下redis集群方面的知识。
之前项目中都在使用redis的单机或者主从,后来迁移到集群的时候,出现了一系列问题,下面整理一下redis集群方面的知识。
之前经常将将 Redis 的过期策略和内存淘汰策略搞混淆,查阅了一些资料后做个总结。
Redis 有 5 种基础数据结构,分别为:String (字符串)、Hash (哈希)、List (列表)、Set (集合) 和 Sorted Set (有序集合)
String 数据结构是简单的 key-value 类型。
最常见的用途就是缓存信息。我们可以将需要缓存结构体使用 JSON 序列化成字符串来缓存,取出来的时候再反序列化一下。
常用命令 | 说明 | 示例 |
---|---|---|
set | 设置指定 key 的值 | set name zubin |
get | 获取指定 key 的值 | get name |
del | 删除指定 key | del key |
mset | 批量设置指定 key 的值 | mset name zubin age 18 |
mget | 批量获取指定 key 的值 | mget name age |
setex | 如果设置指定 key 的值和过期时间(秒) | setex name 5 zubin |
setnx | 只有 key 不存在时设置 key 的值 | setnx name zubin |
incr | 将 key 中存储的数字值增 1 | incr age |
incyby | 将 key 所储存的值加上给定的增量值 | incrby age 5 |
decr | 将 key 中存储的数字值减 1 | decr age |
strlen | 返回指定 key 中 value 的长度 | strlen name |
append | 将字符串追加到指定 key 中值的末尾。 | append name 1 |
Redis hash 是一个 string 类型的 field 和 value 的映射表,是无序字典, 特别适合用于存储对象。每个 hash 可以存储2^32 - 1
(4294967295) 键值对。
常用命令 | 说明 | 示例 |
---|---|---|
hset | 设置 hash 表中 field 的值 | hset user name zubin |
hmset | 设置 hash 表中多个 field 的值 | hmset user name zubin age 18 |
hsetnx | field 不存在时设置哈希表字段的值 | hsetnx user name zubin |
hget | 获取指定字段的值 | hget user name |
hmget | 获取多个字段的值 | hmget user age name |
hgetall | 获取 hash 表中所有字段的值 | hgetall user |
hdel | 删除一个或多个 hash 字段 | hdel user age |
hexists | 判断 hash 表中指定的字段是否存在 | hexists user age |
hincrby | 为 hash 表中指定的整数值字段加上增量 | hincrby user age 5 |
hkeys | 获取 hash 表中所有的字段 | hkeys user |
hvals | 获取 hash 表中所有的值 | hvals user |
hlen | 获取 hash 表中字段的数量 | hlen user |
Redis 列表是简单的字符串列表,按照插入顺序排序,注意它是链表而不是数组,一个列表最多可以包含 2^32 - 1
个元素 (4294967295, 每个列表超过 40 亿个元素)。
list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。
list 常用来做异步队列使用,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
常用命令 | 说明 | 示例 |
---|---|---|
lpush | 将一个或多个值插入到列表头部 | lpush skills Node Golang Java |
lpushx | 将一个或多个值插入到已存在的列表头部 | lpushx skills Node Golang Java |
lpop | 移除列表第一个元素 | lpop skills |
blpop | 移除列表第一个元素, 列表为空会阻塞,直到超时或者有可移除的元素 | blpop skills 100 |
rpush | 将一个或多个值插入到列表尾部 | rpush skills Node Golang Java |
rpushx | 将一个或多个值插入到已存在的列表尾部 | rpushx skills Node Golang Java |
rpop | 移除列表最后一个个元素 | rpop skills |
brpop | 移除列表最后一个个元素, 列表为空会阻塞,直到超时或者有可移除的元素 | brpop skills 100 |
brpoplpush | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它 | brpoplpush skills list1 500 |
lindex | 通过索引获取列表中的元素 | lindex skills 1 |
lset | 通过索引来设置元素的值 | lset skills 0 Python |
llen | 获取列表长度 | llen skills |
lrange | 获取列表指定范围内的元素 | lrange skills 1 2 |
lrem | 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素 | lrem skills 0 node |
ltrim | 修剪列表,只保留指定区间内的元素 | ltrim skills 1 2 |
Redis 的 Set 是 String 类型的无序集合。它内部的键值对是无序的唯一的,这就意味着集合中不能出现重复的数据,集合中最大的成员数为 2^32 - 1
(4294967295)。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
常用命令 | 说明 | 示例 |
---|---|---|
sadd | 向集合添加一个或多个元素 | sadd skills python go java go |
scard | 获取集合的成员数 | scard skills |
sismember | 判断是否集合中的成员 | sismember skills go |
smembers | 返回集合中的所有成员 | smembers skills |
spop | 随机移除并返回集合中的一个元素 | spop skills |
sinter | 返回指定集合的交集 | sinter key1 key2 |
sunion | 返回指定集合的并集 | sunion key1 key2 |
sdiff | 返回指定集合的差集 | sdiff key2 key2 |
Redis 有序集合和集合一样也是 string 类型元素的集合,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score(分数),代表这个 value 的排序权重。集合中最大的成员数为 2^32 - 1
(4294967295)。
Redis 正是通过分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
常用命令 | 说明 | 示例 |
---|---|---|
zadd | 添加一个或多个成员或者更新已存在成员的分数 | zadd userscore zubin 1 |
zcard | 获取有序集合的成员数 | zcard userscore |
zcount | 获取有序集合指定区间分数的成员数 | zcount userscore 1 3 |
zincrby | 给指定成员的分数加上增量 | zincrby userscore 1 zubin |
zrange | 返回指定区间内的成员 | zrange userscore 0 -1 |
zrangebyscore | 返回 score 区间内的成员 | zrangebyscore userscore -inf +inf |
zrem | 移除一个或多个元素 | zrem userscore 0 -1 |
zrevrange | 返回指定分数区间内的成员,按分数递减 | zrevrange userscore 0 -1 |
zrevrank | 返回成员 member 的排名 | zrevrank userscore zubin |
zscore | 返回 score 的 score 值 | zscore userscore zubin |