当前位置:   article > 正文

Redis的16种常见应用场景

redis的应用场景例子

1. 缓存

String类型, 也支持gzcompress (PHP压缩函数)之后的二进制数据

例如: 热点数据的缓存, 对象serialize或json_encode之后的缓存, 全页缓存等.

2. 数据共享分布式

可以在多个应用之间共享数据.

例如: 多台AP服务器负载均衡之后的session共享.

3. 分布式锁

String类型的set方法 只有key不存在时才添加成功且包括有效期.

SET key value [EX seconds] [PX milliseconds] [NX|XX]

比如: SET key_with_expire 1 EX 10 NX表示这个key不存在时设置其值为1,有效期10秒.

不建议使用 setnx + setex 两步走的方法, 要保证操作的原子性比较麻烦

4. 全局ID

int类型, incrby, 利用redis操作的单线程特性.

incrby userno 1000

比如一次性申请1000个工号给某部门使用.

mysql在批量插入时, 如果需要自增id, 也会批量申请一批id, 避免单次申请造成低效率

5. 计数器

int类型, incr方法(每次加1, 也可以使用incrby每次增加指定值)

例如: 文章的阅读/浏览数量, 点赞数量, 可以先写入redis再定时同步到数据库

6. 限流

int类型, incr方法

以访问者的ip或其他信息作为key, (也可以再加上时间段限制, 比如一小时内, 一天内), 访问一次增加一次计数,, 超过次数则拦截请求

7. 位统计

Stirng类型的Bitmap应用. 可以参考Redis中bitmap的使用及在PHP中的应用

使用bitmap可以极大的节省数据存储的空间.

例如: 统计在线用户信息

8. 购物车

String或Hash. 所有String可以做的Hash都可以做.

存储与用户的商品信息, 数量, 价格等

9. 用户消息时间线 timeline

list, 双向链表, 直接作为timeline就好了, 插入有序.

10. 消息队列

list提供了两个阻塞的弹出操作: blpop, brpop, 且可以设置超时时间

  • blpop: blpop key timeout 移除并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止.
  • brpo: brpop key timeout 移除并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

11. 抽奖

set类型, pop方法, 自带一个随机获得值.

SPOP key

移除并返回集合中的一个随机元素.

  1. 127.0.0.1:6379> sadd db mysql
  2. (integer) 1
  3. 127.0.0.1:6379> sadd db sqlserver
  4. (integer) 1
  5. 127.0.0.1:6379> sadd db oracle
  6. (integer) 1
  7. 127.0.0.1:6379> smembers
  8. 1) "mysql"
  9. 2) "oracle"
  10. 3) "sqlserver"
  11. 127.0.0.1:6379> spop db
  12. "sqlserver"
  13. 127.0.0.1:6379> spop db
  14. "oracle"
  15. 127.0.0.1:6379> spop db
  16. "mysql"
  17. 127.0.0.1:6379> spop db
  18. (nil)

12. 点赞、签到、打卡

set类型. (也可以用string的bitmap)

假如一个微博ID是 t1001,用户ID是 u3001

用 like:t1001 来维护 t1001 这条微博的所有点赞用户

  • 点赞了这条微博:sadd like:t1001 u3001
  • 取消点赞:srem like:t1001 u3001
  • 是否点赞:sismember like:t1001 u3001
  • 点赞的所有用户:smembers like:t1001
  • 点赞数:scard like:t1001

这个用bitmap其实更好, 只是数据类型差异比较大.

13. 商品标签

set类型.

用 goods:tags:1001 来维护商品所有的标签。下面每行数据的最后一个是tagid

  • sadd goods:tags:1001 101
  • sadd goods:tags:1001 138
  • sadd goods:tags:1001 239

14. 商品筛选

set类型.

我们把手机品牌/屏幕尺寸/屏幕类型和产品id关联一下:

  1. 127.0.0.1:6379> sadd brand:iphone 1001 1003 1872
  2. (integer) 3
  3. 127.0.0.1:6379> sadd screensize:5.5-6.0 1003 1872
  4. (integer) 2
  5. 127.0.0.1:6379> sadd screentype:led 1001 1003
  6. (integer) 2

查询手机品牌是"iphone", 屏幕尺寸是"5.5-6.0"的所有产品id:

  1. 127.0.0.1:6379> sinter brand:iphone screensize:5.5-6.0
  2. 1) "1003"
  3. 2) "1872"

15. 用户关注, 推荐模型.

set类型(也可以使用string的bitmap)

比如: 关注 follow, 粉丝 fans

用户1关注的人: 2, 3, 5

  1. 127.0.0.1:6379> sadd user:1:follow 2 3 5
  2. (integer) 3

用户1的粉丝: 3, 5

  1. 127.0.0.1:6379> sadd user:1:fans 3 5
  2. (integer) 2

用户2关注的人: 1, 3

  1. 127.0.0.1:6379> sadd user:2:follow 1 3
  2. (integer) 2

用户2的粉丝: 1, 5

  1. 127.0.0.1:6379> sadd user:2:fans 1 5
  2. (integer) 2

用户1关注的人也关注了用户2(是用户2的粉丝): 取交集

  1. 127.0.0.1:6379> sinter user:1:follow user:2:fans
  2. 1) "5"

用户1可能认识的人: 取差集

  1. 127.0.0.1:6379> sdiff user:2:follow user:1:follow
  2. 1) "1"

用户2可能认识的人:取差集

  1. 127.0.0.1:6379> sdiff user:1:follow user:2:follow
  2. 1) "2"
  3. 2) "5"

16. 排行榜

zset类型.

例如: 获取今天点击最多的n条新闻.

  1. 127.0.0.1:6379> zincrby hotnews:20210909 1 1001
  2. "1"
  3. 127.0.0.1:6379> zincrby hotnews:20210909 1 1001
  4. "2"
  5. 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
  6. "1"
  7. 127.0.0.1:6379> zincrby hotnews:20210909 1 1001
  8. "3"
  9. 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
  10. "1"
  11. 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
  12. "2"
  13. 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
  14. "3"
  15. 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
  16. "4"
  17. 127.0.0.1:6379> zincrby hotnews:20210909 1 1002
  18. "5"
  19. 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
  20. "2"
  21. 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
  22. "3"
  23. 127.0.0.1:6379> zincrby hotnews:20210909 1 1010
  24. "4"
  25. 127.0.0.1:6379> zincrby hotnews:20210909 1 1010

上面代码演示的是每次增加点击量一个(最后一个值是新闻id). 那查询今天点击最多的0-15条新闻的信息:

  1. 127.0.0.1:6379> zrevrange hotnews:20210909 0 15 withscores
  2. 1) "1010"
  3. 2) "5"
  4. 3) "1002"
  5. 4) "5"
  6. 5) "1001"
  7. 6) "3"

返回的数据是: 新闻id, 次数(分数), 新闻id, 次数(分数),.....

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号