Redis 常见使用场景


Posted in Redis onAugust 30, 2021

 Redis 16 个常见使用场景

1、缓存

String类型

例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。

2、数据共享分布式

String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享

例如:分布式Session

<dependency> 
 <groupId>org.springframework.session</groupId> 
 <artifactId>spring-session-data-redis</artifactId> 
</dependency>

3、分布式锁

String 类型setnx方法,只有不存在时才能添加成功,返回true

public static boolean getLock(String key) {
    Long flag = jedis.setnx(key, "1");
    if (flag == 1) {
        jedis.expire(key, 10);
    }
    return flag == 1;
}

public static void releaseLock(String key) {
    jedis.del(key);
}

4、全局ID

int类型,incrby,利用原子性

incrby userid 1000

分库分表的场景,一次性拿一段

5、计数器

int类型,incr方法

例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库

6、限流

int类型,incr方法

以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false

7、位统计

String类型的bitcount(1.6.6的bitmap数据结构介绍)

字符是以8位二进制存储的

set k1 a
setbit k1 6 1
setbit k1 7 0
get k1 
/* 6 7 代表的a的二进制位的修改
a 对应的ASCII码是97,转换为二进制数据是01100001
b 对应的ASCII码是98,转换为二进制数据是01100010

因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
*/

例如:在线用户统计,留存用户统计

setbit onlineusers 01 
setbit onlineusers 11 
setbit onlineusers 20

支持按位与、按位或等等操作

BITOPANDdestkeykey[key...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。       
BITOPORdestkeykey[key...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。 
BITOPXORdestkeykey[key...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。 
BITOPNOTdestkeykey ,对给定 key 求逻辑非,并将结果保存到 destkey 。

计算出7天都在线的用户

BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ...  "day_7_online_users"

8、购物车

String 或hash。所有String可以做的hash都可以做

Redis 常见使用场景

  • key:用户id;field:商品id;value:商品数量。
  • +1:hincr。-1:hdecr。删除:hdel。全选:hgetall。商品数:hlen。

9、用户消息时间线timeline

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

10、消息队列

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

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

上面的操作。其实就是java的阻塞队列。学习的东西越多。学习成本越低

  • 队列:先进先除:rpush blpop,左头右尾,右边进入队列,左边出队列
  • 栈:先进后出:rpush brpop

11、抽奖

自带一个随机获得值

spop myset

12、点赞、签到、打卡

Redis 常见使用场景

假如上面的微博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
  • 是不是比数据库简单多了。

13、商品标签

Redis 常见使用场景

老规矩,用 tags:i5001 来维护商品所有的标签。

  • sadd tags:i5001 画面清晰细腻
  • sadd tags:i5001 真彩清晰显示屏
  • sadd tags:i5001 流程至极

14、商品筛选

// 获取差集
sdiff set1 set2
// 获取交集(intersection )
sinter set1 set2
// 获取并集
sunion set1 set2

Redis 常见使用场景

假如:iPhone11 上市了

sadd brand:apple iPhone11

sadd brand:ios iPhone11

sad screensize:6.0-6.24 iPhone11

sad screentype:lcd iPhone 11

赛选商品,苹果的、ios的、屏幕在6.0-6.24之间的,屏幕材质是LCD屏幕

sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd

15、用户关注、推荐模型

follow 关注 fans 粉丝

相互关注:

  • sadd 1:follow 2
  • sadd 2:fans 1
  • sadd 1:fans 2
  • sadd 2:follow 1

我关注的人也关注了他(取交集):

  • sinter 1:follow 2:fans

可能认识的人:

  • 用户1可能认识的人(差集):sdiff 2:follow 1:follow
  • 用户2可能认识的人:sdiff 1:follow 2:follow

16、排行榜

id 为6001 的新闻点击数加1:

zincrby hotNews:20190926 1 n6001

获取今天点击最多的15条:

zrevrange hotNews:20190926 0 15 withscores

Redis 常见使用场景

Redis 相关文章推荐
redis连接被拒绝的解决方案
Apr 12 Redis
redis 限制内存使用大小的实现
May 08 Redis
Redis实现订单自动过期功能的示例代码
May 08 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
redis实现排行榜功能
May 24 Redis
浅谈Redis中的RDB快照
Jun 29 Redis
Redis三种集群模式详解
Oct 05 Redis
聊聊redis-dump工具安装问题
Jan 18 Redis
Redis如何使用乐观锁(CAS)保证数据一致性
Mar 25 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis入门教程详解
Redis如何实现分布式锁
Aug 23 #Redis
Redisson实现Redis分布式锁的几种方式
Redis分布式锁Redlock的实现
Aug 07 #Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 #Redis
Redis Cluster 集群搭建你会吗
Aug 04 #Redis
解析redis hash应用场景和常用命令
Aug 04 #Redis
You might like
PHP环境搭建最新方法
2006/09/05 PHP
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
一个简单的php路由类
2016/05/29 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
微信小程序签到功能
2018/10/31 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
用C++封装MySQL的API的教程
2015/05/06 Python
21行Python代码实现拼写检查器
2016/01/25 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
利用python写个下载teahour音频的小脚本
2017/05/08 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
反腐倡廉演讲稿
2014/05/22 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
南京导游词
2015/02/03 职场文书
给下属加薪申请报告
2015/05/15 职场文书