当前位置: 首页 > article >正文

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

  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.kler.cn/a/393188.html

相关文章:

  • 【ES6复习笔记】rest参数(7)
  • mysql索引的理解
  • 使 el-input 内部的内容紧贴左边
  • Linux:code:network:devinet_sysctl_forward;IN_DEV_FORWARD
  • AI无人直播详解
  • 1.微服务灰度发布(方案设计)
  • 【计算机网络】【网络层】【习题】
  • 网络安全——应急响应之Linux入侵排查
  • 2024 年 8 个最佳 API 设计工具图文介绍
  • Java开发人员从零学习ArkTs笔记(二)-函数与类
  • Ubuntu20.04 为脚本文件创建桌面快捷方式 ubuntu
  • Spring Boot框架:电商开发的新趋势
  • #渗透测试#SRC漏洞挖掘#云技术基础03之容器相关
  • 如何用Chrome的Network面板分析HTTP报文
  • 壁仞科技上市前最后一波 校招 社招 内推
  • 基于Java Springboot在线教育学习系统
  • 卫导调零天线功率倒置算法原理及MATLAB仿真
  • 【paper】分布式无人水下航行器围捕智能目标
  • ONLYOFFICE 8.2深度测评:集成PDF编辑、数据可视化与AI功能的强大办公套件
  • Git的使用(基础语句)
  • [AIGC] Python批量处理Excel中的ASR语音文本数据
  • vue项目多入口文件。vue.config.js如何修改配置
  • Python 操作 Excel 表格从简单到高级用法
  • C 语言 数组交换最小值和最大值
  • goframe开发一个企业网站 统一返回响应码 18
  • 2024-11-13 Unity Addressables2——寻址资源设置