我在项目中使用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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MiniCPM:揭示端侧大语言模型的无限潜力

技术博客链接: 🔗https://shengdinghu.notion.site/MiniCPM ➤ Github地址: 🔗https://github.com/OpenBMB/MiniCPM ➤ Hugging Face地址: 🔗https://huggingface.co/openbmb/MiniCPM-2B-sft-bf16 1 …

3D Line Mapping Revisited论文阅读

1. 代码地址 GitHub - cvg/limap: A toolbox for mapping and localization with line features. 2. 项目主页 3D Line Mapping Revisited 3. 摘要 提出了一种基于线的重建算法,Limap,可以从多视图图像中构建3D线地图,通过线三角化、精心…

随机森林超参数的网格优化(机器学习的精华--调参)

随机森林超参数的网格优化(机器学习的精华–调参) 随机森林各个参数对算法的影响 影响力参数⭐⭐⭐⭐⭐几乎总是具有巨大影响力n_estimators(整体学习能力)max_depth(粗剪枝)max_features(随机…

ACM训练题:Fadi and LCM

首先LCM(a,b)X,说明a*b>X,当且仅当a,b互质时相等,题意要让a,b都尽可能小,最好让a*bX,即a,b互质。原因如下: 最小公倍数由a、b中最…

电脑上常见的绘图软件有哪些?

现在在电脑上绘图很流行,不仅可以随时更改,还可以提高绘图效率,绘图软件中有很多工具。市场上的计算机绘图软件种类繁多。包括艺术设计、工业绘图和3D绘图。那么每个绘图软件都有自己的特点。那么,哪个更适合计算机绘画软件呢&…

Redis核心技术与实战【学习笔记】 - 22.浅谈Redis的ACID相关知识

概述 事务是数据库的一个重要功能。所谓的事务,就是指对数据进行读写的一系列操作。事务在执行时,会提供专门的属性保证,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isol…

Android电动汽车充电服务vue+uniAPP微信小程序

本系统利用SSM和Uniapp技术进行开发电动汽车充电服务系统是未来的趋势。该系统使用的编程语言是Java,数据库采用的是MySQL数据库,基本完成了系统设定的目标,建立起了一个较为完整的系统。建立的电动汽车充电服务系统用户使用浏览器就可以对其…

centos 7.7 离线安装docker

centos 7.7 离线安装docker Index of linux/static/stable/x86_64/https://download.docker.com/linux/static/stable/x86_64/ 【1】离线下载docker 压缩包上传至 /usr/local 目录,解压缩,并复制到 /usr/bin/ 目录中。 cd /usr/local/tar -zxvf docke…

一篇文章了解区分指针数组,数组指针,函数指针,链表。

最近在学习指针,发现指针有这许多的知识,其中的奥妙还很多,需要学习的也很多,今天那我就将标题中的有关指针知识,即指针数组,数组指针,函数指针,给捋清楚这些知识点,区分…

两次NAT

两次NAT即Twice NAT,指源IP和目的IP同时转换,该技术应用于内部网络主机地址与外部网络上主机地址重叠的情况。 如图所示,两次NAT转换的过程如下: 内网Host A要访问地址重叠的外部网络Host B,Host A向位于外部网络的DNS服务器发送…

瑞_23种设计模式_建造者模式

文章目录 1 建造者模式(Builder Pattern)1.1 介绍1.2 概述1.3 创作者模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 模式拓展 ★★★4.1 重构前4.2 重构后 5 总结5.1 建造者模式优缺点5.2 建造者模式使用场景5.3 建造者模式 …

使用SPM_batch进行批量跑脚本(matlab.m)

软件:spm8matlab2023bwin11 数据格式: F:\ASL\HC\CBF\HC_caishaoqing\CBF.nii F:\ASL\HC\CBF\HC_caishaoqing\T1.nii F:\ASL\HC\CBF\HC_wangdonga\CBF.nii F:\ASL\HC\CBF\HC_wangdonga\T1.nii clear spmdirD:\AnalysisApps\spm8; datadirF:\ASL\HC\CBF…

Haas 开发板连接阿里云上传温湿度和电池电压

目录 一、在阿里云上创建一个产品 二、开发环境的介绍 三、创建wifi示例 四、编写SI7006和ADC驱动 五、wifi配网 六、主要源码 七、查看实现结果 一、在阿里云上创建一个产品 登录自己的阿里云账号, 应该支付宝,淘宝账号都是可以的。 接着根据需求…

Spring IOC 之深入分析 Aware 接口

🎬作者简介:大家好,我是小徐🥇☁️博客首页:CSDN主页小徐的博客🌄每日一句:好学而不勤非真好学者 📜 欢迎大家关注! ❤️ AbstractAutowireCapableBeanFacto…

小程序中封装下拉选择框

小程序中没有现成的下拉选择组件&#xff0c;有个picker组件&#xff0c;但是是底部弹出的&#xff0c;不满足我的需求&#xff0c;所以重新封装了一个。 封装的下拉组件 html部分&#xff1a; <view class"select_all_view"><!-- 内容说明&#xff0c;可…

设计一个可以智能训练神经网络的流程

设计一个可以智能训练神经网络的流程,需要考虑以下几个关键步骤: 初始化参数:设定初始的batch size和learning rate,以及其他的神经网络参数。训练循环:开始训练过程,每次迭代更新网络的权重。监控loss:在每个训练周期(epoch)后,监控loss的变化情况。动态调整:根据l…

python 多线程编程(一)

文章目录 threading - 基于线程的并行线程对象thread 类thread方法thread 属性例子 锁对象递归锁对象 条件对象 队列Queue对象SimpleQueque 对象例子 最近的工作需要用到多线程提升程序的运行效率&#xff0c;以前一直没有机会进行多线程编程&#xff0c;所以一直没有机会学习p…

Intellij IDEA各种调试+开发中常见bug

Intellij IDEA中使用好Debug&#xff0c;主要包括如下内容&#xff1a; 一、Debug开篇 ①、以Debug模式启动服务&#xff0c;左边的一个按钮则是以Run模式启动。在开发中&#xff0c;我一般会直接启动Debug模式&#xff0c;方便随时调试代码。 ②、断点&#xff1a;在左边行…

docker更换镜像源

添加的镜像源 {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com", "https://reg-mirror.qiniu.com/", "https://docker.mirrors.ustc.edu.cn"] }docker更换镜像源之后一定要重启守卫 systemctl daemon-reloaddock…

虚幻5源码版打包服务端

适用情况&#xff0c;windows系统&#xff0c;已经安装vs2022之类的&#xff0c;和UE5适配的版本 源码版使用 1.下载源码版&#xff0c;推荐下载 压缩包 tar.gz那个&#xff0c;zip和git clone我老是下载不下载来&#xff0c;只是这个压缩包要解压1个多小时… 2.点击 源码的…