Redis的使用 | 青训营笔记

71 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

Redis

Redis是远程字典服务器,他可以基于内存存取数据,也可以将数据持久化进行存储。通常和其他数据库配合进行使用。例如和MySQL集群进行持久化存储,访问时优先访问redis作为缓存。

基本原理

Redis默认从内存中读写。

如果需要进行持久化存储,Redis提供了两种方式来放置重启后数据丢失。

  • 增量数据保存到AOF文件
  • 全量数据RDB文件

单线程处理所有命令,这样Redis就能减少很多线程安全问题。

应用场景

连续签到

每日签到功能,用户每日有一次签到的机会,断签签到计数归零。

Key: cc_uid_132457879878 (用户UID)

value: 252 (连续签到天数)

expireAt: 后天的0点

消息通知

使用list作为消息队列

使用场景:消息通知。

每秒从队列中pop元素,当文章更新,将更新后的文章推送到ElasticSearch,用户就能搜索到新的文章数据。

计数

一个用户有多项计数需求,可通过hash结构存储。

例如点赞数,阅读数等等。

keyvalue解释
got_digg_count10693文章被点赞数
got_view_count2238438文章被阅读数
followee_count176关注数
follower_count9895关注者
·········

排行榜

积分变化时,排名要实时更新。

结合dict后,可以通过key操作跳表的功能。

  • ZINCRBY myzset 2 "Alex"
  • ZSCORE myzset "Alex"

限流

要求1秒内放行的请求为N,超过N禁止访问

Key: comment_freq_limit_xxxxx

对这个Key调用incr,超过限制N则禁止访问,xxxxx是时间戳。

分布式锁

并发场景,要求一次只有一个携程能执行。

可以使用redis的setnx来实现,利用的特性:

  • Redis是单线程执行命令
  • setnx只有未设置过才能执行成功

数据结构

  • String 数据结构-sds

    • 可以存储字符串、数字、二进制数据
    • 通常和expire配合使用
    • 场景:存储计数、Session
  • QuickList quicklist有一个双向链表和listpack实现

  • listpack

  • hash

  • zskiplist 结合dict可以实现操作跳表