独立开发者系列(24)——使用redis

                      (一)REdis的使用原理

在早期的网站的时候,如果系统本身功能不是很复杂,比如就是内部的几个用户使用,而且基本就是汇报一点简单的设备维护信息,还有日常公告。完全可以不使用数据库,直接使用json格式储存在文本文件里面。

相比于储存在MYSQL里面,读取数据的时候,优势很明显

IO操作简单:读取文本文件涉及简单的IO操作,只需在文件系统中找到并读取文件。相比之下,从MySQL数据库中读取数据需要建立连接、执行查询,并将数据传输到应用程序中。

无需数据库查询优化:文本文件的读取不需要复杂的查询优化或索引操作,而数据库读取可能需要考虑索引的使用、查询优化器的性能等。

适用于小型数据集:对于较小的数据集,直接从文本文件中读取数据可能更为简便和快速,而不涉及数据库管理的额外开销和复杂性。

  所以当数据系统不复杂或者只是单纯的根据某个键获取对应值的时候,直接从文本获取优势很大。这个场景非常适合那些频繁读取但是又基本没有逻辑的数据。在之前开发的简单的一些页游的装备/套装/角色数据,基本都是直接存在XML文档里面。

   当时当场景更复杂的时候,会发现明显这种读取文本的方式不够用了,比如需要读取操作日志怎么办,当数据量很大,去磁盘获取N个不同的文件效率很低怎么办,又比如单文件的数据量过大,直接导致内存溢出怎么管理。在数据库的功能和快速获取数据之间,存在一个中间地带,于是类似的缓存软件,比如redis就出现了。

  为什么Redis会明显比Mysql速度要快,首先存储上redis是把数据储存在内存里面而不是硬盘上,读写速度就占据很大优势,其实本身储存的时候数据结构都是哈希结构,这个在算法上读取的效率是O(1)最快,Redis的响应方式是单线程,这样不存在锁竞争问题,内部也专门针对储存做了特别的数据结构储存设计。种种方便,让redis在处理简单的储存数据方面占据巨大速度响应优势。

  种种特性,让redis有了大放异彩的机会。以下一些很典型的应用场景:

   网站的初始化相关信息,每次访问,都要去读取MYSQL数据表,而这些信息一旦经过配置,基本上是属于参数类的信息,是不会改变的。这个时候,当访问量非常大的时候,需要将这部分信息直接储存在缓存里面,避免了对底层mysql频繁的读取。

   网站的流程锁或者频率锁,这些锁是有失效时间的,可能3-5秒就要失效,或者频率锁,可能1秒就要失效,这种场景下,用mysql操作显然是不适合的。于是需要设置一个会自动过期的锁或者流程结束后,我们能自由掌控的锁,而这种锁就非常适合redis存储。

   用户登录的中间信息,比如用户登录小程序但是没注册,而需求是必须在五分钟内注册才能算有效用户信息,这个时候,需要在用户登录的时候,储存一份相关数据信息到redis里面,然后注册的时候,根据前端传过来的token进行相互验证,失效了让用户刷新登录。

  更高阶点的操作,比如各种比较流行的排行榜操作: 先将类似{zhangsan:96,lisi:97:wangwu:92,zhaoliu:88,liqi:99 }这种类似的数组更新到一个类似paixu的有序集合里面去,里面指定根据分数来进行排名,

在使用redsi自带的排序函数获取前多少名,这样每次redis里面的数据进行更新的时候,都会自动进行一次排序

redis_client.zrevrange('leaderboard', rank_start, rank_end, withscores=True)。

小结:Redis的主要作用是快速的读取储存的简单数据,规模小的时候,可以不使用,并不影响整体的业务逻辑功能,但是当业务扩大,影响到响应速度的时候,一定需要缓存派上用场。

Redis常用的命令简单用法 在一般情况下,我们是不需要手动来操作这些东西的,一般一般都是各自对应的语言封装好了相关接口,我们直接调用,比如TP框架里面,配置好了之后,直接cache() 就代表在操作redis的储存设置/获取/过期


                  (二)Redis常用命令操作

键操作

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

        设置键的值,并可选地设置过期时间(秒或毫秒)、设置条件(NX:仅在键不存在时设置,XX:仅在键已存在时设置)。

    GET key

        获取指定键的值。

    DEL key [key ...]

        删除一个或多个键。

    EXPIRE key seconds

        设置键的过期时间(秒)。

    TTL key

        获取键的剩余过期时间(秒)。

    PERSIST key

        移除键的过期时间,使其永久有效。

字符串操作

    APPEND key value

        在键的值末尾追加值。

    STRLEN key

        获取键的值的长度。

    INCR key

        将键的值递增 1。

    DECR key

        将键的值递减 1。

列表操作

    LPUSH key value [value ...]

        将一个或多个值插入列表的头部。

    RPUSH key value [value ...]

        将一个或多个值插入列表的尾部。

    LPOP key

        移除并返回列表头部的一个元素。

    RPOP key

        移除并返回列表尾部的一个元素。

    LRANGE key start stop

        获取列表指定范围内的元素。

集合操作

    SADD key member [member ...]

        向集合中添加一个或多个成员。

    SMEMBERS key

        获取集合中所有的成员。

    SISMEMBER key member

        检查成员是否存在于集合中。

    SREM key member [member ...]

        从集合中移除一个或多个成员。

有序集合操作

    ZADD key score member [score member ...]

        向有序集合中添加一个或多个成员,同时指定它们的分数。

    ZRANGE key start stop [WITHSCORES]

        获取有序集合指定范围内的成员(按分数升序)。

    ZREVRANGE key start stop [WITHSCORES]

        获取有序集合指定范围内的成员(按分数降序)。

    ZSCORE key member

        获取有序集合中成员的分数。

其他常用命令

    PING

        测试与 Redis 服务器的连接是否存活。

    FLUSHALL

        删除所有数据库的所有键。

    INFO

        获取 Redis 服务器的信息和统计数据。

    CONFIG GET/SET parameter

        获取或设置 Redis 服务器的配置参数。

Redis实现排行榜的Python代码:
    import redis

 # 连接到Redis

r = redis.Redis(host='localhost', port=6379, db=0)

 # 添加成员到排行榜

def add_to_leaderboard(member, score):

    r.zadd('leaderboard', {member: score})

 # 获取排行榜前N名

def get_top_scores(n):

    return r.zrevrange('leaderboard', 0, n-1)

 # 获取成员的排名

def get_member_rank(member):

    return r.zrevrank('leaderboard', member)

# 更新成员的分数

def update_member_score(member, new_score):

    r.zadd('leaderboard', {member: new_score})

# 示例操作

add_to_leaderboard('user1', 100)

add_to_leaderboard('user2', 200)

add_to_leaderboard('user3', 150)

top_scores = get_top_scores(3)

print(top_scores)  # 输出排行榜前三名的成员

 user_rank = get_member_rank('user2')

print(f'user2 rank: {user_rank}')  # 输出user2的排名

 update_member_score('user1', 130)

print(get_top_scores(3))  # 输出更新分数后的排行榜前三名的成员

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

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

相关文章

IoTDB 集群高效管理:一键启停功能介绍

如何快速启动、停止 IoTDB 集群节点的功能详解! 在部署 IoTDB 集群时,对于基础的单机模式,启动过程相对简单,仅需执行 start-standalone 脚本来启动 1 个 ConfigNode 节点和 1 个 DataNode 节点。然而,对于更高级的分布…

02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波?1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料: 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…

7、y0usef

难度-低 局域网靶机地址发现 端口服务扫描 通过目录扫描发现adminstration目录,但是访问发现提升没有权限 尝试通过添加请求头X-Forwarded-For: http://127.0.0.1 成功绕过 访问发现是一个登录框 尝试admin admin发现成功登录。。。 发现文件上传功能点 尝试进…

JavaWeb后端学习

Web:全球局域网,万维网,能通过浏览器访问的网站 Maven Apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具 作用: 依赖管理:方便快捷的管理项目以来的资源(jar包)&am…

鸿蒙系统在服装RFID管理中的应用:打造智能零售新时代

​随着物联网技术的迅速发展,服装零售行业正面临着新的变革与挑战。鸿蒙系统作为新一代智能操作系统,结合RFID技术,为服装行业提供了高效、智能的管理解决方案。常达智能物联,作为RFID技术的领先企业,致力于将鸿蒙系统…

Linux的世界 -- 初次接触和一些常见的基本指令

一、Linux的介绍和准备 1、简单介绍下Linux的发展史 1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组(comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的…

jenkins系列-04-jenkins参数化构建

使用maven build之前,先checkout 指定分支或标签: 拖拽调整顺序:shell执行在前,构建在后: gitee新建标签tag:

代理模式(大话设计模式)C/C++版本

代理模式 C #include <iostream> using namespace std;class Subject // Subject 定义了RealSubject和Proxy的共用接口..这样就在任何使用RealSubject的地方都可以使用Proxy { public:virtual void func(){cout << "Subject" << endl;} };class R…

头歌资源库(29)流水线最优调度

一、 问题描述 二、算法思想 这是一个经典的作业调度问题&#xff0c;可以使用动态规划来解决。 首先&#xff0c;我们可以将每个任务定义为一个节点&#xff0c;图中的边表示任务的先后顺序。根据题目的要求&#xff0c;每个任务必须先在印刷车间进行印刷&#xff0c;然后…

prometheus+grafana应用监控配置

配置Prometheus 官方地址&#xff1a;Download | Prometheus &#xff08;wegt下载压缩包&#xff0c;解压并重命名prometheus&#xff0c;文件放于/data/prometheus即可&#xff09; 配置 service方法(文件放于 /etc/systemd/system/prometheus.service)&#xff1a; [Unit…

k8s(四)---node

四、node node就是节点 1.查看node&#xff08;查询集群状态&#xff09; kubectl get no状态为kubec Ready 可以查看更多信息&#xff1a;-owide kubectl node -owide node没有命名空间隔离&#xff0c;所以node不需要指定命名空间 此处是一个master节点、两个worker节点、状态…

Neo4j:图数据库的革命性力量

Neo4j 首席技术官 prathle 撰写了一篇出色的博文&#xff0c;总结最近围绕 GraphRAG 的热议、我们从一年来帮助用户使用知识图谱 LLM 构建系统中学到的东西&#xff0c;以及我们认为该领域的发展方向。Neo4j一时间又大火起来&#xff0c;本文将带你快速入门这神奇的数据库。 前…

NLP之词的重要性

文章目录 何为重要词TF*IDFTF*IDF其他版本TFIDF 算法特点TF*IDF的优势TF*IDF劣势 TF*IDF的应用搜索引擎文本摘要文本相似度计算 上一篇文章介绍了新词的发现&#xff0c;用内部凝固度和左右熵来发现新词。这时候机器对一篇文章有了对词的一定理解&#xff0c;这时我们让机器上升…

Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用

目录 开始 Prometheus 介绍 基本原理 组件介绍 下文部署组件的工作方式 Prometheus 生态安装&#xff08;Mac&#xff09; 安装 prometheus 安装 grafana 安装 node_exporter Prometheus 生态安装&#xff08;Docker&#xff09; 安装 prometheus 安装 Grafana 安装…

STM32之六:SysTick系统滴答定时器

目录 1. SysTick简介 2. 时钟来源 3. SysTick寄存器 3.1 CTRL—SysTick控制及状态寄存器 3.2 RELOAD—SysTick重装载数值寄存器 3.3 CURRENT—SysTick当前数值寄存器 4. systick系统定时器配置 5. 延时函数实现 5.1 延时函数编写步骤 5.2 微秒级延时函数delay_us 5.…

JVM:运行时数据区

文章目录 一、总览二、程序计数器1、介绍2、程序计数器在运行中会出现内存溢出吗&#xff1f; 三、栈1、介绍2、栈帧的组成部分&#xff08;1&#xff09;局部变量表&#xff08;2&#xff09;操作数栈&#xff08;3&#xff09;帧数据&#xff08;3&#xff09;栈内存溢出&…

2、ASPX、.NAT(环境/框架)安全

ASPX、.NAT&#xff08;环境/框架&#xff09;安全 源自小迪安全b站公开课 1、搭建组合&#xff1a; WindowsIISaspxsqlserver .NAT基于windows C开发的框架/环境 对抗Java xx.dll <> xx.jar 关键源码封装在dll文件内。 2、.NAT配置调试-信息泄露 功能点&#xf…

zigbee开发工具:3、驱动安装与程序下载(更新中...)

zigbee开发工具前两篇讲解了IAR开发工具的安装与注册&#xff0c;还介绍了新建一个cc2530开发工程的建立与配置。在进行zigbee开发&#xff0c;代码编写编译好后还需要下载到zigbee节点设备上进行调试与验证&#xff0c;那么就需要安装SmartRF Flash Programmer软件 和仿真器等…

【LabVIEW学习篇 - 6】:数组、簇

文章目录 数组创建数组数组函数数组大小 根据索引取值数组与for循环 案例一案例二 簇LabVIEW簇的特点和用途&#xff1a;创建簇解除捆绑按名称解除捆绑簇的捆绑重新排序簇中控件 数组 在LabVIEW中&#xff0c;数组是一种用于存储相同数据类型的多个元素的数据结构。以下是关于…

【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)

文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考&#xff1a; python 合并 ts 视频&#xff08;三种方法&#xff09;使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下&#xff0c;用 Python 合并 ts 文件为 mp4 文件常见的有三种方法&#xff1a; 调用…