在Web服务应用中,如何编程使用Redis的缓存功能?包括缓存页面内容、缓存数据库查询结果、用户会话信息等代码分享

news2024/9/21 6:29:24

目录

一、概述

二、redis介绍

1、简介

2、Redis作为缓存的原理

(1)内存存储

(2)数据结构

(3)工作原理

3、Redis作为缓存的作用

三、redis缓存页面内容

1、作用

2、实现方法

3、示例代码(Python)

四、redis缓存数据库查询结果

1、作用

2、实现方法

3、示例代码(Python)

五、redis缓存用户会话信息

1、作用

2、实现方法

3、示例代码(Python)


一、概述

        在 Web 服务应用中,Redis 是一种非常流行的内存数据结构存储,它可以作为数据库、缓存和消息中间件使用。Redis 提供了高性能的数据访问速度,使其成为实现 Web 应用缓存的理想选择。

二、redis介绍

1、简介

        Redis数据库是一个功能强大的开源内存数据结构存储系统,它使用ANSI C语言编写,支持网络、可基于内存亦可持久化,并以Key-Value的形式存储数据。Redis是NoSQL技术阵营中的一员,以其高性能、丰富的数据结构和多种特性而广受欢迎。

2、Redis作为缓存的原理

        Redis 作为缓存使用的原理主要基于其作为一个内存中的数据结构存储系统,它提供了快速的数据读写能力。具体如下:

(1)内存存储

  • 内存速度快:Redis 将所有数据存储在内存中,这意味着它可以非常快速地读写数据,比从磁盘读取数据要快得多。
  • 非持久化或持久化:虽然 Redis 主要用于缓存,它也支持数据的持久化,可以将内存中的数据保存到磁盘上,以便在系统重启后能够恢复数据。

(2)数据结构

  • 多种数据结构:Redis 支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,这使得它可以适应不同的缓存需求。
  • 原子操作:Redis 的所有操作都是原子的,这意味着在并发环境下,多个客户端同时对数据进行操作时,每个操作都是独立的,不会互相影响。

(3)工作原理

缓存命中:当应用程序需要读取数据时,它首先检查 Redis 缓存。如果数据在缓存中(缓存命中),则直接从 Redis 读取,而不需要访问后端数据库,这大大减少了数据访问时间。

缓存未命中:如果请求的数据不在缓存中(缓存未命中),应用程序需要从数据库或其他数据源加载数据,然后将这些数据写入 Redis 缓存,以便下次可以直接从缓存中读取。

缓存失效:缓存的数据通常会有一个过期时间,当数据过期后,它会被自动从缓存中移除。下次访问时,如果数据不在缓存中,则会发生缓存未命中,然后重新加载数据并更新缓存。

缓存更新:当后端数据发生变更时,需要更新缓存以保持数据的一致性。这可以通过设置过期时间或在更新数据库的同时更新缓存来实现。

3、Redis作为缓存的作用

        使用 Redis 作为缓存可以显著提升 Web 应用的性能,但需要注意缓存的有效期设置、缓存穿透问题以及缓存更新机制的设计。通过合理地利用 Redis 的缓存功能,可以有效减轻数据库的压力,提高应用的整体响应速度。在实际应用中,还需要根据具体的业务需求和场景来调整缓存策略。具体如下图示:

三、redis缓存页面内容

1、作用

        页面缓存可以显著提升 Web 应用的性能,因为它减少了数据库查询次数,从而减少了后端负载。

2、实现方法

(1)生成缓存键:为每个页面生成唯一的缓存键,通常基于 URL 或请求参数。

(2)存储页面内容:将 HTML 内容以字符串形式存储到 Redis 中。

(3)设置过期时间:为缓存项设置合理的过期时间,以确保数据不会过期太久。

(4)检查缓存:在响应请求之前,先检查 Redis 是否已有缓存。

(5)缓存穿透:处理缓存未命中情况,防止缓存穿透攻击。

(6)缓存更新:当数据更新时,清除相关的缓存项。

3、示例代码(Python)

如下为具体应用的代码:

import redis
from flask import Flask, request

app = Flask(__name__)
cache = redis.Redis(host='localhost', port=6379, db=0)

@app.route('/page/<path:url>')
def cached_page(url):
    cache_key = f'page:{url}'
    # 尝试从 Redis 中获取页面内容
    page = cache.get(cache_key)
    if not page:
        # 如果没有缓存,则从数据库或其他后端获取数据并生成页面
        page = generate_page(url)
        # 将页面内容存储到 Redis 中,并设置过期时间
        cache.set(cache_key, page, ex=300)  # 缓存有效期为 5 分钟
    return page

def generate_page(url):
    # 从数据库或其他后端获取数据并生成 HTML 页面
    # 这里仅为示例,实际应用中应根据需求实现
    return "<html><body>Hello, World!</body></html>"

四、redis缓存数据库查询结果

1、作用

        数据库查询结果的缓存可以减少数据库的负担,提高应用的响应速度。

2、实现方法

- 生成查询缓存键:根据 SQL 查询生成缓存键。

- 存储查询结果:将查询结果以序列化形式(如 JSON)存储到 Redis 中。

- 设置过期时间:为查询结果设置合理的过期时间。

- 检查缓存:在执行查询之前,先检查 Redis 是否已有缓存。

- 缓存更新:当数据更新时,清除相关的缓存项。

3、示例代码(Python)

        如下为具体应用的代码:

import redis
from sqlalchemy.orm import Session

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

def get_user_by_id(user_id):
    cache_key = f'user:{user_id}'
    # 尝试从 Redis 中获取用户信息
    user_data = cache.get(cache_key)
    if user_data:
        return user_data
    else:
        with Session(engine) as session:
            user = session.query(User).filter(User.id == user_id).first()
            if user:
                # 将查询结果存储到 Redis 中,并设置过期时间
                cache.set(cache_key, user.json(), ex=300)  # 缓存有效期为 5 分钟
                return user
            else:
                return None

五、redis缓存用户会话信息

1、作用

        会话信息的缓存可以提高会话管理的效率,尤其是在分布式环境下。

2、实现方法

(1) 生成会话 ID:为每个用户生成唯一的会话 ID。

(2) 存储会话数据:将用户会话数据存储到 Redis 中。

(3) 设置过期时间:为会话数据设置合理的过期时间。

(4) 会话验证:在每次请求时验证会话 ID,并从 Redis 中获取会话数据。

3、示例代码(Python)

        如下为具体应用的代码:

import redis
from flask import Flask, request, session

app = Flask(__name__)
cache = redis.Redis(host='localhost', port=6379, db=0)

@app.before_request
def before_request():
    # 获取会话 ID
    sid = request.cookies.get('session_id')
    if sid:
        # 从 Redis 中获取会话数据
        session_data = cache.get(sid)
        if session_data:
            session.update(session_data)

@app.after_request
def after_request(response):
    # 更新会话数据到 Redis
    if session:
        cache.set(request.cookies.get('session_id'), session, ex=3600)  # 缓存有效期为 1 小时
    return response

@app.route('/login', methods=['POST'])
def login():
    # 用户登录逻辑
    # ...
    # 设置会话数据
    session['user_id'] = user.id
    # 设置会话 Cookie
    response = app.make_response("Login successful")
    response.set_cookie('session_id', str(user.id))
    return response

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

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

相关文章

python07-单元测试框架unittest1-2

5 fixture 可以看作case的前置条件、后置条件 5.1 fixture的用例执行顺序 fixture分为 方法级别类级别模块级别 5.1.1方法级fixture 每个测试用例之前要调用setUp每个测试用例执行后要调用tearDowntestCase中有多少测试用例,那么setUp和tearDown就被调用多少次 def add(…

【Java】Spring-AOP与拦截器简洁实操 (上手图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 认识依赖4.2 使用AOP与拦截器4.2.1 使用AOP4.2.1.1 设置DemoAop类4.2.2.2 设…

【SpringBoot】电脑商城-11-显示购物车功能

加入购物车 1 购物车-创建数据表 1.使用use命令先选中store数据库。 USE store;2.在store数据库中创建t_cart用户数据表。 CREATE TABLE t_cart (cid INT AUTO_INCREMENT COMMENT 购物车数据id,uid INT NOT NULL COMMENT 用户id,pid INT NOT NULL COMMENT 商品id,price BIG…

java fastxml json 科学计数法转换处理

背景&#xff1a; 由于 canal 切换为 tx dbbridge后&#xff0c;发现dbbridge对于canal的兼容性存在较大问题&#xff0c;从而引发 该文档的实践。 就目前发现 dbbrige 的字段 大小写 和 数据类型格式 从binlog 写入kafka 同canal 都会存在差异。 canal之前导出都是小写&…

编程要由 “手动挡” 变 “自动挡” 了?Cursor+Claude-3.5-Sonnet,Karpathy 大神点赞的 AI 代码神器!如何使用详细教程

Cursor 情况简介 AI 大神 Andrej Karpathy 都被震惊了&#xff01;他最近在试用 VS Code Cursor Claude Sonnet 3.5&#xff0c;结果发现这玩意儿比 GitHub Copilot 还好用&#xff01; Cursor 在短短时间内迅速成为程序员群体的顶流神器&#xff0c;其背后的原因在于其默认使…

[VirtualBox+ubuntu24]设置linux学习环境

1)设置网络为桥接网卡&#xff0c;不然发现ifconfig出不来ip地址 依然设置为经典的: 2核4G内存 50G硬盘 2)设置默认root账户登录 // 不然每次都得输入sudo -s // step1: 打开配置文件 sudo vim/etc/gdm3/custom.conf// step2: 默认以root登录 [daemon] AutomaticLoginEnableT…

NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版

Paragon NTFS for Mac 15.4.44 中文破解版是一个底层的文件系统驱动程序,专门开发用来弥合Windows和Mac OS X之间的不兼容性&#xff0c;通过在Mac OS X系统下提供对任何版本的NTFS文件系统完全的读写访问服务来弥合这种不兼容性。为您轻松解决Mac不能识别Windows NTFS文件难题…

C语言:大小端模式、判断大小端、大小端转换

目录 1. 什么是大端和小端 2.为什么会存在大小端的问题 3. 判断主机字节序 (主机大小端) 3.1 使用联合体 (union) 3.2 使用指针 3.3 强制转为 char 类型法 4. 大小端转换 1. 什么是大端和小端 对于一个存储空间大于 1 个字节的数据&#xff0c;在内存中有两种存储模式&a…

VCTP论文精读

机器视觉推理自从引入神经符号机制以来取得了巨大进步&#xff0c;这使得机器能够发展出多步骤的推理链。然而&#xff0c;正如早期认知科学家所预示的那样&#xff0c;这种逻辑和符号系统基本上不适合于现实世界、常识知识的表示和推理&#xff0c;因为它们仅依赖于封闭世界的…

一个人独立开发前后端,终于有属于自己的一套产品

大家好&#xff0c;我是兔兔答题的开发者。兔兔答题是一款简单、易用的答题考试系统&#xff0c;可应用于微信考试、付费考试、社会调查问卷、明星知识问答、员工培训考核、模拟自测、企业面试、试题库等多种场景。兔兔答题会根据不同的场景&#xff0c;开发不同的模版。例如驾…

[Algorithm][综合训练][循环汉诺塔][kotori和素因子][dd爱科学]详细讲解

目录 1.循环汉诺塔1.题目链接2.算法原理详解 && 代码实现 2.kotori和素因子1.题目链接2.算法原理详解 && 代码实现 3.dd爱科学1.题目链接2.算法原理详解 && 代码实现 1.循环汉诺塔 1.题目链接 循环汉诺塔 2.算法原理详解 && 代码实现 解法&a…

虚幻5|C++第三人称射击(1)添加摄像机

一.在C类创建一个一个角色类蓝图&#xff0c;命名为BasePlayer 1.得到cpp和h文件 2.打开BasePlayer.h&#xff0c;定义摄像机内容 编译以下代码&#xff0c;定义摄像机和摄像机组件 private: //定义摄像机 UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category"…

【数学分析笔记】第2章第4节收敛准则(7)

2. 数列极限 2.4 收敛准则 2.4.8 实数系的基本定理 确界存在定理&#xff08;实数系的连续性&#xff09;单调有界数列收敛定理闭区间套定理Bolzanp-Weierstrass&#xff08;波尔查诺&#xff0d;魏尔斯特拉斯&#xff09;定理Cauchy&#xff08;柯西&#xff09;收敛原理&a…

前端与后端的身份认证

这里写目录标题 前端与后端的身份认证Web开发模式服务端渲染的Web开发模式前后端分离的Web开发模式根据场景选择开发模式 身份认证为什么需要身份认证不同开发模式下的身份认证 Session认证机制HTTP协议下的无状态性如何突破HTTP无状态的限制CookieCookie的几大特性&#xff1a…

代码随想录 刷题记录-23 单调栈

题目对“下一个更高”或者“下一个更低”有要求&#xff0c;可以考虑单调栈 &#xff08;也可以考虑双指针&#xff0c;双指针往往能够把时间复杂度的指数减一&#xff09; 1.739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等…

豆包MarsCode编程助手:让编程更简单

在编程的浩瀚宇宙中&#xff0c;每一个开发者都在寻找那把能够开启高效与创意之门的钥匙。随着AI技术的飞速发展&#xff0c;智能编程助手应运而生&#xff0c;为开发者们带来了前所未有的便捷与灵感。今天&#xff0c;我们将以五子棋小游戏开发为例&#xff0c;深入解读豆包Ma…

从文本坐标数据转换为矢量(点线面)

从坐标数据转换为空间几何(点线面) 介绍 只要文件中包含空间数据(如经纬度信息),转换为点、线或面要素。我们将使用内置的 excel Reader 参数、VertexCreator 转换器将坐标转换为点要素。我们还将使用 VertexCreator 转换器和 LineBuilder 转换器和AreaBuilder转换为线和…

第七讲 开发环境的搭建

1 首先是mdk5 的安装破解 然后就是 安装 f103 的 库。 然后是破解 &#xff1a; 2 然后是 进行编译测试。 随便打开一个工程 开始编译 3 然后是 ch340 的驱动的安装 目前就是安装完毕

校招简历生成器智能体:重塑求职新体验

校招简历生成器智能体&#xff1a;重塑求职新体验 在数字化时代&#xff0c;人工智能正以前所未有的速度改变着我们的生活与工作方式。百度文心智能体平台&#xff0c;作为AI技术应用的典范&#xff0c;正引领着智能服务的新潮流。今天&#xff0c;我们将聚焦于该平台上的一个…

黑马-Cloud21版-面试篇13:Sentinel源码分析

Sentinel源码分析 1.Sentinel的基本概念 Sentinel实现限流、隔离、降级、熔断等功能&#xff0c;本质要做的就是两件事情&#xff1a; 统计数据&#xff1a;统计某个资源的访问数据&#xff08;QPS、RT等信息&#xff09;规则判断&#xff1a;判断限流规则、隔离规则、降级规…