Redis通用命令:
keys:
keys * | 遍历所有的key | O(n) |
keys [pattern] | 遍历符合条件的key。例如keys he*,将匹配以he开头的键;keys he[h-l]*将匹配以he开头并且第三个字母在h-lq区间的键;keys ph前两位是ph的key。 | |
dbsize | 计算key的总数 | O(1) |
exists key | key是否存在 | O(1) |
del key | 删除对应key-value | O(1) |
expire key seconds | key在指定秒数后过期。 | O(1) |
ttl key | 查看剩余过期时间 | O(1) |
type key | 返回key的类型 | O(1) |
注意:keys 命令不建议在生产环境使用,因为它是o(n)命令,生产环境通常来说键值对很多,因为Redis的单线程特性可能会阻塞其他命令。
怎么用?1、热备从节点:从节点可以重复复制主节点的数据。一般来说从节点不在生产环境使用,所有可以使用些重命令。2、scan命令
字符串
key都是字符串,value可以是五种数据类型。本质上value都是二进制字符串,最大大小512MB,但因为有其他开销通常更低。
使用场景:缓存、计数器、分布式锁
get key | 获取对应键的值 | O(1) |
set key value | 设置对应键的值 | O(1) |
del key | 删除对应键值 | O(1) |
incr key | 指定键的值自增1, 如果Key不存在,自增后get(key)=1 | O(1) |
decr key | 指定键的值自减1, 如果Key不存在,自减后get(key)=-1 | O(1) |
setnx key value | key不存在时,才生效 | O(1) |
set key value xx | key存在时,才生效 | O(1) |
mset k1 v1 k2 v2...kn vn | 设置多个键值对 | O(n) |
getset key newValue | 设置对应Key为newValue,同时返回旧的value | O(1) |
append key value | 将value追加到旧的value | O(1) |
strlen key | 返回字符串的长度(注意中文) | O(1) |
incrbyfloat key 3.5 | key对应的值加3.5 | O(1) |
getrange key start end | 获取字符串指定下标所有的值(下标从0开始) | O(1) |
setrange key index value | 设定指定下标所对应的值 | O(1) |
实战场景:
记录网站每个用户个人主页的访问量:incr userid:pageview(键名)(单线程:无竞争。不会出错)
缓存视频的基本信息(数据源在MySQL中)
分布式id生成器:三个应用,我们希望三个应用每次获取的Id自增:incr
哈希
key为字符串,值分为两部分field和value,视为属性和值。可以把key当作一张表的一行,Key就代表一个id,每个属性可以看作关系型数据库的一个字段。fields不能相同,value可以。
hget key field | 获取hash key对应的field的value | |
hset key field value | 设置hash key对应field的value | |
hdel key field | 删除hash key对应field的value | |
hexists key field | 判断hash key是否有field | |
hgetall key | 返回所有field。小心该命令,很多key的情况下可能造成阻塞。 | |
hlen key | 获取hash key field的数量 | O(n) |
hmget key field1 field2... field n | 批量获取hash key的一批值 | O(n) |
hmset set f1 v1 f2 v2... | 批量设置值 | 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存在,则失效)。 | |
hincrby key field intCounter value | 自增intCounter | |
hincrbyfloat | 自增小数 |
实战场景:
记录网站每个用户个人主页的访问量:hincrby user:1:info pageviewcount
缓存视频的基本信息(数据源在Mysql中)
列表
key是字符串,value是一个有序的list。特点是有序、可以重复。
rpush key v1 v2 v3 ...vn | 从列表右端插入值 | o(1~n) |
lpush | ||
linsert key before|after value newValue | 在list指定的值前后插入newValue | o(n) |
lpop key | 从左弹出一个item | o(n) |
lrem key count value | 根据count的值,从列表中删除所有value相等的项: count>0,从左到右,删除最多count个value相等的值 count<0,从右到左,删除最多Math.abs(count)个v相等的值 count=0, 删除所有v相等的项 | |
lrim key start end | 按照索引范围修剪列表 | |
lrange key start end | 获取列表指定索引范围所有item | |
lindex key index | 获取列表指定索引item | |
llen key | 获取列表长度 | |
lset key index newValue | 设置列表指定索引值为newV o(n) | |
blpop | b代表阻塞的概念。 blpop key timeout 是lpop的阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞。 | |
brpop | 跟blpop一样,只不过从右边获取 |
实战场景:
微博时间轴功能,微博从新到旧的顺序排列。每一个微博是一个对象,例如hash或字符串。然后你的微博Id作为key,你可以lrange获取0~10条微博然后mset获取所有内容,再序列化做出接口。
Tips:
- LRUSH + LPOP = Stack
- LUSH + RPOP = Queue
- LPUSH + LTRIM = Capped Collection
- LPUSH + BRPOP = Message Quene
集合
values无序的、不重复的。可以想到数学里集合的概念。交集、并集和差集分别对应方法: sinter, sunion, sdiff。
sadd key element | 向集合Key添加element,若存在则失败 | |
srem key element | 将集合key中的element移除掉 | |
scard key | 计算集合大小,也就是element的数量 | |
sismenber key element | 判断element是否在集合中 | |
srandmember key count | 在集合中随机挑count个元素,该方法对比spop不会破坏集合。 | |
spop key | 从集合中随机弹出一个元素 | |
smembers key | 获取集合所有元素。返回结果无序,如果member多,注意阻塞 | |
sinter/sunion/sdiff key1 key2 | ||
sinter/sunion/sdiff + store destkey | 将差集、交集和并集结果保存在destkey中 |
实战场景:
微博转发抽奖平台,can be spop
点赞 踩
标签tag 给用户添加标签: sadd user:1:tags tag1 tag2 给标签添加用户:略 可以将这两个操作放在同一个事务内。
共同关注
TIPS
- sadd = Tagging
- spop/srandmember = random item
- sadd + sinter = social graph 社交相关应用
zset 有序集合
相对于集合:同样无重复元素、有序、element + score
相对于列表: 无重复元素
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 | 返回元素的总个数 | O(1) |
zrank key value | 返回对应值的排名 | |
zrange key 0 -1 withscores | 0-1是值所有范围,返回指定索引范围内的升序元素 | o(log(n) + m) n指元素个数,m索引范围内的个数 |
zrangebyscore key minScore maxScore [withscore] | 返回指定分数范围内的升序元素 | o(log(n) + m) n指元素个数,m索引范围内的个数 |
zcount key minScore maxScore | 返回有序集合内在指定分数范围内的个数 | o(log(n) + m) n指元素个数,m索引范围内的个数 |
zremrangebyrank | 删除指定排名内的升序元素 | o(log(n) + m) n指元素个数,m索引范围内的个数 |
zremrangebyscore | 删除指定分数内的升序元素 | o(log(n) + m) n指元素个数,m索引范围内的个数 |
zrevrank | ||
zrevrange | ||
zrervrangebyscore | ||
zinterscore | ||
zunionstore |
实战
排行榜:分数添加更新,等等 score: timeStamp saleCount followCount