`
wangleide414
  • 浏览: 590661 次
  • 性别: 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项目开发当中的实例。可以使用,可以参考,但绝对不能用来商业操作哦!谢谢!

    php+redis使用实例

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

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

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

    一个很好的redis例子

    最近项目需要用到redis,分享一个很好的redis例子,导进eclipse可以直接运行,redis配置可能需要根据自己需求更改下密码。

    java redis 各类型操作实例

    java 对redis各类型的操作,maven管理项目。

    SpringMvc集成Redis项目完整示例

    SpringMvc集成Redis项目完整示例,包含web示例和java示例(不用启动web服务器)即可测试,亲测没问题,本人项目中已经使用,欢迎有问题一起探讨!

    springboot与redis结合的实战、实例项目

    springboot与redis结合的实战、实例项目,有助于帮助你了解springboot中怎么使用redis。

    Spring mvc整合redis实例(测试通过)

    一款封装比较全的 sping 整合 redis实例。 不是Spring-date-redis的,是另一种集成方式,从网上整理的代码,测试已跑通。

    电商高并发方案及Redis案例分享

    内含redis快速入门,redis使用案例,秒杀和抢购场景的应用,理财预约投资场景等应用,服务器架构图等资源。

    java连接redis实例源码

    在Linux上安装redis,使用Java连接,有说明文档,包含一个Java连接实例和一个使用redis的maven项目

    若依前后端分离版去redis版/无redis版本

    基于前后端分离的应用,无论是否使用Redis,都需要考虑如何进行数据的存储和缓存。下面我将分别介绍基于Redis和无Redis的两种版本的特点。 基于Redis的版本 特点 缓存处理:Redis作为内存数据库可以用来缓存频繁访问...

    spring 集成 redis 使用例子

    spring mvc 集成redis使用例子,代码在com.kevin.server. 测试入口在:RedisAnnotationTest.java 和 RedisTest.java

    redis+ssm+maven集成案例

    redis+spring+springmvc+mybatis+maven集成完整案例,可直接运行,欢迎大家下载使用

    C++使用redis的实例详解

    主要介绍了C++使用redis的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    springboot项目连接数据库及redis实例

    使用springboot搭建,连接mysql数据库以及redis缓存。需要修改数据库和redis配置才能正常运行。

    vs2012 c++ redis

    vs2012工程项目c++调用redis实例

    redis的项目案例123

    redis的使用细节过程,包括前后台PTF调用等等,内部框架的设计

    .NET中添加Redis

    redis在.net的使用,很好的做到缓存的作用,为项目性能优化提供了很有的帮助

    idea下springboot整合redis例子

    这个是我自己搭建的springboot整合redis,由于网上的部分例子,有错误,深感不解,于是动手搭建,自己测试过了,可以使用,而且简单易懂,适合新手,容易理解,可以作为自己的第一个demo

Global site tag (gtag.js) - Google Analytics