独立开发者系列(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 节点。然而,对于更高级的分布…

【C语言】多线程服务器

多线程服务器 多线程服务器步骤代码 最后 多线程服务器 步骤 主线程创建子线程,用子线程和客户端通信。 步骤: 1.使用socket函数,获取一个socket文件描述符 2.使用setsockopt端口复用 3.使用bind函数允许客户端的哪些ip可以访问服务器 4.使…

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发现成功登录。。。 发现文件上传功能点 尝试进…

Nikto 扫描 Web 服务器漏洞

目录 介绍 使用 进阶用法 示例命令 介绍 Nikto 是一个开源的 Web 服务器扫描工具,旨在帮助发现和修复 Web 服务器上的安全问题。它是渗透测试和安全审计中的常用工具之一。 已知漏洞:检测已知的 Web 服务器和应用程序的漏洞,如常见的安全…

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:

如何使用Gunicorn配置SSL/TLS加密Web服务

如何使用Gunicorn配置SSL/TLS加密Web服务 目录 简介SSL/TLS的基本概念 SSL与TLS的区别为什么需要SSL/TLS Gunicorn的简介与安装 什么是Gunicorn安装Gunicorn 生成SSL/TLS证书 自签名证书从受信任的证书颁发机构获取证书 配置Gunicorn使用SSL/TLS 配置文件的使用命令行参数配置…

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

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

Nginx 负载均衡详解

Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;拥有丰富的功能和模块&#xff0c;负载均衡就是其中之一。负载均衡是一种技术&#xff0c;用于在多台服务器之间分配工作负载&#xff0c;以确保高可用性和可靠性。本文将详细介绍Nginx的负载均衡算法、工作原理、配置方法…

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

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

AWS S3 基本概念

AWS S3 基本概念 引言什么是 AWS S3S3 应用S3 的核心概念 引言 最近工作中有接触到 S3&#xff0c;往 S3 写入数据&#xff0c;从 S3 访问数据&#xff0c;所以花点时间整理一下有关 S3 的基本概念。 什么是 AWS S3 AWS S3 (Amazon Simple Storage Service) 是一个由 Amazon…

Node.js配置CORS跨域(解决服务器api接口跨域问题)

一、安装cors npm install cors 二、在接口文件中使用cors const express require(express); const cors require(cors); // 引入 cors 中间件 const app express(); const port 3000;app.use(cors()); // 使用 cors 中间件const catList [{image: https://131703669…

prometheus+grafana应用监控配置

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

前端面试题日常练-day86 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 以下哪个HTML标签用于定义一个内联框架&#xff0c;用于嵌入其他网页&#xff1f; a) <frame> b) <iframe> c) <div> d) <section> 在JavaScript中&#xff0c;以下哪个方法…

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;本文将带你快速入门这神奇的数据库。 前…

Spring Boot项目的控制器貌似只能get不能post问题

我这2天新建了一个Spring Boot项目测试&#xff0c;在控制器上写了两个接口&#xff0c;一个是支持Get方式访问&#xff0c;另一个支持Post方式访问&#xff0c;发现Get可以&#xff0c;而Post不行。前端Post后&#xff0c;报403&#xff0c;找不到这个方法。 一、原因 原因是…