Redis五种数据结构的介绍和使用以及相关使用场景

Redis通用命令:

keys:

keys *遍历所有的keyO(n)
keys [pattern]遍历符合条件的key。例如keys he*,将匹配以he开头的键;keys he[h-l]*将匹配以he开头并且第三个字母在h-lq区间的键;keys ph前两位是ph的key。 
dbsize计算key的总数O(1)
exists keykey是否存在O(1)
del key删除对应key-valueO(1)
expire key secondskey在指定秒数后过期。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 valuekey不存在时,才生效O(1)
set key value xxkey存在时,才生效O(1)
mset k1 v1 k2 v2...kn vn设置多个键值对O(n)
getset key newValue设置对应Key为newValue,同时返回旧的valueO(1)
append key value将value追加到旧的valueO(1)
strlen key返回字符串的长度(注意中文)O(1)
incrbyfloat key 3.5key对应的值加3.5O(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:

  1. LRUSH + LPOP = Stack
  2. LUSH + RPOP = Queue
  3. LPUSH + LTRIM = Capped Collection
  4. 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

  1. sadd = Tagging
  2. spop/srandmember = random item
  3. 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

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值