精华内容
下载资源
问答
  • Redis和MySql数据同步以及Redis使用场景
    2021-01-18 20:03:16

    Redis和MySql的数据同步是我们开发中经常遇到的问题,怎么实现Redis和MySql之间的数据同步?

    实际开发中我们经常采用如下方式实现Mysql和Redis数据同步:

    当我们对MySQL数据库进行进行增删改的时候,我们在增删改的service层将缓存中的数据清除,用户请求过来的时候会先去缓存中查询数据,如果缓存中没有要查询的数据则去数据库中查询,然后将查询的结果放入缓存中并设置一个有效期,这个时候缓存中的数据就是最新的数据。

    Redis使用场景:

    1、热点数据的缓存

    因为Redis访问速度块、支持的数据类型比较丰富,所以Redis很适合用来存储热点数据,另外我们可以设置数据过期时间,及时的更新缓存数据,这个使用场景非常的常见。

    2、计数器

    因为Redis的incrby命令可以实现原子性的操作,所以可以在高并发的秒杀活动中通过Redis的incrby命令控制库存、也可以它来控制接口的访问次数。

    3、定时器

    因为redis可以设置数据的有效期,我们可以把一些有时效性的数据放入redis.例如验证设置过期时间等

    4、分布式锁

    多个系统在Redis中set同一个key,只有key不存在的时候,才能设置成功,并且该key会对应其中一个系统的唯一标识,当该系统访问资源结束后,将key删除,则达到了释放锁的目的。在实现的时候要注意的几个关键点:

    1、锁信息必须是会过期超时的,不能让一个线程长期占有一个锁而导致死锁;

    2、同一时刻只能有一个线程获取到锁。

    几个要用到的redis命令:

    setnx(key, value):“set if not exits”,若该key-value不存在,则成功加入缓存并且返回1,否则返回0。

    get(key):获得key对应的value值,若不存在则返回nil。

    getset(key, value):先获取key对应的value值,若不存在则返回nil,然后将旧的value更新为新的value。

    expire(key, seconds):设置key-value的有效期为seconds秒。

    更多相关内容
  • 而且支持丰富的数据类型:string(字符串)、hash(哈希)、list(列表)、set(无序集合)、zset(sorted set:有序集合)Redis在项目中的应用场景1、缓存数据最常用,对经常需要查询且变动不是很频繁的数据 常称作热点数据。...

    Redis是一个开源的底层使用C语言编写的key-value存储数据库。可用于缓存、事件发布订阅、高速队列等场景。而且支持丰富的数据类型:string(字符串)、hash(哈希)、list(列表)、set(无序集合)、zset(sorted set:有序集合)

    Redis在项目中的应用场景

    1、缓存数据

    最常用,对经常需要查询且变动不是很频繁的数据 常称作热点数据。

    2、消息队列

    相当于消息订阅系统,比如ActiveMQ、RocketMQ。如果对数据有较高一致性要求时,还是建议使用MQ)

    3、计数器

    比如统计点击率、点赞率,redis具有原子性,可以避免并发问题

    4、电商网站信息

    大型电商平台初始化页面数据的缓存。比如去哪儿网购买机票的时候首页的价格和你点进去的价格会有差异。

    5、热点数据

    比如新闻网站实时热点、微博热搜等,需要频繁更新。总数据量比较大的时候直接从数据库查询会影响性能

    Redis数据类型的应用场景

    前面提到了Redis支持五种丰富的数据类型,那么在不同场景下我们该怎么选择呢?

    1、String

    字符串是最常用的数据类型,他能够存储任何类型的字符串,当然也包括二进制、JSON化的对象、甚至是base64编码之后的图片。在Redis中一个字符串最大的容量为512MB,可以说是无所不能了。

    2、Hash

    常用作存储结构化数据、比如论坛系统中可以用来存储用户的Id、昵称、头像、积分等信息。如果需要修改其中的信息,只需要通过Key取出Value进行反序列化修改某一项的值,再序列化存储到Redis中,Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在String结构里是不存在的。

    3、List

    List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。另外,可以利用 lrange 命令,做基于 Redis 的分页功能,性能极佳,用户体验好。

    4、Set

    set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,这个时候就可以选择使用set。

    5、Sort Set

    可以按照某个条件的权重进行排序,比如可以通过点击数做出排行榜的数据应用。

    Redis特点:

    1、Redis是纯内存操作,需要的时候需要我们手动持久化到硬盘中

    2、Redis是单线程,从而避开了多线程中上下文频繁切换的操作。

    3、Redis数据结构简单、对数据的操作也比较简单

    4、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求

    5、使用多路I/O复用模型,非阻塞I/O

    更多Redis相关知识,请访问Redis使用教程栏目!

    展开全文
  • Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用。同时支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglogs和...
  • 主要介绍了redis中使用redis-dump导出、导入、还原数据实例,本文直接给出操作命令,并给出注释加以说明,需要的朋友可以参考下
  • Redis 是一个开源的内存数据结构存储系统。 可以作为数据库、缓存和消息中间件使用。 支持多种类型的数据结构。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),...
  • 如何评估数据适不适合放入Redis中?

    千次阅读 2020-10-29 14:30:32
    当项目中引入了 Redis 做分布式缓存,那么就会面临这样的问题: 哪些数据应该放到缓存中?依据是什么? 缓存数据是采用主动刷新还是过期自动失效? 如果采用过期自动失效,那么失效时间如何制定? 正好这两周...

    当项目中引入了 Redis 做分布式缓存,那么就会面临这样的问题:

     

    • 哪些数据应该放到缓存中?依据是什么?
    • 缓存数据是采用主动刷新还是过期自动失效?
    • 如果采用过期自动失效,那么失效时间如何制定?

     

    正好这两周我们项目做了相关的评估,把过程记录下来和大家分享分享;当然过程中用到了很多“笨办法”,如果你有更好的办法,也希望能分享给我。

     

    01. 项目背景

    我们的项目是一个纯服务平台,也就是只提供接口服务,并没有操作页面的,项目的接口日调用量大约在 200 万次,高峰期也就 1000 万出头,因为大部分接口是面向内部系统的,所以大部分请求集中在工作日的 9 点到 21 点,高峰期的时候系统的 QPS 在 300-400 之间。

     

     

    因为我们项目数据存储使用的是 MongoDB,理论上支撑这个量级的 QPS 应该是绰绰有余,但是我有这么几点观察和考虑:

    MongoDB 中虽然是整合好的数据,但是很多场景也不是单条查询,夸张的时候一个接口可能会返回上百条数据,回参报文就有两万多行(不要问我能不能分页返回......明确告诉你不能);

    • MongoDB 中虽然是整合好的数据,但是很多场景也不是单条查询,夸张的时候一个接口可能会返回上百条数据,回参报文就有两万多行(不要问我能不能分页返回......明确告诉你不能);

    • 目前项目 99.95% 的接口响应时间都在几十到几百毫秒,基本可以满足业务的需要,但是还是有 0.05% 的请求会超过 1s 响应,偶尔甚至会达到 5s、10s;

    • 观察这些响应时间长的请求,大部分时间消耗在查询 MongoDB 上,但是当我将请求报文取出,再次手动调用接口的时候,依然是毫秒级返回;MongoDB 的配置一般,时刻都有数据更新,而且我观察过,响应时间长的这些接口,那个时间点请求量特别大;

    • MongoDB 查询偶尔会慢的原因我我还在确认,我现在能想到的原因比如:大量写操作影响读操作、锁表、内存小于索引大小等等,暂时就认为是当时那一刻 MongoDB 有压力;我观察过,响应时间长的这些接口,那个时间点请求量特别大,这一点就不在这里具体分析了。

     

    虽然一万次的请求只有四五次响应时间异常,但是随着项目接入的请求越来越大,保不齐以后量变产生质变,所以还是尽量将危机扼杀在摇篮里,所以果断上了 Redis 做分布式缓存。

     

    02. 接口梳理

    下一步就是对生产环境现有接口进行统计和梳理,确定哪些接口是可以放到缓存中的,所以首先要对每一个接口的调用量有大概的统计,因为没有接入日志平台,所以我采用了最笨的办法,一个一个接口的数嘛。

     

    • 把工作日某一天全天的日志拉下来,我们四台应用服务器,每天的日志大概 1 个G,还好还好;

    • 通过 EditPlus 这个工具的【在文件中查找】的功能,查询每个接口当天的调用量,已上线 30 个接口,有几分钟就统计出来了,反正是一次性的工作,索性就手动统计了;

    • 一天也调不了几次的接口,就直接忽略掉了,我基本上只把日调用量上万的接口都留下来,进行下一步的分析。

     

    03. 字典表、配置类的数据

    这一类的数据是最适合放在缓存中的,因为更新频率特别低,甚至有时候 insert 了之后就再也不做 update ,如果这类数据的调用量比较大,是一定要放到 Redis 中的;

     

    至于缓存策略,可以在更新的时候双写数据库和 Redis,也可以采用自动失效的方式,当然这个失效时间可以放得比较长一些;针对我们项目,我采用的是半夜 12 点统一失效的策略,第一因为我们系统这类数据,是夜间通过 ETL 抽取过来的,每天同步一次,第二就是我们不怕缓存雪崩,没有那么大的访问量,夜间更没有什么访问量了。

     

    04. 明显是热点数据的数据

    有一类数据,很明显就是热点数据;

     

    我们就有一个接口,虽然是业务数据,不过数据总量只有几千条,但是每天的调用量大约在 40 万,而且更新频率不是很高,这类数据放入 Redis 中也就再适合不过了;至于缓存策略么,因为数据也是从其他系统同步过来的,根据数据同步的时间,我们最终采用一个小时的失效时间。

     

    05. 其余数据的评估

    其实前两种数据很容易就能评估出来,关键是这类数据的评估:

     

    • 我们有一个接口日调用量 20-30 万,量不大,但是查询和处理逻辑比较复杂;

    • 基础数据量太大,无法把所有数据都放入 Redis 中;

    • 无法把基础数据直接放入 Redis 中,因为有多重查询维度(条件);

    • 无法确定每条数据的调用频率是怎么样的,最悲观的结果,每条数据当天只调用一次,这样就没有缓存的必要了。

     

    但是咱也不能一拍脑袋就说:“调用量挺大的,直接放到 Redis 中吧”,或者“不好评估,算了吧,别放缓存了”,做任何一个决定还是需要有依据的,于是我是这样做的:

     

     

    Step 1. 把该接口当天的所有日志都找出来

    几十个日志文件肯定不能一个一个翻,要么就自己写个程序把需要的数据扒出来,但是考虑到这个工作可能只做一次,我还是尽量节省一些时间吧。

     

    依然使用 EditPlus 这个工具的【在文件中查找】的功能,在查询结果框中【复制所有内容】,花了两分钟,就把 24 万条日志找出来了。

     

    Step 2. 把数据导入到数据库中进行下一步分析

    每一条日志大概是这样的:

    XXXX.log"(64190,95):2020-3-17 16:44:10.092 http-nio-8080-exec-5 INFO 包名.类名 : 请求参数:args1={"字段1":"XXX","字段2":"YYY"}

     

    日志里面我只需要三个内容:请求报文中的字段 1 和字段 2,以及调用时间;怎么摘出来?写个程序?当然没问题,但是我懒呀,几分钟能做好的事情为什么话花几十分钟呢?而且这工作是一次性的,于是:

     

    • 全文替换:[ 2020-3-17 ] 替换成 [ /t2020-3-17 ] ,也就是在时间戳前面加一个 tab;

    • 全文替换:[ {"字段1":" ] 替换成 [ /t ] ;

    • 全文替换:[ ","字段2":" ] 替换成 [ /t ] ;

    • 全文替换:[ "} ] 替换成 [ ],也就是替换成空 ;

    • 全选复制,粘贴到 excel 中,excel 自动按照 tab 换列;

    • 删除不需要的列,只留字段 1 和字段 2 的内容,以及时间戳;

     

    这几步操作用不了一分钟。

     

    Step 3. 调用频率分析

    当把数据进入到数据库中,就根据我们的需要进行分析了;我们主要想知道,相同的入参会不会重复调用?每次调用间隔的时间是多少?一个 SQL 搞定:

     

     

    当然调用间隔时间的统计,这里统计的不精确,具体我不解释了,你们细品...

     

    总之吧,全天 24 万的调用量,其中 10 万只调用了一次,14 万的数据会在短时间内重复调用,有一些数据甚至会在几分钟之内重复查询几十次,所以这个接口还是比较适合放入到 Redis 中的。

     

     

    Step 4. 数据怎么存?

    再说说我们的数据用什么格式保存到 Redis 中,一图胜千言:

     

    至于缓存更新策略嘛,我们依然使用设置失效时间的方式,根据数据同步的时间和调用统计结果,这个时间设置成 15 分钟比较合适。

     

    可以看到在这个评估过程中,我所有操作都保持了“能偷懒就偷懒”这个好习惯,保持高效,善用工具,节约不必要的时间,全部过程花了两个小时,其中大部分时间是在数据导入,几乎用了一个半小时,还好在这个过程中我还能做其他的工作。

    展开全文
  • 在早期单体应用时确实如此,只有一台服务进程,我们放在map中、list中都可以顺利的拿到内存中的数据,并且应用不依赖于NoSql中间件。 早期架构是非常简单的,不依赖任何中间件就可以工作,但是当应用的访问量逐渐...

    一、为什么使用Redis

    "为什么会有Redis呢?我放在map里面、list里面不是一样的嘛?反正都是放在内存里边。"

    在早期单体应用时确实如此,只有一台服务进程,我们放在map中、list中都可以顺利的拿到内存中的数据,并且应用不依赖于NoSql中间件。

    早期架构是非常简单的,不依赖任何中间件就可以工作,但是当应用的访问量逐渐增大时,单体应用因为承受不住大量并发访问而崩溃、故障,我们开始想办法解决这些问题,秉着人手不够就加人的办法,我们机器不够就加机器,于是出现了这样的架构

    使用多台服务器来分摊用户的请求,让每台服务器都能处理与之对应的请求来提高我们程序的可用性,这样做使我们的系统可用性增强了,但问题也随之而来,在web app中,user如果首先访问application0,并在application中做完了登录;此时user的第二个请求被负载均衡到application1,我们照着原来的业务逻辑从Session中拿取user登录的信息,由于user是在application0机器登录的,appcation1能获取到application0的内存数据吗?明显不能,所以我们要在这种架构中保证每一个应用程序拿到的session都是一致的也就是说,为了程序的正确性(用户只需要登录一次),我们必须要把这些共享的数据放在一个地方存储,所以Redis来帮助我们解决这个问题。也许你会说,"那mysql/oracle也可以做存储啊,为什么不用mysql呢?",的确,mysql也可以做到这种功能,但像这种经常访问的实时数据,更适合放在内存中,而不是放在磁盘中,要知道mysql的瓶颈就是磁盘I/O,此举无疑会增大mysql的压力,Redis作用是读写内存,内存读写速度对比磁盘读写速度不用说,那是一个天上一个地下,所以使用Redis的理由是:

    1.中心化存储,用于管理所有应用程序的共享数据。

    2.为关系型数据库缓解压力,因为Redis的吞吐量比mysql吞吐量大得多,热点数据、实时数据都可以用  Redis缓存。

     

    ---------------------------------------------------------------------------------------------------------------------------------

     Redis的特点

    • 数据都在内存中操作,适合海量数据读写
    • 支持持久化,Redis可以将内容持久化到磁盘中,就算故障重启数据也能回复
    • Redis支持String、List、Set、Hash、zSet数据结构

    ---------------------------------------------------------------------------------------------------------------------------------

    Redis的五大数据结构

    1. String:

     Redis最基本的数据类型,使用k-v键值的形式存储数据,一个key对应一个value,单个string的最大储存值为512M,使用set与get命令操作String类型的值。

    其中key=k1,value=v1。 

    应用场景:一般用于存储图片或序列化后的对象以及简单的串。

    2.Hash

     Hash是一个key-value的集合,用于存储多个k-v键值对,一个hash可以存储2的32次方-1个键值对(反正很多)。使用HMSET, HGET命令操作hash类型的值。

    应用场景:hash适合存储对象(对象名:field:value,...)

    3.List

     List是string的集合,用于存储多个string,存储上限与hash一致(反正很多)。使用lpush往集合左边添加数据,使用rpush往集合右边添加数据,使用lrange start(开始下标) stop(结束下标)来获取list中的数据,也可以用lpop、rpop来单个取数据。

    可以看到我们在使用lrange时必须加上start stop,如果不加上就会报错

    应用场景:可以当作一个消息队列使用(除非你对消息的丢失与重复不是很在意,否则不要用它),生产者使用lpush、rpush来生产消息,消费者使用lpop、rpop来消费消息。

    4.Set 

    Set 相对于List来说是无序的string集合,且里面不会包含等值的数据,使用sadd来添加一个元素到set中,如果成功返回1,如果该元素已经存在set中则返回0;使用smembers来获取set的所有数据

    应用场景:只要需要唯一值的场景都可以用set存储(例如统计在某个时间段点击了某按钮的用户啦等等等等~)。

    5.zset 

    带分数的set,分数可以重复,value不能重复,可用于实现排行榜。使用zadd来添加一个元素到set中,使用zrange key start stop或者zrangebyscore key start stop来获取一个zset中的范围数据。

    应用场景:排行榜(一个用户的排行、或一些事件的排行),因为zset可以根据分数排序~所以用此功能可以非常方便的做出排行统计。 

    下一章我们对Redis的持久化策略与缓存雪崩、缓存穿透、缓存击穿等问题做深入研究!

    展开全文
  • redis是一种内存级的数据,所有数据放在内存中,内存中的数据可以通过ttl指令获取其状态, xx:具有时效性的数据 -1:永久有效的数据 -2:已经过期的数据 或 被删除的数据 或 未定义的数据 对于过期的数据redis...
  • Redis什么这么快?

    万次阅读 多人点赞 2022-01-03 22:01:15
    因为它读写速度极快,一般用于缓存热点数据加快查询速度,大家在工作里面也肯定和 Redis 打过交道,但是对于Redis什么快,除了对八股文的背诵,好像都还没特别深入的了解。 今天我们一起深入的了解下redis吧: ...
  • 主要介绍了Java简单实现session保存到redis的方法,结合实例形式分析了Java将session存入redis缓存服务器的相关设置、实现技巧与操作注意事项,需要的朋友可以参考下
  • (以下单线程仅指Redis负责存取这块的线程只有一个,而非Redis中只有一个进程) 我先给个我的结论,单线程的Redis在瓶颈是cpu的io时(这不是大多数应用的实际应用场景),确实速度会比多线程慢。但是,我们实际应用...
  • 使用redis作为缓存,数据还需要存入数据库中吗? (推荐学习:Redis视频教程)我的答案是:redis只是缓存,不是数据库如mysql,所以redis中有的数据库,mysql中一定有。用户请求先去请求redis,如果没有,再去数据库中...
  • 什么要用redis

    2020-09-07 19:54:49
    1:为什么要用redis 原因很简单,快!这个问题在大并发,高负载的网站中必须考虑.redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis的的的在性能上对比其他基于硬盘存储的数据库有...
  • 文章目录概述持久化方式RDB ...Redis与传统数据库的一个主要区别在于,Redis把所有数据都存储在内存中,而传统数据库通常只会把数据的索引存储在内存中,并将实际的数据存储在硬盘中。 为了满足不同的持久化需求,Redis
  • Redis的简单稳定主要体现在以下几个方面: ·Redis使用单线程模型。...·Redis的所有数据都是存放在内存中的,这也是其运行速度快的重要原因。 ·Redis是用C语言实现的(C语言编写的程序距离操作系统更近
  • mysql redis mongodb

    千次阅读 2021-02-12 13:18:32
    无论数据还是索引都存放在硬盘中。到要用的时候才交换到内存中。能够解决远超过内存总量的数据。在不同的引擎上有不同 的存储方式。查询语句是用传统的 SQL 语句,拥有较为成熟的体系,成熟度很高。开源数据库的份额...
  • 总结:redis使用了IO多路复用,保证了redis在进行IO操作是依然能处理socket请求,不会再IO上浪费时间;单线程机制也避免了不必要的上下文切换和锁机制;而redis的每一次IO操作都是基于内存的,非常高效。可以说,...
  • Mysql,Mongodb,Redis对比

    2020-12-14 13:31:25
    Mysql,Mongodb,Redis对比MySQLRedisMongodb MySQL 1.为多种编程语言提供可API 2.大型的数据库。可以处理拥有上千万条记录的大型数据库 ...应用场景:用来做缓存-redis的所有数据放在内存中的 Mongodb 1.面向集
  • 什么redis需要把所有数据放到内存中? Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响...
  • Redis什么

    2021-11-14 09:24:57
    很多人接触redis的原因是因为它快,一般说到redis什么快,一般都会说redis是基于内存的数据库,操作内存和操作磁盘的时间相差很大,还有是redis使用了单线程,减少了多线程频繁切换带来的损耗 本文从我对redis的...
  • 目前在系统架构设计中使用Redis实现缓存,这篇文章主要介绍了使用Spring Data Redis实现数据缓存的方法,具有一定的参考价值,需要的朋友可以参考下
  • 通常来说,当数据多、并发量大的时候,架构中可以引入Redis,帮助提升架构的整体性能,减少Mysql(或其他数据库)的压力,但不是使用Redis,就不用MySQL。 因为Redis的性能十分优越,可以支持每秒十几万此的读/写操作...
  • 目录1 redis 主要有以下几种数据类型2 string3 hash4 list5 set6 sorted set 1 redis 主要有以下几种数据类型 代码实现:https://blog.csdn.net/ZGL_cyy/article/details/112796251 string hash list set sorted ...
  • 一、redis什么快?二、redis的底层数据结构2.1、redis的底层存储的扩容机制2.1.1、扩容时间2.1.2、扩容多大2.1.3、扩容后的rehash2.1.4、何时进行rehash2.1.5、俩hashtable访问那个呢?三、redis的key的底层数据...
  • redis数据倾斜

    2022-02-12 11:44:37
    数据倾斜分为两种: 1.数据量倾斜:在某些情况下,实例上的数据分布不均匀,某个实例上的时候特别多。 2.数据访问倾斜:虽然每个实例上的数据量差别不大,但是某个实例上的数据是热点数据,被访问的非常频繁。 数据...
  • 文章目录前言一、启动redis二、通过pipe管道传输,将mysql中的数据转入redis1、创建表(示例):2、存储过程插入百万数据3、编写脚本4、执行脚本把MySQL数据导入redis5、测试 前言 使用管道pipe高效地把mysql同步...
  • 准备数据,在想要迁移的实例上的所有节点执行BGREWRITEAOF,等待命令执行完毕。aof文件生成。将文件copy到某个外部目录下。这个时候你可以将原有的实例停服。 创建一个集群包含你aof文件个数的主节点,从节点你可以...
  • Redis数据类型以及应用场景

    千次阅读 2022-01-27 14:25:33
    文章目录前言Redis数据类型StringHashListSetSorted SetBitmapHyperLogLogGeospatial https://zhuanlan.zhihu.com/p/91539644 前言 Redis数据类型 String Hash List Set Sorted Set Bitmap HyperLogLog Geospatial
  • 数据放在内存中。如果机器挂掉,内存的数据就不存在。所以需要做持久化,将内存中的数据保存在磁盘 ,下一次启动的时候就可以恢复数据到内存中。)  Redis 提供了两种持久化方式:RDB(默认) 和AOF 。 RDB (快照...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,388
精华内容 36,955
关键字:

一般什么数据放在redis