RedisAPI的使用和理解
- 通用命令
- 通用命令
- keys 遍历所有key O(n)
- 热备从节点
- scan
- dbsize 计数器 算出key的总数 O(1)
- exists key 判断一个key是否存在 O(1)
- del key [key ...] 删除指定key-value 也可以删除多个 O(1)
- expire O(1)
- expire key seconds 设置过期时间 O(1)
- ttl key 查询key的过期时间 O(1)
- persist key 去掉过期时间 O(1)
- type key 返回key的类型 O(1)
- keys 遍历所有key O(n)
- 数据结构和内部编码
- string
- raw
- int
- embstr
- hash
- hashtable
- ziplist
- list
- linkedlist
- ziplist
- set
- hashtable
- intset
- zset
- skiplist
- ziplist
- string
- 单线程架构
- 纯内存
- 非阻塞 epoll IO--》Redis Event Loop
- 避免线程切换和竞态消耗
- 一次运行一条命令
- 拒绝长(慢)命令
- 通用命令
-
字符串类型 *特点 * 缓存 * 计数器 * 分布式锁
- 重要API
- get key 获取key对应的value O(1)
- set key 设置key的值 O(1)
- del key O(1)
- incr 自增1 key不存在 自增get(key)=1
- decr 自减1
- incrby 增加特定值
- decrby 减小特定值
- 实战
- incr userid:pagevire (单线程 无竞争)
- 缓存视频的基本信息(数据源在mysql中)伪代码vie --> App Server --> redis --> mysql
- 原子单线程 incr id
- 查缺补漏
- set key value 不管key是否存在 都可设置
- setnx key value key不存在 ,才设置 添加
- set key value xx key存在,才设置 更新操作
- mget 批量获取key 原子操作 O(n)
- mset key1 key2 .. 批量设置key-value O(n)
- get命令 n次get = n次网络时间+ n次命令时间
- mget 1次mget = 1次网络时间 + n次命令时间
- getset key newvalue 设置新的值返回旧的值
- append key value 将value追加到旧的value O(1)
- strlen key 返回字符串的长度(注意中文) O(1)
- incrbyfloat key 3.5 增加key对应的值3.5
- getrange key start end 获取字符串指定下标所有值 O(1)
- setrange key index value 指定下标所对应的值
-
总结
命令 含义 复杂度 set key value 设置key-value O(1) get key 获取key-value O(1) del key 删除key-value O(1) setnx setxx 根据key是否存在设置key-value O(1) incr decr 计数 O(1) mget mset 批量操作key-value O(n)
- 重要API
-
哈希类型 key field
- 重要API
- hget key field O(1)
- hset key field value O(1)
- hdel key field O(1)
- hgetall field
- hexists key field O(1)
- hlen key O(1)
- hmget key field1 ..fieldN 批量获取 O(n)
- hmset key field1 value1 ..fieldN valueN
- 哈希实战
- 记录网站每个用户个人主页的访问量
- hincrby user:info pageview count
- 缓存视频的基本信息
- hgetall(rediskey)
- 从redis获取数据
- 如果redis中没有 则从sql数据库中获取 然后返回给用户 写入redis中
- 记录网站每个用户个人主页的访问量
- 查缺补漏
- hgetall key O(n)
- hvals key O(n)
- hkeys key O(n)
- hsetnx
-
总结
命令 复杂度 hget hset hdel O(1) hexists O(1) hincrby O(1) hgetall hvals hkeys O(n) hmget hmset O(n)
- 重要API
-
列表类型
- 特点
- 有序
- 可以重复
- 左右两边插入
- 重要API
- rpush key value1 value2 O(1~n)
- rpush listkey c b a c -> b -> a
- rpush key value1 value2 O(1~n)
- lpush listkey c b a a <- b <- c
- linsert key before|after value newvalue O(n)
- a - b - c - d
- linsert listkey before b java ==> a - java - b - c - d
- linsert listkey after b php ==> a - b - php - c - d
- lpop key : lpop listkey ==> b - c - d
- rpop key : rpop listkey ==> a - b - c
- lrem key count value
- 根据count值,从列表中删除所有value相等的项目
- count> 0 从左到右 删除最多count个value相等的项
- count < 0 从右到左 删除最多个count绝对值个value相等的项
- count=0 删除所有value相等的项
- lrem listkey 0 a
- lrem listkey -1 c
- ltrim key start end O(n) 按照索引修建列表
- ltrim listkey 1 4
- 查询
- lrange key start end(包含end) O(n)
- lrange key 0 2 前三个元素
- lrange listkey 1 -1 从第二个元素到最后一个元素范围
- lindex key index O(n)
- lindex listkey 0 第一个元素
- lindex listkey -1 最后一个元素
- llen key 列表长度 O(1)
- 改
- lset key index newValue O(n)
- lset listkey 2 java 第三个元素修改为java
- blpop key timeout O(1)
- lpop阻塞版本 timeout 是阻塞超时时间 timeout=0 为永远不阻塞
- brpop key timeout
- rpush key value1 value2 O(1~n)
- 实战
- stack = lpush + lpop 先进后出
- queue = lpush + rpop 先进先出
- capped collection = lpush + ltrim 控制队列大小
- message Queue = lpush + brpop
- 特点
-
集合类型
- 特点
- 无序
- 无重复
- 集合间操作
-
集合内API和实战
- sadd key element O(1)
- srem key element O(1)
- scard key 计算集合大小
- sismember key 判断key是否存在在集合中
- srandmember key count 从集合中随机挑选count个元素
- spop key 从集合中随机弹出一个元素
- srandmember 和 spop
- spop从集合弹出
- srandmember 不会破坏集合的数据 随机返回多个元素
- srandmember 和 spop
- smembers key 取出几个中所有元素
- 无序
- 小心使用 集合元素过多 会阻塞redis
- scan 扫描集合中的元素 根据游标取出元素
- 实战
- 127.0.0.1:6379> sadd user:1:follow it news his sports
- (integer) 4
- 127.0.0.1:6379> smembers user:1:follow
- 1) "his"
- 2) "it"
- 3) "sports"
- 4) "news"
- 127.0.0.1:6379> spop user:1:follow
- "it"
- 127.0.0.1:6379> smembers user:1:follow
- 1) "his"
- 2) "sports"
- 3) "news"
- 127.0.0.1:6379> scard user:1:follow
- (integer) 3
- 127.0.0.1:6379> sismember user:1:follow entertainment
- (integer) 0
- 抽奖 spop 或 srandmember
- Like、赞、踩 sadd
- 标签(tag) 同事务
- 给用户添加标签 用户关注的标签
- sadd user:1 tag1 tag2 tag3
- 给标签添加用户 关注标签的用户
- sadd tag1:users user:1 user:3
- 给用户添加标签 用户关注的标签
-
集合间API和实战
- sdiff key key
- sinter key key
- sunion key key
- sdiff|sinter|sunion +store destkey 将差集、交集、并集结果保存在destkey中
- 实战
- 共同关注 sinter
- sadd = tagging
- spop/srandmember = random item
- sadd + sinter = social graph 社交相关应用
- 特点
-
有序集合
- 特定
- 无重复元素
- 有序
- elment + score
- 重要API 压缩列表 超列表
- zadd key score element O(logN)
- score 可以重复
- element 不可重复
- zadd user:1:ranking 255 tom
- zrem key element 可以是多个 O(1)
- zrem user:1:ranking tom
- zscore key element O(1)
- zscore user:1:ranking tom
- zincrby key increScore element
- zincrby user:1:ranking 9 mike
- zcard key 返回元素总数 O(1)
- zrank key element 获取元素index
- zrange key start end [withscores] O(log(n) +m)
- 返回指定索引范围内的升序元素
-
例子
- 127.0.0.1:6379> zadd player:rank 100 ronaldo 900 messi 800 c-ronaldo 600 kaka
- (integer) 4
- 127.0.0.1:6379> zscore player:rank kaka
- "600"
- 127.0.0.1:6379> zrank player:rank ronaldo
- (integer) 0
- 127.0.0.1:6379> zrank player:rank messi
- (integer) 3
- 127.0.0.1:6379> zrem player:rank messi
- (integer) 1
- 127.0.0.1:6379> zrange player:rank 0 -1 withscores
- 1) "ronaldo"
- 2) "100"
- 3) "kaka"
- 4) "600"
- 5) "c-ronaldo"
- 6) "800"
- zrangebyscore key minScore maxScore [withscores] O(log(n) +m)
- 返回指定分数范围内的升序元素【分值】
- zrangebyscore user:1:ranking 90 210 withscores
- zcount key minScore maxScore
- 返回有序集合内指定分数范围内的个数
- zcount user:1:ranking 200 221
- zremrangebyrank key start end O(log(n) +m)
- 删除指定排名内的升序元素
- zremrangebyrank user:1:ranking 1 2 删除第二名到第三名
- zremrangebyscore key minScore maxScore O(log(n) +m)
- 删除指定分之内的升序元素
- zremrangebyscore user:1:ranking 90 210
- zadd key score element O(logN)
- 实战
- 排行榜 新书热卖榜 特价畅销书 图书关注榜
- score timeStamp saleCount followCount
- 排行榜 新书热卖榜 特价畅销书 图书关注榜
- 查缺补露
- zrevrank
- zrevrange
- zrevrangebyscore
- zinterstore
- zunionstore
-
总结
操作类型 命令 基本操作 zadd zrem zcard zincrby zscore 范围操作 zrange zrangebyscore zcount zremrangebyrank 集合操作 zunionstore zinterstore
- 特定