Redis 的常见使用场景

01 缓存

 作为 Key-Value 形态的内存数据库,Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数据非常简单,只需要通过 string 类型将序列化后的对象存起来即可,不过也有一些需要注意的地方:

· 必须保证不同对象的 key 不会重复,并且使 key 尽量短,一般使用类名(表名)加主键拼接而成。

· 选择一个优秀的序列化方式也很重要,目的是提高序列化的效率和减少内存占用。

· 缓存内容与数据库的一致性,这里一般有两种做法:

1.只在数据库查询后将对象放入缓存,如果对象发生了修改或删除操作,直接清除对应缓存(或设为过期);

2.在数据库新增和查询后将对象放入缓存,修改后更新缓存,删除后清除对应缓存(或设为过期)。

02 数据共享分布式

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

比如:共享session

在开发后台的时候,需要使用session来保存用户信息,当我们后台服务器不止一台,而是扩展成多台的时候,则需要有个来存储共享session的地方,而redis可以实现session共享

03 分布式锁

redis可以实现分布式锁,主要使用setnx这个api,如果存在则返回加锁失败,否则加锁成功,并可以设置过期时间。当程序执行完后,需要解锁。在解锁的时候,需要判断,解锁的线程与加锁的线程是同一个线程。所以判断与解锁需要是个原子操作。这个用到了lua脚本来实现。所以实现分布式锁主要有两点:

setnx,存在则加锁,否则返回失败;

使用lua脚本完成解锁操作。

04 消息队列

List是简单的字符串列表,可以从列表头部或尾部插入数据。使用的是压缩列表或者双向链表。常见命令是Left push ,Right pop,左进右出。

消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性。

消息保序,list本身就是有顺序的,可以用LPush和RPop左推右出,实现顺序有序,值得注意的是,在一直没有消息进来的情况,使用pop命令一直访问List会浪费CPU资源,可以使用Redis提供了 BRPOP 命令。BRPOP命令也称为阻塞式读取,客户端在没有读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据。

处理重复消息,redis 本身不会去控制存储数据的重复性,需要在客户端自行设计全局ID,消费者自己根据全局ID判断。

消息的可靠性,当消费者从List pop出一条消息,假如处理过程中异常或者系统停机,则redis 上的list已经取出来了,不能再重新消费。为了留存消息,List 类型提供了 BRPOPLPUSH 命令,这个命令的作用是让消费者程序从一个 List 中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存。

消息保序:使用 LPUSH + RPOP;

阻塞读取:使用 BRPOP;

重复消息处理:生产者自行实现全局唯一 ID;

消息的可靠性:使用 BRPOPLPUSH。

05 发红包

发红包需要确保在并发下,红包能只被一个人抢走。

做法:

将红包拆分成n份

使用redis list类型 存储红包,使用list 的pop 方法抢红包。

06 抽奖

Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。Set 类型除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。

存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次。

07 限流

int类型,incr方法

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

08 计数器

int类型,incr方法

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

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

相关推荐

  1. Redis 常见使用场景

    2024-04-12 18:12:02       32 阅读
  2. redis常见使用场景

    2024-04-12 18:12:02       28 阅读
  3. redis常见使用场景

    2024-04-12 18:12:02       24 阅读
  4. Redis使用(三)常见使用场景-session共享

    2024-04-12 18:12:02       30 阅读
  5. Redis应用场景以及常见问题(持续更新)

    2024-04-12 18:12:02       35 阅读
  6. Redis 数据类型及使用场景

    2024-04-12 18:12:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 18:12:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 18:12:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 18:12:02       82 阅读
  4. Python语言-面向对象

    2024-04-12 18:12:02       91 阅读

热门阅读

  1. 从零学算法274

    2024-04-12 18:12:02       34 阅读
  2. 【python处理数据的函数】---误区2

    2024-04-12 18:12:02       33 阅读
  3. LeetCode 每日一题 ---- 【2923. 找到冠军 I】

    2024-04-12 18:12:02       38 阅读
  4. linux总结

    2024-04-12 18:12:02       37 阅读
  5. 在linux上如何执行带有目录的命令

    2024-04-12 18:12:02       43 阅读
  6. steam流太难用了看看JDFrame

    2024-04-12 18:12:02       46 阅读
  7. mysql知识点

    2024-04-12 18:12:02       35 阅读
  8. 2024MarthorCUP妈妈杯——思路附代码B题

    2024-04-12 18:12:02       34 阅读
  9. Python启动多个Appium Services

    2024-04-12 18:12:02       43 阅读
  10. 【无标题】

    2024-04-12 18:12:02       40 阅读
  11. 洛谷---1090合并果子

    2024-04-12 18:12:02       42 阅读