Redis增删改查、复杂查询案例分析

embedded/2024/11/17 22:35:16/
  1. Redis 基本操作(增删改查)

    • 插入(增)操作
      • 字符串(String)类型插入:在 Redis 中,使用SET命令插入一个字符串类型的键值对。例如,SET user:name "John",这里user:name是键,"John"是值。它可以用来存储用户的姓名、配置信息等简单的文本数据。
      • 哈希(Hash)类型插入:哈希类型适合存储对象。例如,存储一个用户对象的信息,可以使用HSET命令。HSET user:1 name "Alice" age 25 email "alice@example.com",这表示在user:1这个键对应的哈希中,设置name字段为"Alice"age字段为25email字段为alice@example.com
      • 列表(List)类型插入:列表类型用于存储有序的元素序列。使用LPUSHRPUSH命令插入元素。LPUSH mylist "apple" "banana"表示向左(头部)插入元素"apple""banana"mylist列表中,RPUSH则是向右(尾部)插入。
      • 集合(Set)类型插入:集合用于存储无序的、不重复的元素。SADD myset "a" "b" "c"将元素"a""b""c"添加到myset集合中。
      • 有序集合(Sorted Set)类型插入:有序集合不仅存储元素,还存储元素的分数(用于排序)。ZADD myzset 1 "element1" 2 "element2""element1""element2"添加到myzset有序集合中,分数分别为12
    • 查询操作
      • 字符串(String)类型查询:使用GET命令查询字符串类型的值。例如,GET user:name会返回之前设置的"John"
      • 哈希(Hash)类型查询HGET用于获取哈希中的一个字段的值,如HGET user:1 name返回"Alice"HGETALL则返回哈希中的所有字段和值,例如HGETALL user:1会返回{name: "Alice", age: 25, email: "alice@example.com"}(以伪代码形式展示返回格式)。
      • 列表(List)类型查询LRANGE命令用于获取列表中的元素范围。例如,LRANGE mylist 0 -1会返回整个mylist列表的所有元素。LLEN可以查询列表的长度。
      • 集合(Set)类型查询SMEMBERS返回集合中的所有元素,如SMEMBERS myset返回{"a", "b", "c"}SISMEMBER用于判断一个元素是否在集合中,如SISMEMBER myset "a"返回1(表示存在)。
      • 有序集合(Sorted Set)类型查询ZRANGE按分数从小到大的顺序返回有序集合中的元素范围,如ZRANGE myzset 0 -1返回按分数排序后的元素。ZSCORE获取一个元素的分数,如ZSCORE myzset "element1"返回1
    • 更新操作
      • 字符串(String)类型更新:再次使用SET命令即可更新字符串的值。例如,SET user:name "Bob"将之前的"John"更新为"Bob"
      • 哈希(Hash)类型更新:使用HSET命令更新哈希中的字段值。如HSET user:1 age 26user:1这个用户对象的年龄更新为26
      • 列表(List)类型更新:可以使用LSET命令更新列表中的元素。例如,LSET mylist 0 "new_apple"mylist列表头部的"apple"更新为"new_apple"(前提是列表长度足够)。
      • 集合(Set)类型更新:集合本身无序且元素不重复,更新操作主要是添加新元素(SADD)或者删除元素(SREM)来间接更新集合的内容。
      • 有序集合(Sorted Set)类型更新:可以使用ZADD重新添加元素来更新其分数,或者使用ZINCRBY来增加元素的分数,如ZINCRBY myzset 1 "element1""element1"的分数增加1
    • 删除操作
      • 字符串(String)类型删除:使用DEL命令删除字符串类型的键值对。例如,DEL user:name将删除user:name这个键及其对应的值。
      • 哈希(Hash)类型删除HDEL用于删除哈希中的一个或多个字段。如HDEL user:1 email删除user:1这个用户对象的email字段。也可以使用DEL删除整个哈希键。
      • 列表(List)类型删除LPOPRPOP分别从列表的头部和尾部删除一个元素。例如,LPOP mylist删除mylist列表头部的元素。LREM可以根据元素的值删除指定数量的元素。
      • 集合(Set)类型删除SREM用于删除集合中的一个或多个元素。例如,SREM myset "a"myset集合中删除元素"a"
      • 有序集合(Sorted Set)类型删除ZREM用于删除有序集合中的一个或多个元素。如ZREM myzset "element1"删除myzset中的"element1"元素。
  2. 复杂查询案例分析

    • 案例一:用户登录系统中的 Redis 应用
      • 场景描述:在一个用户登录系统中,需要存储用户的登录状态、最近登录时间、权限信息等。同时,为了实现用户的单点登录(一个用户只能在一个设备上登录),需要对用户的登录设备进行管理。
      • 数据结构选择与操作
        • 存储用户登录状态和最近登录时间:可以使用字符串类型来存储用户的登录状态(SET user:1:login_status "logged_in")和最近登录时间(SET user:1:last_login_time "2024-01-01 12:00:00")。
        • 存储用户权限信息:哈希类型适合存储用户权限信息。例如,HSET user:1:permissions read true write false admin false表示用户1有读取权限,没有写入和管理员权限。
        • 实现单点登录管理:使用集合类型存储登录的用户设备。当用户在新设备登录时,首先检查集合中是否已经存在该用户的登录设备记录。如果存在,说明该用户在其他设备上已经登录,可能需要采取相应的措施(如强制下线旧设备)。可以使用SADD user:1:login_devices "device_id_1"来添加登录设备,使用SISMEMBER user:1:login_devices "device_id_1"来检查设备是否已经登录。
      • 复杂查询示例
        • 查询用户的所有权限信息:使用HGETALL user:1:permissions来获取用户1的所有权限信息。
        • 检查用户是否在特定设备上登录并且具有写入权限:首先使用SISMEMBER user:1:login_devices "device_id_1"检查用户是否在device_id_1设备上登录,然后使用HGET user:1:permissions write检查是否具有写入权限。
    • 案例二:电商系统中的商品推荐和购物车管理
      • 场景描述:在电商系统中,需要根据用户的浏览历史和购买历史推荐商品,同时管理用户的购物车。
      • 数据结构选择与操作
        • 存储用户浏览历史和购买历史:对于用户的浏览历史,可以使用列表类型存储。每次用户浏览一个商品,使用LPUSH user:1:browse_history product_id_1将商品 ID 添加到用户1的浏览历史列表头部。对于购买历史,同样可以使用列表类型,如LPUSH user:1:purchase_history product_id_2
        • 商品推荐计算(简单示例):根据用户的浏览历史和购买历史,可以通过统计商品出现的频率来进行推荐。可以定期(如每天晚上)对数据进行处理,将浏览历史和购买历史合并到一个列表中,然后使用 Redis 的SORT命令或者在应用层进行统计分析,找出出现频率较高的商品作为推荐商品。
        • 购物车管理:使用哈希类型来管理购物车。例如,HSET user:1:cart product_id_3 quantity 2表示用户1的购物车中有2product_id_3商品。
      • 复杂查询示例
        • 查询用户购物车中的商品数量和总价(假设已知商品价格):首先使用HGETALL user:1:cart获取购物车中的所有商品信息,然后根据商品 ID 查询商品价格(可以从数据库或者其他存储中获取),计算出总价和商品数量。
        • 根据用户浏览历史和购买历史推荐前 3 个商品:首先将浏览历史和购买历史合并到一个列表(假设为user:1:history),然后可以使用类似于以下的方式(以伪代码形式)进行统计推荐:
          from collections import Counter
          # 获取用户历史记录(假设已经合并)
          history_list = redis_client.lrange("user:1:history", 0, -1)
          # 统计商品出现的频率
          product_count = Counter(history_list)
          # 获取出现频率最高的3个商品
          top_3_products = product_count.most_common(3)
    • 案例三:社交网络系统中的关系管理和动态推送
      • 场景描述:在社交网络系统中,需要管理用户之间的好友关系、用户发布的动态以及根据好友关系进行动态推送。
      • 数据结构选择与操作
        • 存储好友关系:使用集合类型来存储用户的好友关系。例如,SADD user:1:friends user:2 user:3表示用户1的好友是用户2和用户3
        • 存储用户动态:可以使用列表类型存储用户发布的动态。例如,LPUSH user:1:posts "I just had a great day!"表示用户1发布了一条动态。
        • 动态推送计算(简单示例):当用户发布一条动态时,需要将这条动态推送给该用户的所有好友。可以遍历该用户的好友集合,将动态 ID(可以是动态在列表中的索引或者其他唯一标识)添加到每个好友的动态推送列表中。
      • 复杂查询示例
        • 查询用户的好友数量和好友列表:使用SCARD user:1:friends查询用户1的好友数量,使用SMEMBERS user:1:friends查询好友列表。
        • 查询用户的最新动态和好友的最新动态:使用LRANGE user:1:posts 0 0查询用户1的最新动态。对于好友的最新动态,可以遍历好友列表,对每个好友使用类似的方法获取最新动态,然后按照时间顺序(发布动态的顺序)进行排序展示。

http://www.ppmy.cn/embedded/138370.html

相关文章

【算法一周目】双指针(2)

目录 有效三角形的个数 解题思路 C代码实现 和为s的两个数字 解题思路 C代码实现 三数之和 解题思路 C代码实现 四数之和 解题思路 C代码实现 有效三角形的个数 题目链接:611. 有效三角形的个数题目描述:给定一个包含非负整数的数组nums&…

SpringBoot 应用出错 Comparison method violates its general contract!

出现此错误的大致环境如下 SpringBoot 2.7.17, SpringWeb 项目,所引用入的 spring-webmvc-5.3.30, spring 6 已解决JDK 1.8 或 JDK 17依赖了 jackson-dataformat-xml:2.12.6 和 jackson-dataformat-cbor:2.12.6, 它会在 RestTemplate 加上 application/xml, applic…

​‌华为交换机在Spine-Leaf架构中的使用场景​

‌华为交换机在Spine-Leaf架构中的使用场景主要包括数据中心网络设计。‌ 在数据中心网络设计中,Spine-Leaf架构是一种常见的网络架构,由Spine层和Leaf层组成。Spine层负责提供高带宽的连接,而Leaf层则负责连接到服务器和设备。华为交换机在…

高斯混合模型回归(Gaussian Mixture Model Regression,GMM回归)

高斯混合模型(GMM)是一种概率模型,它假设数据是由多个高斯分布的混合组成的。在高斯混合回归中,聚类与回归被结合成一个联合模型: 聚类部分 — 使用高斯混合模型进行聚类,识别数据的不同簇。回归部分 — 对…

git 同步上游仓库到远端仓库

首先知道什么是本地仓库,远端仓库,上游仓库 本地仓库:你从远端仓库克隆到本地 PC 上的仓库 远端仓库:从上游仓库 fork 过来的仓库,可以理解为自己的仓库 上游仓库:公司的仓库,所有权不在于你 当…

蓝牙 HFP 协议详解及 Android 实现

文章目录 前言一、什么是蓝牙 HFP 协议?HFP 的核心功能HFP 的核心功能HFP 在 Android 中的典型应用场景 二、HFP 协议的工作流程HFP 的连接流程 三、HFP 在 Android 的实现1. 检查蓝牙适配器状态2. 发现并检测支持 HFP 的设备3. 获取 BluetoothHeadset 服务4. 连接设…

【linux】TCP网络编程及Web服务器搭建

一、TCP客户端编程 1、TCP的概述 客户端:主动连接服务器、和服务器进行通信 服务器:被动被客户端连接,启动新的线程或进程 服务器客户端(并发服务器) 2、创建TCP套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); socket函数创建的TCP套接字,没有端口,默认为主…

鸿蒙HarmonyOS 地图不显示解决方案

基于地图的开发准备已完成的情况下,地图还不显式的问题 首先要获取设备uuid 获取设备uuid 安装DevEco Studio的路径下 有集成好的hdc工具 E:\install_tools\DevEco Studio\sdk\default\openharmony\toolchains 这个路径下打开cmd运行 进入“设置 > 关于手机…