redis存大文件|Redis适合存储海量小文件吗

① redis 如何 把文件的内容 存进去

最近学习下redis,作为一个高性能的k/v数据库,如果数据不用swap的话,redis的性能是无以伦比的。最近在做一个系统附件的缓存,试着把附件放到redis试试,写了个保存文件的方法。public class TestRedis{ Jedis redis = new Jedis("localhost");//序列化方法 public byte[] object2Bytes(Object value) { if (value == null) return null; ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream outputStream; try { outputStream = new ObjectOutputStream(arrayOutputStream); outputStream.writeObject(value); } catch (IOException e) { e.printStackTrace(); } finally { try { arrayOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return arrayOutputStream.toByteArray(); }//反序列化方法 public Object byte2Object(byte[] bytes) { if (bytes == null || bytes.length == 0) return null; try { ObjectInputStream inputStream; inputStream = new ObjectInputStream(new ByteArrayInputStream(bytes)); Object obj = inputStream.readObject(); return obj; } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } //保存文件方法 public void setFile(String key,String path){ File fr = new File(path); redis.set(key.getBytes(), object2Bytes(fr)); } //读取文件对象方法 public File getFile(String key){ Jedis redis = new Jedis("localhost"); File file = (File)byte2Object(redis.get(key.getBytes())); return file; } public void testFile(String key,String path)throws Exception{ setFile("test", "D:\\test.txt"); File file = getFile("test"); BufferedReader br = new BufferedReader(new FileReader(file)); String record = null; while ((record = br.readLine()) != null) { System.out.println("record:"+record); } } public static void main(String[] args) throws Exception{ TestRedisos = new TestRedis(); os.testFile("test", "D:\\test.txt"); }}

② 大文件放redis还是文件

该文件内容每天都会变化。所以得写定时器定时读取最新文件然后录入redis中。但是分析日志发现,每次执行该任务都要花费好几个小时,太慢了

③ redis内存满了怎么办

redis内存满了解决方法:1,增加内存。2,使用内存淘汰策略。3,Redis集群。重点介绍下2、3:第二点:我们知道,redis设置配置文件的maxmemory参数,可以控制其最大可用内存大小(字节)。那么当所需内存,超过maxmemory怎么办?这个时候就该配置文件中的maxmemory-policy出场了。其默认值是noeviction。下面我将列出当可用内存不足时,删除redis键具有的淘汰规则。规则说明:1、volatile-lru使用LRU算法删除一个键(只对设置了生存时间的键)2、allkeys-lru使用LRU算法删除一个键3、volatile-random随机删除一个键(只对设置了生存时间的键)4、allkeys-random随机删除一个键5、volatile-ttl删除生存时间最近的一个键6、noeviction不删除键,只返回错误LRU算法,least RecentlyUsed,最近最少使用算法。也就是说默认删除最近最少使用的键。但是一定要注意一点!redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键。那么3这个数字也是可以设置的,对应位置是配置文件中的maxmeory-samples.三、集群怎么做Redis仅支持单实例,内存一般最多10~20GB。对于内存动辄100~200GB的系统,就需要通过集群来支持了。Redis集群有三种方式:客户端分片、代理分片、RedisCluster(在之后一篇文章详细说一下。)1、客户端分片通过业务代码自己实现路由优势:可以自己控制分片算法、性能比代理的好劣势:维护成本高、扩容/缩容等运维操作都需要自己研发2、代理分片代理程序接收到来自业务程序的数据请求,根据路由规则,将这些请求分发给正确的Redis实例并返回给业务程序。使用类似Twemproxy、Codis等中间件实现。优势:运维方便、程序不用关心如何链接Redis实例劣势:会带来性能消耗(大概20%)、无法平滑扩容/缩容,需要执行脚本迁移数据,不方便(Codis在Twemproxy基础上优化并实现了预分片来达到Auto Rebalance)。3、Redis Cluster优势:官方集群解决方案、无中心节点,和客户端直连,性能较好劣势:方案太重、无法平滑扩容/缩容,需要执行相应的脚本,不方便、太新,没有相应成熟的解决案例

④ Redis持久化策略(看这篇,你肯定会有所获)

RDB:Redis DataBase , 记录快照         RDB是redis 默认的持久化方案. RDB 是当满足一定条件时, 就会将redis内存中的数据写入磁盘,并生成一个快照文件mp.rdb 文件.Redis 重启会通过加载mp.rdb文件恢复数据.         一定条件分为以下几种情况: 1.自动触发  2. 手动触发 . 下面分开说明下: a).redis.conf 中 SNAPSHOTTING 其中定义了触发把数据保存到磁盘的触发频率.         如果不需要rdb 方案, 注释save 或者配置成空字符串" ".         save 900 1 #900秒内至少有一个key被修改(包括添加)         save 300 10 #400秒内至少10个key被修改         save 10000 #60秒内至少有10000个key 被修改.         这三条配置不冲突, 只要满足一条就触发.         rdb 文件位置和目录 (默认在安装根目录下)          #文件路径         dir ./         #文件名称         dbfilename mp.rdb         #是否以LZY压缩rdb 文件         rdbcompression yes          #开启数据校验         rdbchecksum yes b) shutdown触发 ,保证服务器正常关闭. c) flushall , rdb文件是空的, 会生成一个空的文件,所以这种情况也没有什么意义.但需要知道,这种情况下 会触发生成rdb文件. Redis 提供了两条命令: save 和 bgsave a). save 命令         save 在生成快照的时候会阻塞当前Redis 服务器,Redis不能处理其他命令.如果内存数据较多,会造成 b).bgsave 命令         执行bgsave命令时,   Redis会在后台进行异步快照操作,快照同时还可以响应客户端请求. 具体操作         具体操作:Redis进程会执行fork操作创建子进程(-on-write),RDB 持久化过程由子进程负载,完成后自动结束.它不会记录fork之后产生的记录.阻塞只发送在fork阶段,一般时间较短. 一.优势     1.RDB是一个非常紧凑的文件,它保存了Redis在某个时间点上的数据集.这种文件非常适合进行备份和 灾难恢复.     2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存的工作,主进程不需要进行任何 IO操作.     3.RDB在恢复大数据集时的速度比AOF的恢复速度要快 二.劣势     1).RDB 没办法做到实时持久化/妙级持久化.因为bgsave每次运行都要执行fork创建子进程,频繁执行成本过高.         2).在一定间隔时间做一次备份,所以如果Redis 以为down掉的话,就会丢失最后一次快照之后所有修改 (数据有丢失) AOF:<Append Only File> , 记录日志 Redis 默认不开启.AOF采用日志的形式来记录每个写操作,并追加到文件中.开启后,执行更改Redis    命令时,就会把命令写入到AOF文件中. Redis 重启时会根据日志文件的内容把写指令从前往后执行一次以完成数据的恢复工作. #开关 appendonly no #文件名 appendfilename "appendonly.aof"         由于操作系统缓存机制,AOF数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存.什么时候 把缓冲区的内容写入到AOF文件中? 由下面参数决定 appendfsync :  值: no  \ always \everysec          no: 表示不执行fync, 由操作系统保证数据同步到磁盘,速度最快,但是不安全.         always:表示每次写入都执行fync,以保证数据同步到磁盘,效率很低         everysec:表示每秒执行以fync ,可能会导致丢失1s数据.通常选择everysec,兼顾效率和安全性.     因为AOF文件只有一个, 随着redis 不断进行,AOF 的文件会越来越大,文件越大, 文件占用服务器内存 以及AOF恢复要求时间越长.     为了解决这个问题,可以使用bgwriteaof来重写.那什么时候重写? 又是怎样重写?     一. 什么时候重写?     #重写触发机制     auto-aof-rewrite-percentage 100 默认值是100. 当前aof 文件大小超过 上一次重写的aof文件大小百分之多少进行重写,即当aof文件增长到一定大小时,Redis能够调用bgwriteaof对日志文件进行重写.当前aof文件大小是上次日志重写得到aof文件大小的二倍时, 自动启动新的日志重写过程.     auto-aof-rewrite-min-size 默认是64M.设置允许重写的最小aof文件大小,避免达到了约定百分比 但尺寸 仍然很小的情况还要重写.    二. 怎样重写?     并不是对原文件进行重新整理,而是直接读取服务器上现有的键值对,然后用一条命令去代替之间记录这 个键值对的多条命令,生成一个新的文件后去替换原来的 AOF文件.     看下面这两个参数:         no-appendfsync-on-rewrite         aof-load-truncated   AOF 数据恢复         重启Redis之后就会进行AOF文件恢复.    AOF 的优势和劣势 优点: 1.AOF 持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis最多也就丢失 1秒的数据. 缺点: 1.对于具有相同数据的Redis, AOF文件通常比RDF文件体积更大(RDB存的是数据快照) 2.虽然AOF提供了多种同步的频率,默认的情况下,没秒同步一次的频率也具有较高的性能.在高并发的情况下,RDB比AOF具有更好的性能.         如果可以忍一小段时间数据的丢失,毫无疑问使用RDB 是最好的,定时生成RDB快照非常便于进行数据备份,而且RDB恢复数据集的速度也要比AOF恢复速度要快.         否则就要使用AOF重写.但是一般情况下建议不要单独使用某一种持久化机制,而是两种一起用.本文内容来自咕泡学院-青山老师,感谢青山老师!!

⑤ 通过Redis消息队列实现大文件处理

一、故事背景 1、读取离线文件数据,再通过【离线数据】作为条件,查询第三方接口,返回最终的结果,再入库。 2、 业务逻辑是很简单, 读取文件、查询接口、返回数据集、入库 四步。 3、业务特性:第三方接口调用400毫秒(ms) 。 如果用普通单线程去跑算500毫秒一个请求,一天也就跑8W多数据量,20多亿的数据不知道跑到猴年马月了。

二、处理方案 A) 初步方案采用ganymed-ssh2(文件都存储在Linux服务器上) 来读文件,Redis来存储消息、多线程来提升处理能力。 B) 流程图:

三、呈现问题

四、优化问题

最终流程图:

1、 通过Redis做一个计数器 每读取一行记录数值,即使服务终止后,先从Redis读取这个数值 再通过cat指定行数开始读数据即可。

2、 通过取模拆Key 分片到不同小Key存储 ,降低单个节点存储压力,也充分利用了存储资源。

3、Redis Push 提供了批量方式(leftPushAll) ,可以指定读取行数再批量入库,而pop并没有提供批量 只能一个一个pop。

4、消费者通过多线程pop、再分发到线程去处理。

五、总结问题

⑥ Redis存储格式

redis目前提供四种数据类型:string,list,set及zset(sorted set)。redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。

⑦ redis 缓存的单个最大文件是多少

本地缓存可以减少网络io的开销,如果对性能要求极高可以考虑使用。如果redis本身就可以满足要求了,那么就没必要使用。使用就要考虑不同机器数据不一致的问题。

⑧ redis rdb文件过大

mp.rdb文件是redis缓存被持久化到本地的数据文件。可以用scan命令看看 缓存的数据是不是都是你需要的。不需要的话 可以用命令 flushdb 然后 save 将缓存清掉。

⑨ Redis适合存储海量小文件吗

最近学习下redis,作为一个高性能的k/v数据库,如果数据不用swap的话,redis的性能是无以伦比回的。最近在做一个系统附件的答缓存,试着把附件放到redis试试,写了个保存文件的方法。public class TestRedis{ Jedis redis = new Jedis("localhost");…

⑩ 如何把1m的文件快速存入redis中.回 答

用Redis实现数据的读写,若mysql更新失败,则需要及时清除缓存及同步redis主键。这样处理。同时要注意避免冲突,一般不是很,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,同时利用队列处理器定时将数据写入mysql


赞 (0)