地址

300分钟讲透大厂Redis面试精髓

五种数据类型

1574500417936

常用命令

String

1574516226428

Hash

1574516323023

List

1574516188357

Set

1574517224343

mset应用场景 : 实现对象存缓

mset支持嵌套

1
2
3
mset user:class1:hyl:age 22

mget user:class1:hyl:age # 22

1574512146436

这种方法非常适合存储对象 : 我们可以将对象属性全部都这么存储

mhset应用场景 : 实现对象存缓

1
hmset user hyl:age 21 hyl:name hyl hyl:sex:man

存储的键为user

优点

  1. 同类数据归类整合储存,方便数据管理
  2. 相比 string操作消耗内存与cpu更小
  3. 相比 string储存更节省空间

缺点

  1. 过期功能不能使用在field上,只能用在key上
  2. Redis集群架构下不适合大规模使用

setnx应用场景 : 分布式锁

redis是单线程模型 , 他天生就可以预防多线程不安全问题

分布式锁

分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性

使用redis实现分布式锁

  • setnx key value 实现加锁
  • del key实现解锁
  1. setnx : SET if Not eXists , 存储不存在的键值对 (如果存在就不操作)
  2. 利用这个特性setnx可以用于分布式 , 比如setnx name hyl , 返回1表示获取锁成功 , 返回0代表获取锁失败
  3. 只有第一条操作能成功 , 后来的操作失败 , 这样就保持了数据的一致性
  4. 但是最后要删掉这个键值对 : del name , 这样下一次就还能运行

最佳实践

1
set name hyl ex 10 nx # 防止程序意外终止导致死锁

web集群session共享

web集群共享redis , 所有web服务器都将session放入redis即可.

incr应用场景 : 分布式锁

redis是单线程模型 , 他天生就可以预防多线程不安全问题

  • incr num
  • incrby num 10086

分布式系统全局序列号

大型项目可能会分库分表 , 为了防止自增ID重复 , 我们可以使用redis

1
incrby orderid 1000    # redis 批量生成序列号提升性能

List应用场景 : 实现各种数据结构

1574516462127

Set应用场景 : 集合操作

1574518141623

redis集群架构

1574515900500

示例

mhset应用 : 购物车

1574515500472

购物车

  • 以用户id为key
  • 商品id为filed
  • 商品数量为value

购物车操作

  • 添加商品 : hset cart:1001100881
  • 增加数量 : hincrby cart:1001100881
  • 商品总数 : hlen cart:1001
  • 删除商品 : hdel cart:100110088
  • 获取购物车所有商品 : hgetall cart:1001

list应用 : 微博消息和微信公号消息

小明关注了 MacTalk,备胎说车等大V

  1. MacTalk发微博,消息ID为10018 .

    存储消息 :

    1
    LPUSH msg:{小明-ID} 100182
  2. 备胎说车发微博,消息ID为10086

    存储消息 :

    1
    LPUSH msg:{小明-ID} 10086
  3. 查看最新微博消息

    查看消息 :

    1
    LRANGE msg:{小明-ID } 0 5

Set应用 : 抽奖

  1. 点击参与抽奖加入集合

    1
    SADD key(userID)
  2. 查看参与抽奖所有用户

    1
    SMEMBERS key
  3. 抽取 count 名中奖者

    1
    SRANDMEMBER key [count]

    或者

    1
    SPOP key [count]  # 已经中奖的人剔除出去

eg :

1
2
sadd 活动:抽奖 用户ID
SMEMBERS 活动:抽奖

一般都不会使用string存储 , 都使用int , 所以更多的是sadd act:100 10086 (抽奖活动的ID为100 , 用户ID为10086)

Set应用 : 点赞,收藏,标签

  1. 点赞

    1
    SADD like:{消息ID} {用户ID}
  2. 取消点赞

    1
    SREM like:{消息ID} {用户ID}
  3. 检查用户是否点过赞

    1
    SISMEMBER like:{消息ID} {用户ID}
  4. 获取点赞的用户列表

    1
    SMEMBERS like:{消息ID}
  5. 获取点赞用户数

    1
    SCARD like:{消息ID}

Set应用 : 微博微信关注模型

1574518285941