redis - redis数据结构与API
通用命令
- 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) |
redis - redis数据结构与API的更多相关文章
- Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数
1.Redis和nosql简介,api调用 14.1/ nosql介绍 NoSQL:一类新出现的数据库(not only sql),它的特点: 1. 不支持SQL语法 2. 存储结构跟传统关系型数 ...
- redis各种数据结构使用场景
一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...
- php数组去重、魔术方法、redis常用数据结构及应用场景
一.用函数对数组进行去重的方法 1.arrau_unique函数的作用 移除数组中重复的值. 将值作为字符串进行排序,然后保留每个值第一次出现的健名,健名保留不变. 第二个参数可以选择排序方式: SO ...
- redis基础数据结构及编码方式
redis基础数据结构和编码方式 一.基础数据结构 1)简单动态字符串 2)双端链表 3)字典 4)跳跃表 5)整数集合 6)压缩列表 二.对象类型与编码 在redis的数据库中创建一个新的键值对时, ...
- Redis底层数据结构详解
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...
- Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!
Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...
- Redis基本数据结构总结之STRING和LIST
Redis基本数据结构总结前言 Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我们 ...
- Redis基本数据结构总结之SET、ZSET和HASH
Redis基本数据结构总结 前言 Redis的特点在于其读写速度特别快,因为是存储在内存中的,其非常适合于处理大数据量的情况:还有一个是其不同于其他的关系型数据库,Redis是非关系型数据库,也就是我 ...
- Redis各种数据结构性能数据对比和性能优化实践
很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. ...
随机推荐
- 第三十章 System V信号量(一)
信号量 信号量和P.V原语由Dijkstra(迪杰斯特拉)提出 信号量: 互斥: P.V在同一进程中 同步: P.V在不同进程中 信号量值含义 S>0 : S表示可用资源个数 S=0 : 表示无 ...
- MATLAB实例:聚类初始化方法与数据归一化方法
MATLAB实例:聚类初始化方法与数据归一化方法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 聚类初始化方法:init_methods.m f ...
- Mysql用户管理及权限分配
早上到公司,在服务器上Mysql的数据库里新建了个database,然后本地的系统里用原来连接Mysql账号admin连这个数据库.结果报错了,大概是这样子的: Access denied for u ...
- android studio ndk 环境配置成eclipse模式
gradle.properties: android.useDeprecatedNdk=true build.gradle: android { ... sourceSets.main { jni.s ...
- [考试反思]1026csp-s模拟测试88:发展
不用你们说,我自己来:我颓闪存我没脸. 昨天的想法, 今天的回答. 生存, 发展. 总分榜应该稍有回升,但是和上面的差距肯定还是很大. 继续. 为昨天的谬误,承担代价. T2和T3都值得张记性. T2 ...
- [Usaco 2012 Feb]Cow coupons牛券:反悔型贪心
Description Farmer John needs new cows! There are N cows for sale (1 <= N <= 50,000), ...
- CSPS模拟 51
蒟蒻由于仍然苟活在$1jf$,不得不接受省选题的吊打$QWQ$ 蒟蒻由于拿了大神们不屑打的弱智暴力,而大神们$T3$的各种快速变换没调出来,所以拿到辽人生第一个$1jf$黄名 既侥幸又$kx$ T1 ...
- 使用Typescript重构axios(二十四)——防御XSRF攻击
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- P3084 [USACO13OPEN]照片(差分约束)
(已经有了简化版题面) 又秒了一次dp233 本来按照感觉瞎写了一发... 但还是老老实实列式子吧.... 对差分约束有了更深的理解 #include<cstdio> #include&l ...
- C语言|博客作业01
2.1你对计算机科学与技术的了解是怎样? 一开始,我并不知道计科和软件的区别,甚至以为这是一种专业的两种叫法.进了大学之后,才一下子懂了,计科就是计科,它和软件虽有相同之处,但是终究是不一样的.计科涉 ...