Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用,这里介绍下Redis经常遇到的使用场景。

Redis特性

一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点:

读写性能优异

持久化

数据类型丰富

单线程

数据自动过期

发布订阅

分布式

这里我们通过几个场景,不同维度说下Redis的应用。

一、高性能适合当做缓存

缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异。而且逐渐有取代memcached,成为首选服务端缓存的组件。而且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性。

作为缓存使用时,一般有两种方式保存数据:

1、读取前,先去读Redis,如果没有数据,读取数据库,将数据拉入Redis。

2、插入数据时,同时写入Redis。

方案一:实施起来简单,但是有两个需要注意的地方:

1、避免缓存击穿。(数据库没有就需要命中的数据,导致Redis一直没有数据,而一直命中数据库。)

使用redis的 setnx方法构建一个互斥锁,只有一个请求线程获得锁去更新数据,其他请求等待,之后去请求最新缓存。

2、数据的实时性相对会差一点。

方案二:数据实时性强,但是开发时不便于统一处理。

当然,两种方式根据实际情况来适用。如:方案一适用于对于数据实时性要求不是特别高的场景。方案二适用于字典表、数据量不大的数据存储。

二、丰富的数据格式性能更高,应用场景丰富

Redis相比其他缓存,有一个非常大的优势,就是支持多种数据类型。

string——适合最简单的k-v存储,类似于memcached的存储结构,短信验证码,配置信息等,就用这种类型来存储。

hash——一般key为ID或者唯一标示,value对应的就是详情了。如商品详情,个人信息详情,新闻详情等。

list——因为list是有序的,比较适合存储一些有序且数据相对固定的数据。如省市区表、字典表等。因为list是有序的,适合根据写入的时间来排序,如:最新的***,消息队列等。

set——可以简单的理解为ID-List的模式,如微博中一个人有哪些好友,set最牛的地方在于,可以对两个set提供交集、并集、差集操作。例如:查找两个人共同的好友等。

Sorted Set——是set的增强版本,增加了一个score参数,自动会根据score的值进行排序。比较适合类似于top 10等不根据插入的时间来排序的数据。

如上所述,虽然Redis不像关系数据库那么复杂的数据结构,但是,也能适合很多场景,比一般的缓存数据结构要多。了解每种数据结构适合的业务场景,不仅有利于提升开发效率,也能有效利用Redis的性能。

三、单线程可以作为分布式锁

谈到Redis和Memcached 的区别,大家更多的是谈到数据结构和持久化这两个特性,其实还有一个比较大的区别就是:

Redis 是单线程,多路复用方式提高处理效率。

Memcached 是多线程的,通过CPU线程切换来提高处理效率。

所以Redis单线程的这个特性,其实也是很重要的应用场景,最常用的就是分布式锁。

应对高并发的系统,都是用多服务器部署,每个技术框架针对数据锁都有很好的处理方式,如 .net 的lock,java 的synchronized,都能通过锁住某个对象来应对线程导致的数据污染问题。但是毕竟,只能控制本服务器的线程,分布式部署以后数据污染问题,就比较难处理了。Redis的单线程这个特性,就非常符合这个需求,伪代码如下:

//产生锁
while lock!=1 //过期时间是为了避免死锁 now = int(time.time()) lock_timeout = now + LOCK_TIMEOUT + 1lock = redis_client.setnx(lock_key, lock_timeout)//真正要处理的业务doing()//释放锁now = int(time.time())if now < lock_timeout: redis_client.delete(lock_key)

以上是一个只说明流程的伪代码,其实整体的逻辑是很简单的,只要考虑到死锁时的情况,就比较好处理了。Redis作为分布式锁,因为其性能的优势,不会成为瓶颈,一般会产生瓶颈的是真正的业务处理内容,还是尽量缩小锁的范围来确保系统性能。

四、自动过期能有效提升开发效率

Redis针对数据都可以设置过期时间,这个特点也是大家应用比较多的,过期的数据清理无需使用方去关注,所以开发效率也比较高,当然,性能也比较高。最常见的就是:短信验证码、具有时间性的商品展示等。无需像数据库还要去查时间进行对比。因为使用比较简单,就不赘述了。

五、分布式和持久化有效应对海量数据和高并发

Redis初期的版本官方只是支持单机或者简单的主从,大多应用则都是自己去开发集群的中间件,但是随着应用越来越广泛,用户关于分布式的呼声越来越高,所以Redis 3.0版本时候官方加入了分布式的支持,主要是两个方面:

Redis服务器主从热备,确保系统稳定性

Redis分片应对海量数据和高并发

而且Redis虽然是一个内存缓存,数据存在内存,但是Redis支持多种方式将数据持久化,写入硬盘,所有,Redis数据的稳定性也是非常有保障的,结合Redis的集群方案,有的系统已经将Redis当做一种NoSql数据存储来适用。

示例:秒杀和Redis的结合

秒杀是现在互联网系统中常见的营销模式,作为开发者,其实最不愿意这样的活动,因为非技术人员无法理解到其中的技术难度,导致在资源协调上总是有些偏差。秒杀其实经常会出现的问题包括:

并发太高导致程序阻塞。

库存无法有效控制,出现超卖的情况。

其实解决这些问题基本就两个方案:

数据尽量缓存,阻断用户和数据库的直接交互。

通过锁来控制避免超卖现象。

现在说明一下,如果现在做一个秒杀,那么,Redis应该如何结合进行使用?

提前预热数据,放入Redis

商品列表放入Redis List

商品的详情数据 Redis hash保存,设置过期时间

商品的库存数据Redis sorted set保存

用户的地址信息Redis set保存

订单产生扣库存通过Redis制造分布式锁,库存同步扣除

订单产生后发货的数据,产生Redis list,通过消息队列处理

秒杀结束后,再把Redis数据和数据库进行同步

以上是一个简略的秒杀系统和Redis结合的方案,当然实际可能还会引入http缓存,或者将消息对接用MQ代替等方案,也会出现业务遗漏的情况,这个只是希望能抛砖引玉。

每个技术都有属于自己的应用场景,只有对技术的特点有一定清晰的认识,才能更好的利用技术,发挥其最大的优势。

Redis-使用场景相关推荐

  1. AliCloudDB for redis应用场景之存储最新N条聊天记录

    AliCloudDB for redis应用场景之存储最新N条聊天记录 场景介绍 在各种IM通信工具中,常常需要展示最新的聊天记录,这种数据写入频繁,对响应时间要求高.一般情况,这种场景通常会选择持久 ...

  2. Redis应用场景说明与部署

    Redis简介 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的memcached缓存服务很像,但是red ...

  3. Redis使用场景、Redis线程模型、Redis持久化 - 公开课笔记

    redis和数据库怎么写同步? 分布式如何达到一致性? CAP 一致性.可用性.性能 HA:高可用,不存在没有任何时延.没有任何波动的高可用 容忍度只要达标,就可以.不要为了技术而技术->你会否 ...

  4. 转载:Redis 应用场景

    2019独角兽企业重金招聘Python工程师标准>>> 1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载 ...

  5. Redis应用场景(转)

    (来源:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html) Redis常用数据类型 Redis最为常用的数据类型主要有以下五 ...

  6. redis 数据类型详解 以及 redis适用场景场合

    redis 数据类型详解 以及 redis适用场景场合 1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访 ...

  7. Redis应用场景-排行榜

    文章目录 Redis应用场景-排行榜 前言 排行榜 今日热搜 热门视频排行榜 周歌曲点播榜 参考文档 Redis应用场景-排行榜 前言 使用Redis的有序集合(Sorted set)可以很方便地实现 ...

  8. 详解 Redis 应用场景及应用实例

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...

  9. Redis 应用场景和应用实例详解

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...

  10. 详解 Redis 应用场景及原理

    本文转自https://blog.csdn.net/niucsd/article/details/50966733,描述了redis实现原理和应用场景,篇幅较长,有意学习redis的同学可耐心阅读. ...

最新文章

  1. 镜像打包工具clonezilla
  2. java 数组越界异常_数组越界异常 求解决!!!
  3. java课堂疑问解答与思考1
  4. go语言之进阶篇http客户端编程
  5. 想赚钱?先把底层逻辑搞清楚
  6. 想满足一点小小的欲望,怎么就这么难……咦?这儿有戏!
  7. 历年蓝桥杯日期类问题总结
  8. 能编写PHP语言吗_语言能力差口才不好,靠看书就能提高吗
  9. java笔试试题含答案_Java笔试题带答案
  10. 网页磁贴模板_【Win 10应用开发】Adaptive磁贴模板的XML文档结构
  11. quartz 每月一次_quartz cron表达式 每周一0点怎么设置
  12. python模块中函数的用法_怎么使用help函数查看python模块中函数的用法
  13. 《宽带与接入网技术》接入网的基本概念
  14. 下载美国气候数据中心地址
  15. 根据关键词采集文章(按关键词采集数据)
  16. 画仓鼠大赛 评比开始!
  17. 平面设计中的简约设计到底指什么?
  18. Game boy模拟器(1):CPU
  19. 思迈特软件Smartbi完成C轮融资,推动国产BI加速进入智能化时代
  20. 中国移动MobileMarket重点支持机型信息

热门文章

  1. windows副本不是正版提示解决方法
  2. latex插入pdf
  3. [CSP-S模拟测试]:赤壁情(DP)
  4. 微信公众账号查看历史消息
  5. java 打印机设置参数设置_Java 打印PDF文档 - 指定打印机、自定义纸张大小、设置打印参数、显示打印对话框等...
  6. 怎样在excel表格中画斜线并打字_你会用Excel做 表头 吗?
  7. HTML5中thead标签,【HTML5】table标签中thead、tbody、tfoot的作用
  8. C#之 DateGridView分页超简单
  9. 在activity之间传递数据
  10. 精密电阻(1%) -- 贴片电阻常用标示方法(转载)