`
wangleide414
  • 浏览: 606437 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

项目Redis 应用实例

 
阅读更多

Redis 目前应用相当广泛,由于是内存存储,性能很好,所以也在很多业务场景下都有其适用性,前段时间经常有同事问到使用Redis 的细节问题,如该使用它的哪种类型来解决某种场景下的某些问题,本文总结整理后,并给出实际的使用实例。

首先Redis 是开源的,ANSI C语言编写,key-value 的存储系统,内存存储数据,也可以通过配置根据策略去持久化数据。 

包含五种数据结构:

 

一、String 字符串

      最基础的数据存储类型,并且是二进制安全,也就是说该类型可以接受任何格式数据,图像,文字等,应用场景主要适用于热数据的缓存;其主要操作有,get set 等;

      下边是一个常用的模式,当有数据的改动,需要同时同步到redis和db中,为了不存储太多不常用的数据,可以在key增加一个过期时间,当要获取数据时可以直接从redis中获取数据,如果已经过期,可以再从db中获取,来保证数据的有效性,这种模式在一定程度上很有效的减少对db磁盘的频繁访问,提高性能。

 

def update_info(info):
      save_info_to_db(info)
      save_info_to_redis(info)

def get_info(id):
      res = get_info_from_redis(id)
      if not res:
            return get_info_from_db(id)

 

二、Hash -字典

      Redis hash 是一个string 类型的 key -value 的映射表,特别适用于存储对象,如果没有该类型。我们常做的做法是把 对象的属性和值dump成json串来存储,但是要是获取某个属性值,或者是要修改某个属性值,只能是先get, 然后 json load,修改后还要json dump 再保存,既繁琐,又效率低下,而使用Redis hash 会很便捷高效,如下图,可以很方便的设置 user:info:1110 这个对象的各个属性和值,并且可以单独update 属性值;

      

 

三、List - 链表

       Redis 使用双端列表实现List,常见的应用是消息队列,可以使用*PUSH操作往队列中加入消息,工作的进程可以使用POP操作从队列中获取消息,理解Redis List 首先要把它想成是一个列表,列表的左端(Left) 也就是列表的前段,右端(Right)也就是列表的后端,所有L开头的操作,都是在列表的左端,也就是头部进行操作,所有R开头的操作,都是在列表的右端,也就是尾部进行操作,那我们就不难理解,RPUSH 和 LPUSH了,分别是从列表的左边和右边插入数据。LPOP和RPOP是从两端移除并获取数据。BLPOP和BRPOP 是阻塞式的POP。在工作进程较为常用,没有任务就一直阻塞,有任务就获取出来执行。 还有一些LLEN LINDEX也较为常用。详细命令可以参考 http://redis.readthedocs.io/

 

四、Set - 集合

       特点:就是一堆不重复的数据的组合,并且Redis 提供了对集合求交集,差集,并集的操作。基于这两个特点,就可以应用于很多业务场景,

       (1)由于其天生具有去重的功能,所以很多要求唯一性的记录就可以使用set 类型,比如系统要记录今天所登录的账号列表,就可以使用Set,每次登录的时候放入到今天的key中;

       (2)接着上边的例子,如果想要知道连续三天内都登录的账号列表,那么使用刚才三天的set 取交集就可以轻松的搞定;

 

五、Sorted Set - 有序集合

       特点:在Set 的基础上增加 权重参数 score,集合中的元素会自动按照score进行排序,常见的应用,比如获取业务中的TOP N 数据,可以使用该数据结构高效的获取。

        sorted set 是比较有意思而且很使用的一种数据类型,就在前两天体验到了它的力量。这里分享给大家:

        背景:系统中要做数据的异步celery统计。一个站点有很多漏洞,每个漏洞变化后就要触发一次站点统计任务,当然漏洞变化的地方很多。所以把触发统计任务抽成一个接口供各模块来调用。但是问题来了。很多情况下,一个站点的多个漏洞会在一段时间内都改变,所以接口会在较短的时间内接受到多次同一个站点的统计任务。

        思路:把站点id 和 当时的timestap 放入 sorted set 中, 后台进程把sorted set 中timestamp 小于 某个值得获取到,下发。思想主要是避免了一个站点下多个漏洞状态更新,导致的多个统计任务执行,通过延迟下发,比较时间来避免这种多次的下发任务。

        下图是业务中的celery 任务情况,在使用sorted set 方法优化前,任务量和增加速度比较大。优化后观察,在15个worker下,基本上可以做到消息的实时处理。这就是sorted set 的一个应用。其实在业务中做数据TOP N的场景,使用sorted set 更方便。

 

                                                            图二:7点左右的任务量



  

                                                   图三:8点左右的任务量

 

 



  图四:Redis Sorted Set 控制下发

总结:Redis 这五种类型的数据,可以应用在我们业务的不同场景中,帮助我们提高性能,而不仅仅是缓存和消息队列~, 当然如果不清楚现有的使用方式是否合理时,可以通过INFO MONITOR SLOWLOG 来排查和发现一些潜在问题;

 

       

 

  • 大小: 13.3 KB
  • 大小: 5.5 KB
  • 大小: 11.1 KB
  • 大小: 20 KB
分享到:
评论

相关推荐

    Redis使用实例

    在本"Redis使用实例"中,我们将深入探讨Redis的基本概念、常见操作以及如何在实际项目中应用。以下是对Redis的一些关键知识点的详细介绍: 1. **Redis基本概念**: - **键值对(Key-Value)存储**:Redis的核心...

    Redis项目实例

    在"Redis项目实例"的Demo中,我们可能会看到这些特性的实际应用,比如如何编写Lua脚本,如何配置和使用哨兵系统,或者如何搭建和管理Redis集群。通过分析和实践这些示例,开发者可以更好地掌握Redis的使用技巧,并将...

    SSM+Shiro+redis项目实例

    总的来说,SSM+Shiro+Redis项目实例是一个很好的学习资源,涵盖了Java Web开发的多个重要方面,对于想要深入理解SSM框架集成、Shiro安全管理和Redis缓存应用的开发者来说,这是一个不可多得的实践平台。通过这个项目...

    java_redis简单案例

    本资源"java_redis简单案例"提供了一个演示如何在Java应用中集成Redis的实例,帮助开发者了解两者的基本用法。 首先,Redis作为内存数据库,其主要特点包括高速读写性能和丰富的数据结构支持,如字符串、哈希、列表...

    C#中使用redis简单实例

    通过以上步骤,你可以在C#中构建一个简单的Redis应用,实现键的增删改查。这只是Redis功能的冰山一角,实际应用中还有更多高级特性,如事务、列表、集合、哈希表等,等待你去探索。在实际项目中,根据需求选择合适的...

    php+redis使用实例

    该文档是php+redis的简单实例,主要使用了get和set方法

    Redis简单实例

    在本实例中,我们将探讨如何使用Redis进行键的添加和查询操作,特别是在C#编程环境中。 首先,你需要在你的项目中引入Redis的客户端库。StackExchange.Redis是广泛使用的C# Redis客户端,它提供了丰富的API来与...

    Redis使用教程,详解

    Redis 使用教程详解 Redis 是一个高性能的 NoSQL 键值存储数据库,广泛应用于缓存、任务列表、网站访问统计数据、过期处理、应用...通过本教程,我们可以快速了解 Redis 的使用方法和特点,并将其应用于实际项目中。

    一个很好的redis例子

    Redis是一个高性能的键值对数据库,常用于缓存、消息队列等场景...以上就是从"一个很好的redis例子"中可能涉及的关键知识点,深入理解并熟练运用这些知识,将有助于在实际项目中更好地利用Redis来优化数据存储和处理。

    java redis 各类型操作实例

    本文将深入探讨如何使用Java与Redis进行各种类型的操作,并基于Maven项目管理来构建我们的示例代码。 首先,为了在Java项目中使用Redis,我们需要引入Jedis库,这是一个流行的Java Redis客户端。在Maven项目的`pom....

    SpringBoot项目SSM+Redis整合

    在本项目中,Redis被用来存储临时数据,以减少对数据库的直接访问,提高应用性能。使用`Jedis`或`Lettuce`客户端库可以方便地与Redis交互。启动Redis服务器后,SpringBoot可以通过配置文件(如`application.yml`或`...

    redis学习案例

    总结,"redis学习案例"和"springmvc整合redis架构搭建实例"涉及了Redis的基础知识、Spring MVC与Redis的整合方法,以及如何在实际应用中实现Redis的模块化。通过这些知识,我们可以有效地利用Redis提升Web应用的性能...

    Java操作redis小案例

    在实际应用中,为了提高性能和资源管理,通常会使用连接池来管理Jedis实例。Jedis提供了`JedisPool`类来实现连接池功能。配置连接池并获取Jedis实例的代码如下: ```java JedisPoolConfig poolConfig = new ...

    SpringBoot+Mybatis(两种实现方式)+Redis项目实例

    该项目范例是使用了SpringBoot+Mybatis+Redis搭建而成,该项目可以下载后直接打开运行,里面包含增加、删除、修改和查询的的范例实现。本人结合网上资源,多方面查询才整合完成;但愿对需要和学习的朋友能有所帮助。

    Redis+Spring实例

    Redis+Spring实例是一个结合了两种流行技术的项目,旨在演示如何在Java应用中集成和使用Redis作为缓存系统。Redis是一种高性能的键值数据存储,常用于缓存、消息代理和分布式数据结构服务。而Spring框架是Java企业级...

    SpringMvc集成Redis项目完整示例

    这个示例包括了Web应用程序的实例以及独立的Java测试案例,无需启动Web服务器即可进行测试。下面我们将深入探讨其中涉及的关键知识点。 1. **Spring MVC**: Spring MVC是Spring框架的一个模块,主要用于构建Web...

    Springboot+redis+mybatisplus实例

    综上所述,Spring Boot、Redis和MyBatis-Plus的结合使用,能够构建出高效、稳定的Web应用。它们各自的优势互补,极大地提高了开发效率和应用性能。在实际项目中,开发者可以根据需求灵活选择和配置这些组件,以实现...

    springboot_springcache_redis入门实例

    SpringBoot、SpringCache和...这个入门实例可以帮助你理解如何在实际项目中利用这三个强大的工具提升应用性能。通过实践和调整,你可以根据具体需求进一步优化缓存策略,比如设置过期时间、使用Redis的高级特性等。

    SpringBoot项目 MybatisPlus使用 Redis缓存.zip

    在SpringBoot项目中,MybatisPlus与Redis的整合可以实现高效的数据缓存,提升应用程序的性能。本项目中,我们看到“SpringBoot项目 MybatisPlus使用 Redis缓存.zip”主要涉及了SpringBoot、MybatisPlus和Redis三个...

Global site tag (gtag.js) - Google Analytics