当前位置:   article > 正文

Redis几种用途、与memcache的比较、持久化详解_java memcache与redis的应用场景

java memcache与redis的应用场景

简介

  • Redis 是一个开源 (BSD 许可)、内存数据结构存储,用作数据库、缓存和消息代理。
  • 它是一个非关系型数据库
  • Redis是一个高性能的key-value数据库
  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis 提供数据结构,如字符串、哈希、列表、集、分拣集,包括范围查询、位图、超日志、地理空间索引和流。
  • Redis 具有内置复制、Lua 脚本、LRU 驱逐、交易和不同级别的磁盘持久性,并通过 Redis 哨兵和与 Redis 集群的自动分区提供高可用性。

图解:
在这里插入图片描述

经典用途介绍

  • 投票系统
  • 用户登录session
  • 购物车
  • 网页缓存
  • 日志系统
  • 搜索引擎
  • 消息队列

具体应用场景:

  • 计数器
    • 可以对 String 进行自增自减运算,从而实现计数器功能。
    • Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。
  • 缓存
    • 将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。
  • 查找表
    • 例如 DNS 记录就很适合使用 Redis 进行存储。
    • 查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。
  • 消息队列
    • List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。
    • 不过最好使用 Kafka、RabbitMQ 等消息中间件。
  • 会话缓存
    • 可以使用 Redis 来统一存储多台应用服务器的会话信息。
    • 当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。
  • 分布式锁实现
    • 在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。
    • 可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。
  • 其它
    • Set 可以实现交集、并集等操作,从而实现共同好友等功能。
    • ZSet 可以实现有序性操作,从而实现排行榜等功能。

使用redis可以解决哪些问题

  • 解决应用服务器的cpu和内存压力
  • 减少io的读操作,减轻io的压力
  • 关系型数据库的扩展性不强,难以改变表结构
  • nosql数据库没有关联关系,数据结构简单,拓展表比较容易
  • nosql读取速度快,对较大数据处理快

场景适用性分析

适用场景:

  • 数据高并发的读写
  • 海量数据的读写
  • 对扩展性要求高的数据

不适用场景:

  • 需要事务支持(redis是非关系型数据库)
  • 基于sql结构化查询储存,关系复杂

Redis 与 Memcached

两者都是非关系型内存键值数据库,主要有以下不同:

  • 数据类型
    • Memcached 仅支持字符串类型,而 Redis 支持五种不同的数据类型,可以更灵活地解决问题。
  • 数据持久化
    • Redis 支持两种持久化策略:RDB 快照和 AOF 日志,而 Memcached 不支持持久化。
  • 分布式
    • Memcached 不支持分布式,只能通过在客户端使用一致性哈希来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。
    • Redis Cluster 实现了分布式的支持。
  • 内存管理机制
    • 在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘,而 Memcached 的数据则会一直在内存中。
    • Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。

Redis持久化

Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上

RDB 持久化

  • 将某个时间点的所有数据都存放到硬盘上。
  • 可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。
  • 如果系统发生故障,将会丢失最后一次创建快照之后的数据。
  • 如果数据量很大,保存快照的时间会很长。

AOF 持久化

  • 将写命令添加到 AOF 文件(Append Only File)的末尾。
  • 使用 AOF 持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。有以下同步选项:
    在这里插入图片描述
  • always 选项会严重减低服务器的性能;
  • everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响;
  • no 选项并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量。

随着服务器写请求的增多,AOF 文件会越来越大。Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/578272
推荐阅读
相关标签
  

闽ICP备14008679号