Redis五种数据结构的介绍和使用以及相关使用场景
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