redis - redis数据结构与API
2024-09-01 18:18:42
通用命令
- keys:遍历所有的key【keys一般不再生产环境使用】,时间复杂度O(n)
- keys *
- keys he*
- keys he[h-l]*
- keys ph?
- dbsize:计算key的总数,时间复杂度O(1)
- exists key:检查key是否存在,如果存在,返回1;不存在,返回0,时间复杂度O(1)
- del key[key...]:删除key,时间复杂度O(1)
- expire key seconds:设置key的过期时间,key在seconds秒会自动删除,时间复杂度O(1)
- ttl key:查看key的剩余过期时间
- 如返回-2,则表示key不存在,已经过期
- 如返回-1,则表示key存在,没有过期时间
- persist key:去掉key的过期时间
- ttl key:查看key的剩余过期时间
- type key:key的数据类型,时间复杂度O(1)
数据结构与API
String
字符串键值结构
key | value(最大512M) |
---|---|
hello | world |
counter | 1 |
bits | 1 0 1 0 1 0 1 |
使用场景
- 缓存
- 计数器
- 分布式锁
- ......
API
API | 作用 | 时间复杂度 |
---|---|---|
get key | 获取key对应的value | O(1) |
set key value | 设置key-value,不管key是否存在,都进行设置 | O(1) |
setnx key value | 设置key-value,key不存在,才设置 | O(1) |
set key value xx | 设置key-value,key存在,才设置 | O(1) |
mget key1 key2 key3 | 批量获取key,原子操作 | O(n) |
mset key1 value1 key2 value2 | 批量设置key-value | O(n) |
del key | 删除key-value | O(1) |
incr kry | key自增1,如果key不存在,自增后get(key)=1 | O(1) |
decr kry | key自减1,如果key不存在,自减后get(key)=-1 | O(1) |
incrby kry k | key自增k,如果key不存在,自增后get(key)=k | O(1) |
decrby kry k | key自减k,如果key不存在,自减后get(key)=-k | O(1) |
getset key newvalue | 设置key-newvalue并返回旧的value | O(1) |
append key value | 将value追加到旧的value | O(1) |
strlen key | 返回字符串的长度(注意中文) | O(1) |
incrbyfloat key value | 增加key对应的值value,浮点数操作 | O(1) |
getrange key start end | 获取字符串指定下标所有的值 | O(1) |
setrange key index value | 设置指定下标的值为value | O(1) |
n次get与1次mget
- n次get = n次网络时间 + n次命令时间
- 1次mget = 1次网络时间 + n次命令时间
Hash Tables
哈希键值结构
key | field value |
---|---|
user:1:info | id 1 name "你是一个好人" age 22 date 2019-12-06 |
API
API | 作用 | 时间复杂度 |
---|---|---|
hget key field | 获取hash key对应的field的value | O(1) |
hset key field value | 设置hash key对应的field的value | O(1) |
hdel key field | 删除hash key对应field的value | O(1) |
hexists key field | 判断hash key是否有field | O(1) |
hlen key | 获取hash key field的数量 | O(1) |
hmget key field1 field2 | 批量获取hash key的一批field的值 | O(n) |
hmset key field1 value1 field2 values | 批量设置hash key的一批filed value | O(n) |
hgetall key | 返回hash key对应所有的field和value | O(n) |
hvals key | 返回hash key对应所有的field的value | O(n) |
hkeys key | 返回hash key对应的所有field | O(n) |
hsetnx key field value | 设置hash key对应的field的value(如field已经存在,则失效) | O(1) |
hincrby key field intCounter | hash key对应的field的value自增intCounter | O(1) |
hincrbyfloat key field floatCounter | hash key对应的field的value自增floatCounter | O(1) |
String VS Hash
相似的API
String API | Hash API |
---|---|
get | hget |
set、setnx | hset、hsetnx |
del | hdel |
incr、incrby、decr、decrby | hincrby |
mset | hmset |
mget | hmget |
Linked Lists
列表结构
key | elements |
---|---|
user:1:meaasge | a-b-c-d-e-f-g-h-i-j-k |
特点
- 有序
- 可以重复
- 左右两边插入弹出
API
API | 作用 | 时间复杂度 |
---|---|---|
rpush key value1 value2 ... valueN | 从列表右端插入值(1-N个) | O(1-N) |
lpush key value1 value2 ... valueN | 从列表左端插入值(1-N个) | O(1-N) |
linsert key before|after value newValue | 在列表指定的值前|后插入newValue | O(n) |
rpop key | 从列表右侧弹出一个元素 | O(1) |
lpop key | 从列表左侧弹出一个元素 | O(1) |
lrem key count value | 根据count值,从列表中删除所有value相等的项 (1)count>0,从左到右,删除最多count个value相等的项 (2)count<0,从右到左,删除最多Math.abs(count)个value相等的项 (3)count=0,删除所有value相等的项 |
O(n) |
ltrim key start end | 按照索引范围修剪列表,保留索引范围值 | O(n) |
lrange key start end(包含end) | 获取列表指定索引范围所有元素(从右到左,最后一个元素的索引为-1) | O(n) |
lindex key index | 获取列表指定索引的元素 | O(n) |
llen key | 获取列表的长度 | O(1) |
lset key index newValue | 设置列表指定索引的值为newValue | O(n) |
blpop key timeout | lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不阻塞 | O(1) |
brpop key timeout | rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永不阻塞 | O(1) |
PS:
- LPUSH + LPOP = Stack
- LPUSH + RPOP = Queue
- LPUSH + LTRIM = Capped Collection
- LPUSH + BRPOP = Message Queue
Sets
集合结构
key | values |
---|---|
user:1:follow | music beer book read |
特点
- 无序
- 无重复
- 支持集合间操作
API
集合内API
API | 作用 | 时间复杂度 |
---|---|---|
sadd key element1 element2...elementN | 向集合key添加element(如果element已经存在,则添加失败) | O(1-N) |
srem key element | 将集合key中的element元素移除 | O(1) |
scard key | 计算集合key的大小 | O(1) |
sismember key element | 判断element是否在集合key中(1:存在) | O(1) |
srandmember key count | 从集合key中随机挑选count个元素 | |
smembers key | 获取集合key中所有元素,返回结果无序,小心使用 | |
spop key | 从集合key中随机弹出一个元素 | O(1) |
集合间API
API | 作用 |
---|---|
sdiff key1 key2 | 计算集合key1和集合key2的差集 |
sinter key1 key2 | 计算集合key1和集合key2的交集 |
sunion key1 key2 | 计算集合key1和集合key2的并集 |
sdiff|sinter|sunion store destkey | 将差集|交集|并集结果保存在destkey中 |
PS:
- SADD = Tagging
- SPOP/SRANDMEMBER = Random item
- SADD + SINTER = Social Graph
Sorted Sets
有序集合结构
key | score value |
---|---|
user:ranking | 51 abc 91 def 200 ghi 250 jkl 251 mno |
集合 VS 有序集合
集合 | 有序集合 |
---|---|
无重复元素 | 无重复元素 |
无序 | 有序 |
element | element + score |
列表 VS 有序集合
列表 | 有序集合 |
---|---|
可以有重复元素 | 无重复元素 |
有序 | 有序 |
element | element + score |
API
API | 作用 | 时间复杂度 |
---|---|---|
zadd key score[可以重复] element[不可以重复] 【可以是多对】 |
添加score和element | O(logN) |
zrem key element【可以是多个】 | 删除元素 | O(1) |
zscore key element | 返回元素的分数 | O(1) |
zincrby key increScore element | 增加或减少元素的分数 | O(1) |
zcard key | 返回有序集合key的元素个数 | O(1) |
zrank key element | 返回有序集合key的元素element的升序排名 | O(1) |
zrange key start end [withscores] | 返回指定索引范围内的升序元素【分值】 | O(log(n)+m) |
zrangebyscore key minScore maxScore [withscores] | 返回指定分数范围内的升序元素【分值】 | O(log(n)+m) |
zcount key minScore maxScore | 返回有序集合内在指定分数范围内的个数 | O(log(n)+m) |
zremrangebyrank key start end | 删除指定排名内的升序元素 | O(log(n)+m) |
zremrangebyscore key minScore maxScore | 删除指定分数内的升序元素 | O(log(n)+m) |
zrevrank key element | 返回有序集合key的元素element的降序排名 | O(log(n)+m) |
zrevrange key start end [withscores] | 返回指定索引范围内的降序元素【分值】 | O(log(n)+m) |
zrevrangebyscore key minScore maxScore | 返回指定分数范围内的降序元素【分值】 | O(log(n)+m) |
最新文章
- Sqlite 存储自定义对象
- Arcgis创建SDE_Geometry、SDO_Geometry的区别【转】
- 【转】Spark性能优化指南——基础篇
- trace工具,c++/c#/python
- jqueryIFrame框架内元素操作
- Codeforces Beta Round #7 C. Line (扩展欧几里德)
- 结构体定义 typedef struct 用法详解和用法小结
- [Quick-x]制作新手引导高亮区域方法之一:混合模式
- c语言指针字符串与字符数组字符串的区别
- Python练习_更改配置文件(3)
- STL之如何选择顺序容器
- Android 使用GangSDK创建第三方家族公会系统经验分享
- 在ubuntu16.04中再次体验.net core 2.0
- 迭代DOM集合的几种方法
- 基于Ubuntu的ESP32平台搭建
- [contest 782] 9.7
- 概率校准与Brier分数
- Python中的None与Null(空字符)的区别
- 使用git将代码推到coding
- 数字证书在web应用中实现登陆
热门文章
- 基于verdaccio的npm私有仓库搭建
- Python3爬虫(2)_利用urllib.urlopen发送数据获得反馈信息
- [Nginx]Ubuntu18.04 安装配置Nginx1.13.6+FastDFS
- Java 实现一个 能够 进行简单的增删改查的 超市管理系统
- 在线热备份数据库之innobackupex 完整备份InnoDB
- iSCSI 共享存储
- 一、EditPlus 的安装 - Java软件的安装
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作
- docker监控容器
- python Django框架正式准备工作