`

redis应用场景补充(一)

阅读更多

1. 前言

       在前面的两篇文章:浅谈redis数据结构之列表浅谈redis数据结构之哈希,考虑到这两种数据结构的通用性及重要性,所以本篇专门为这两种数据结构的应用场景做个补充。

 

2. 应用场景之文章列表

       假设有这样一个需求:每个用户有属于自己的文章列表,现需要展示(分页)文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。

       我们利用redis的列表数据结构和哈希数据结构做个简单的实现。假设每篇文章有三个属性:标题(title)、时间(timestamp)、内容(content),每篇文章使用哈希结构存储。

       具体的操作如下所示:

 

       向文章列表(用户)添加文章,user:{id}:articles 作为用户文章列表的键(Key)。操作如下所示:

 

      分页获取文章列表(用户)。例如:获取用户id=1的前3篇文章,操作如下所示:

 

      使用列表类型保存和获取文章列表会存在两个问题:

      第一,如果每次分页获取的文章个数较多,我们会想到可以利用hgetall操作,但是如果需要多次执行此命令。此时可以考虑使用Pipeline进行批量获取,或者考虑将文章数据序列化为字符串类型,使用mget批量获取。

      第二,分页获取文章列表时,lrange命令在列表两端性能较好,但是如果列表较大,获取列表中间范围的元素性能会变差。此时可以考虑将列表做二级拆分,或者使用Redis 3.2的quicklist内部编码实现,它结合ziplist和linkedlist的特点,获取列表中间范围的元素时也可以高效完成。

 

3. 应用场景之关系型数据表

       假设有一个关系型的数据表,存储的是用户的基础数据。其中用户的属性作为表的列,每条用户的信息作为行,如下表所示:

id name age city
1 tom 23 beijing
2 mike 30 tianjin

 

       这样的表结构,对于小伙伴们在日常的工作或学习中,是再熟悉不过了。如果我们把这些用户的基础数据,按照redis的哈希数据结构进行存储的话,就如下图所示:

 

       对比这两种形式,使用字符串序列化缓存用户信息,哈希类型变得更加直观,并且在更新操作上会更加便捷。可以将每个用户的id定义为键后缀,多对field-value对应每个用户的属性,类似如下代码:

public UserInfo getUserInfo(long id) {
    // 用户id作为key后缀
    String userRedisKey = "user:info:" + id;
    // 使用hgetall获取所有用户信息映射关系
    Object userInfoMap = redis.hgetAll(userRedisKey);
    UserInfo userInfo;
    if (userInfoMap != null) {
        // 将映射关系转换为UserInfo
        userInfo = transferMapToUserInfo(userInfoMap);
    } else {
        // 从MySQL中获取用户信息
        userInfo = mysql.get(id);
        // 将userInfo变为映射关系使用hmset保存到Redis中
        redis.hmset(userRedisKey, transferUserInfoToMap(userInfo));
        // 添加过期时间
        redis.expire(userRedisKey, 3600);
    }
    return userInfo;
}

 

       需要注意的是哈希类型和关系型数据库有两点不同之处:

       第一,哈希类型是稀疏的,而关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的field,而关系型数据库一旦添加新的列,所有行都要为其设置值(即使为 NULL),如图所示:

    

       第二,关系型数据库可以做复杂的关系查询,而使用Redis去模拟关系型复杂查询开发困难,维护成本高。

 

4. 应用场景之数据缓存方式

       就拿上一节的用户数据举例,截止到已经介绍的redis数据结构,以有三种缓存数据的方式,下面比较下这三种缓存数据的方式:

4.1 原生字符串类型

       给用户信息的每一个属性分配一个键。操作如下所示:

 

  • 优点:简单直观,每个属性都支持更新操作。
  • 缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以此种方案一般不会在生产环境使用。

4.2 序列化字符串类型

       将用户信息序列化后用一个键保存。操作如下所示:

 

  • 优点:简化编程,如果合理的使用序列化可以提高内存利用率。
  • 缺点:序列化和反序列化 有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到Redis中。

4.3 哈希类型

       每个用户属性使用一对field-value,但是只用一个键保存。操纵如下所示:

 

  • 优点:简单直观,如果使用合理可以减少内存空间的使用。
  • 缺点:要控制和减少哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存。 
分享到:
评论

相关推荐

    Redis应用场景--Redis作者谈Redis应用场景

    ### Redis应用场景解析 Redis作为一款开源的键值存储系统,凭借其高性能、低延迟的特点,在众多应用场景中展现出独特的价值。本文将围绕Redis作者@antirez分享的几个典型应用场景进行深入探讨,旨在帮助读者更好地...

    Redis配置详解和企业级项目应用架构

    由于其高效、灵活的特性,Redis成为众多应用场景中的首选解决方案。 ##### MySQL与Redis的区别和联系 MySQL与Redis虽然同属于数据库管理系统领域,但它们的设计理念和服务目标存在显著差异。MySQL是一款关系型...

    redis笔记补充,用于自己学习

    2. 数据类型:Redis支持五大数据类型:String、Hash、List、Set和Sorted Set,每种类型都有其特定的应用场景。 二、Redis的数据持久化 1. RDB(Redis Database Persistence):定期保存当前数据库状态到磁盘,恢复...

    Redis补充笔记1

    总的来说,Redis 作为一款NoSQL数据库,凭借其高速性能、灵活的数据模型和丰富的数据操作,广泛应用于现代Web应用中。无论是在缓存解决方案、实时统计还是复杂数据结构的存储等方面,Redis 都展现出了强大的实力。...

    redis 讲义.docx

    Redis 是一个开源的高性能键值对数据库,由 C 语言编写。...总之,Redis 是一个强大且灵活的内存数据结构存储系统,广泛应用于各种场景,其高效的性能和丰富的数据类型使其成为许多现代互联网应用的首选数据库。

    redis开发运维实践指南

    总之,《Redis开发运维实践指南》是一份全面覆盖Redis使用、应用场景和最佳实践的详细文档,不仅适合初学者,对有经验的开发运维人员也有极大的参考价值。通过本文,读者可以学习到如何更有效地使用Redis,以及如何...

    redis学习笔记

    Redis以其丰富的数据类型和出色的速度在各种应用场景中得到了广泛的应用。 **NoSql简介** NoSql,即Not Only Sql,是针对传统SQL数据库的一种补充,特别适用于处理大数据量和高并发的场景。NoSql数据库不遵循关系型...

    redis三款客户端连接工具

    Redis是一款高性能的键值对数据库,广泛应用于缓存、消息队列等场景。在开发和运维过程中,选择合适的客户端连接工具至关重要,可以帮助我们更高效地管理和调试Redis服务器。本篇文章将详细探讨三款常用的Redis...

    Redis从入门到精通2024版 视频教程 下载 百度网盘链接4.zip

    ├─第 04 章 Redis 基本应用 │ 01.Redis 做分布式锁-1.mp4 │ 02.Redis 做分布式锁-2.mp4 │ 03.Redis 做分布式锁-3.mp4 │ 04.Redis 做消息队列-1.mp4 │ 05.Redis 做消息队列-2.mp4 │ 06.Redis 操作位图-...

    redis-5.0.6-x64-for-windows.rar

    总的来说,Redis 5.0.6 for Windows提供了一个强大的内存数据存储解决方案,适用于多种应用场景,包括高速缓存、消息队列、计数器系统等。在Windows环境中部署和管理Redis,需要熟悉其基本操作和配置,以充分发挥其...

    redis in action java代码

    Redis是一个高性能的键值数据库,它以内存存储为主,支持数据持久化,广泛应用于缓存、消息队列、会话管理等多个场景。Jedis是Java社区中常用的Redis客户端库,它提供了丰富的API来操作Redis服务器,如设置和获取...

    Redis Desktop Manager是一个快速、简单、支持跨平台的 Redis 桌面管理工具

    其性能出色,支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,这使得Redis在处理高性能、低延迟的应用场景中尤其受欢迎。 RDM的主要特点包括: 1. **跨平台支持**:RDM可在Windows、macOS和Linux等...

    python基于redis的限流器.zip

    在这个场景中,我们关注的是一个基于Python和Redis实现的限流器。Redis是一个高性能的键值数据库,常被用作缓存和消息中间件,同时它也支持丰富的数据结构,如字符串、哈希、列表、集合和有序集合,这使得它非常适合...

    redis做mysql缓存服务器(公司内部培训资料)

    ### Redis作为MySQL缓存服务器(公司内部培训资料) #### 一、Redis简介 Redis是一种开源的键值存储系统,主要用于高速缓存数据。...这种方式特别适用于需要频繁读取数据但写操作相对较少的应用场景。

    redis笔记.docx

    Redis 不仅仅是一个 NoSql 数据库,它的全称是 "Not only SQL",表明它可以作为关系型数据库的补充。 NoSql 数据库,如其名,是非关系型的,它是为了应对大规模数据处理、高并发、高可用性和高可扩展性而诞生的解决...

    Nosql Redis

    - **丰富的数据结构**:Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合,适合各种应用场景。 - **主从复制**:Redis支持主从复制,可以创建多个从节点来分担读取压力,提高系统的可用性。 - *...

    前端源码及redis.zip

    前端源码通常包括HTML、CSS、JavaScript等文件,用于构建用户界面,而Redis则是一种常用的内存数据存储系统,常用于缓存、消息队列等场景。 描述中提到“前端页面用于登录和注册”,这意味着源码中可能包含了登录...

    nosql、缓存、redis实战

    在实际应用案例中,Redis被广泛应用于大规模互联网应用、云存储平台以及多种业务场景中。由于其卓越的性能和灵活的数据处理能力,Redis不仅可以作为数据库使用,也可以作为缓存和消息队列系统。它能够支持高并发访问...

    spring-boot-整合redis

    此外,Redis 支持多种数据结构类型,如字符串(Strings)、列表(Lists)、集合(Sets)、排序集(Sorted Sets)以及哈希(Hashes),这些特性使其适用于各种不同的应用场景。 #### 二、NoSQL 数据库简介 NoSQL (Not Only ...

    redis笔记+资料

    Redis是一款高性能的键值对数据库,常用于缓存、消息队列、计数器等多种场景。这份"redis笔记+资料"包含了对Redis的全面学习和理解所需的关键知识点,包括其基本概念、数据类型、持久化机制、事务处理、集群搭建等。...

Global site tag (gtag.js) - Google Analytics