我在项目中使用Redis的几个场景

目录

缓存

会话存储

分布式锁

消息队列

位统计

计数器

排行榜


缓存

缓存的目的是为了提高系统响应速度、减少数据库等资源的压力,redis作为键值对形式的内存数

据库,可以提供非常快速的读取速度,使得它成为存储热点数据或频繁访问数据的理想选择。

在实际项目使用中我们通常会先查询缓存,如果存在则直接返回数据,如果不存在则查询数据库,

然后插入缓存;如果是更新数据则先删除数据库再删除缓存。在高并发中需要考虑延迟双删。

会话存储

使用Redis来存储会话(Session)数据,可以实现在无状态的服务器之间共享用户相关的状态数据

数据。通常我们会使用redis集群来做会话存储,以避免单个服务故障导致用户无法登录。

用户通过浏览器登录Web Server的时候,Web Server生成会话ID(SessionID),这里一方面存储到Redis,另一方面将会话ID返回给浏览器(如Cookie,Token等)。当用户再次发生请求时,浏览器则携带会话ID,Web Server根据会话ID到Redis中查询相关信息,进行登录权限等验证。

分布式锁

在分布式、微服务等系统中,由于部署了多个服务节点,必然存在着多个节点使用同一个资源的情况,此时需要使用分布式锁来协调资源的分配,基于Redis使用分布式锁,相对于其他方式数据库分布式锁、Zookeeper分布式锁等有着明显的性能优势。

这里主要是用Redis的原子操作命令:SETNX,该命令仅允许key不存在的时候才能设置key。

SETNX key value
将 key 的值设为 value ,当且仅当key不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。

实际项目中推荐使用Redisson。

消息队列

对于一些简单的项目,对数据一致性不太高的情况下,也可以通过redis的Pub/Sub来实现。发布/

订阅(Pub/Sub)是redis的一种通信机制,将数据推到信息管道中,其他客户端可通过订阅这

些管道来获取推送信息,用于消息的传输。

常用命令:

SUBSCRIBE channel # 订阅频道
unsubscribe channel # 取消订阅
PUBLISH channel "Hello Wrold" # 发布频道消息

缺点:

redis无法对消息持久化存储,因此当出现异常时容易丢失消息
订阅者消费很慢的情况下,不断积压的消息会使redis输出缓冲区的体积变得越来越大,这可能使得redis本身的速度变慢,甚至直接崩溃

位统计

Redis提供了一套位操作命令:setbit、getbit、bitcount。作为节省空间的利器,可以轻松存储海量

数据。设想需要存储1亿用户是否登录,若使用mysql等关系型数据库,数据量远超其存储极限,

这里使用Redis位操作。设定一个超长数组,只能存储0和1,每个用户对应一个下标,默认0表示

未登录,当用户登录时设置为1,则1亿用户占用的空间不到12M。

SETBIT bit 10086 1  #把第10086个位置设置为GETBIT bit 10086    #获取第10086个位置的值  看是0还是1

计数器

利用INCRBY命令可以统计网站的访问数量、全局ID等。

incrby userid 10000

使用该命令如果 key 不存在,那么key的值会先被初始化为0,然后再执行incrby命令。单线程加

上原子性确保了数据的唯一性。

排行榜

ZADD和ZRANGE提供了一套排序集合(Sorted Sets)。例:

# 首先使用ZADD添加集合
ZADD rank:score 100 "花"
ZADD rank:score 90 "草"
ZADD rank:score 80 "树木"# 获取集合
ZRANGE rank:score 0 -1 WITHSCORES

得到集合:

"花"
100
"草"
90
"树木"
80

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/455385.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql8通过binlog恢复数据

参考资料: 通过binlog恢复误update的数据(一)_binlog 恢复update-CSDN博客 记录一次工作中的误删除,使用binlog恢复数据的问题。 1:找到mysql8的binlog文件。 2:把binlog文件转换为初始sql文件 mysqlbinlog -vv --base64-outputdecode-row…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(上篇)——正会论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关(通过搜索标题关键词查找得到,可能不全)的论文,共计12篇,包含5篇正会论文和7篇Findings论文,以下是对这些论文的略…

PDF文件格式(一):新版格式交叉引用表

PDF交叉引用表是PDF的重要组成部分,本文介绍的是新交叉引用表,这种引用表的格式是PDF的obj格式,内容是被压缩存放在obj下的stream中,因此比常规的引用表格式复杂。下面就开始介绍这种交叉引用表的格式和解析的方法: 1…

主动网络安全:成本效率和危机管理的战略方法

如何面对复杂网络攻击的进攻策略以及零信任模型的作用。攻击后反应性网络安全策略的基本步骤,透明度和准备工作。 讨论采用主动网络安全方法的好处,特别是在成本效率和危机管理方面,进攻性安全测试对合规性和零日响应的影响。 组织应该更多…

【C生万物】C语言数据类型、变量和运算符

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

5-3、S曲线生成器【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍步进电机S曲线生成器的计算以及使用 一.计算原理 根据上一节内容,已经计算了一条任意S曲线的函数。在步进电机S曲线加减速的控制中,需要的S曲线如图1所示,横…

QML用ListView实现带section的GridView

QML自带的GridView只能定义delegate,没有section,类似手机相册带时间分组标签的样式就没法做。最简单的方式就是组合ListViewGridView,或者ListViewFlow,但是嵌套View时,子级View一般是完全展开的,只显示该…

【VUE】UniAPP之uview组件库,自定义tag封装,支持添加u-icon图标

组件代码 <template><view class"tag" :class"[props.mode, props.shape]"><slot name"left"><!-- icon图标 没有传入图标时不显示 --><u-icon v-if"props.icon ! " :name"props.icon" :color&…

【数据分享】1929-2023年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐月平均气温数据、逐月最高气温数据…

说说vue的diff算法

Vue的diff算法 是什么比较方式 – 深度优先&#xff0c;同层比较 比较只会在同层级进行&#xff0c;不会跨层级比较比较的过程中&#xff0c;循环从两边向中间收拢 diff 算法更新的例子原理分析 patchpatchVnodeupdateChildren 小结 Vue的diff算法 此文章&#xff0c;来源于印…

Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝,无法连接...问题解决方法之一

一、问题描述 将Redis压缩包解压后&#xff0c;安装Redis过程中出现问题Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝&#xff0c;无法连接... 官网windows下redis开机自启动的指令如下&#xff1a; 1、在redis目录下执行 redis-server --service-in…

Java面向对象 创建类 创建对象

目录 创建类类的属性类的方法实例分析 创建对象创建Test类测试分析 创建类 类的属性 属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。 属性定义格式&#xff1a; [修饰符] 属性类型 属性名 [默认值] ;类的方法 方法用于定义该类或该类实例…