本文将为大家介绍Redis的一些高级特性以及结合一个具体的实际案例来对Redis进行设计分析。

Redis基础类型回顾

String

Redis中最基本,也是最简单的数据类型。注意,VALUE既可以是简单的String,也可以是复杂的String,如JSON,在实际中常常利用fastjson将对象序列化后存储到Redis中。另外注意mget批量获取可以提高效率。

Hash

Hash结构适用于存储对象,相较于String,存储占用更少的内存。Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值,而且还可以快速定位数据。比如,如果我们把表User中的数据可以这样放置到Redis中:Hash存储,KEY:User,Field:USERID,VALUE:user序列化后的string。

List

既可以当做栈、又可以当做队列。实际上,可以利用List的先进先出或者先进后出的特性维护一段列表,比如排行榜、实时列表等,甚至还可以简单的当做消息队列来使用。

Set

Set是String类型的不重复无序集合。Set的特点在于,它提供了集合的一些运算,比如交集、并集、差集等。这些运算特性,非常方便的解决实际场景中的一些问题,如共同关注、共同粉丝等。

ZSet

ZSet就是SortedSet。实际中,很多排序场景都可以考虑ZSet来做。

Redis发展过程中的三种模式:主从、哨兵、集群

Redis的发展可以从版本的变化看出来,从1.X的主从模式,到2.X的哨兵模式,再到今天3.X的集群模式,可以说这些都是Redis保证数据可靠性、高可用的思路。下面我们来简单实践下。环境说明:这里准备了4台Centos Linux,装有redis的3.0版本。

主从模式

Redis早期用于保证数据可靠性的一种简单方式。具体来说,Master可用于写、读,而Slave一般只用于读。

其实在配置上相当简单,只需要在Slave节点配置下Master的IP、PORT、密码即可。

192.168.99.122/123 redis.conf:

Master info

Slave info

注意:

一个Master可以拥有多个Slave

主从复制不会阻塞住Master,在同步数据时Master可以继续处理client端请求

哨兵模式

对于主从复制模式而言,有个明显的缺点:一旦主节点挂了,那么redis服务将不可用。在2.X中,为了确保可高用,所以发展出来哨兵模式。顾名思义,就是哨兵站岗,去监听master心跳,如果master挂了,那么将从slave中选举出一个master来,从而实现了故障自动切换。

实质上,在Master-Slave模式基础上,只需要在启动一个哨兵服务进行监听就可以,这个哨兵服务可以部署在Master/Slave上,也可以部署到其他机器上。当然,在实际中为了避免哨兵节点的单点性,也会配置多个哨兵服务。

哨兵节点192.168.99.124  sentinel.conf:

sentinel monitor mymaster 192.168.99.121 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 2

我们需要告诉哨兵服务:

监控的主节点的IP,PORT

如果master挂了,那么选举的时候,slave达到多少票就可以成为主节点

监控主节点的心跳频率

主节点下有多少slave

集群模式

Redis集群模式是目前应用非常广泛的,Redis集群模式的出现,也使得以前的一些Redis技术,比如分片、都不在适用了,同时数据的高可靠、数据分布性、服务的高可用性进一步加强。关于Redis集群将在下一篇博客中详细介绍。

Redis的简单事务

目前来看,Redis对事务的支持是比较简单的,在实际应用中,我们基本上是不会使用的。看一个实例,你就会明白。通过multi开启事务,通过exec来提交事务。可以看到,redis的事务目前是不支持一起成功,一起失败这种基本要求的,即便在事务中有错误,亦不会回退,和MySQL的事务功能相距甚远吧。

Redis持久化机制

Redis是一个支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化,有2种方式实现。

RDB

RDB方式,也称作快照snapshotting,将内存中的数据以快照的方式写入到二进制文件dump.rdb中,这种方式也是redis的默认方式。可以在redis.conf中设置保存的策略。一句话:redis在N秒内如果超过M个KEY发生修改则自动做快照保存。

AOF

AOF,即Append-Only File。要知道RDB的方式,是在一定的时间间隔做一次,如果redis意外down掉,这将意味着会丢失最后一次快照后的所有修改数据,这在生产环境将不太可能接受。AOF比RDB有着更好的持久化方式,通过AOF,redis会将每一个收到的写命令都通过write函数追加到命令中,当redis重新启动时,会重新执行文件中保存的写命令来重建数据内容。

redis.conf:

在实际应用中,为了确保数据高可靠性,应该使用always策略。

发布与订阅消息

概念上比较简单,如果你订阅了频道,那么这个频道上发布的消息,你都会知道。实际中应用较多的是消息中间件(ActiveMQ,RocketMQ)的订阅发布模式(在以后的消息中间件专题再为大家介绍)。

Redis案例设计分析

我们先来看一个京东上进行商品搜索的图:

假设一个类似的场景,有几百万,甚至几千万的商品数据,考虑下如何快速实现搜索查询呢?当然,我们不可能直接查询MySQL,应该需要在MySQL上加一层,可以考虑加一层Redis。

将MySQL中的数据加载至Redis中,给定条件,直接遍历Hash数据进行查询。如果就这样简单的设计的话,对于京东这样的大流量平台,每天有非常多的人进行商品搜索,而且每个人搜索的条件还不一样,根本无法快速响应。

如上图所示,我们可以这样设计:

  1. 我们事先建立好一系列的SET,实际上这些Set都是各种分类的ProductID集合

  2. 用户的搜索条件,实际上就是各种SET进行交、并、补的运算而已

  3. 要知道SET进行运算后的结果,就是ProductID集合,此时范围已经有所缩小,比起直接遍历全部商品数据要小不少

上这里也可以看出,Redis虽然用起来简单,但是要综合运用,并根据业务场景进行设计,还是挺有意思的。到这里就结束了,我们下期Redis集群再见!

转载于:https://blog.51cto.com/zhangfengzhe/1901424

Redis高级特性介绍及实例分析相关推荐

  1. redis高级特性学习(慢查询、Pipeline、事务、Lua)(上)

    Redis高级特性和应用(慢查询.Pipeline.事务.Lua) Redis的慢查询 许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作.所谓慢查询日志就是系统在命 ...

  2. Redis高级特性及应用场景

    Redis高级特性及应用场景 redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它. 过期时间可以设置为秒或者毫秒精度. ...

  3. Redis 高级特性(2)—— 发布 订阅模式

    Redis 高级特性 -- 发布订阅 1. 发布-订阅介绍 "发布-订阅"模式包含两种角色,分别为发布者和订阅者.订阅者可以订阅一个或者若干个频道(channel),而发布者可以向 ...

  4. redis 经纬度_【SpringBoot DB 系列】Redis 高级特性之 GEO

    [SpringBoot DB 系列]Redis 高级特性之 GEO GEO 用于存储地理信息,最直观的就是我们日常使用的地图 app 中,如果我想查询我所在地的周边餐饮,就可以利用 geo 中的以(x ...

  5. Redis 高级特性(1)—— 事务 过期时间 排序

    1. Redis 高级特性 -- 事务 事务概念 Redis 中的事务 (transaction)是一组命令的集合.事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执 ...

  6. OpenMLDB 进阶使用攻略和高级特性介绍

    本文整理自 OpenMLDB PMC 张浩在 OpenMLDB Meetup No.6 中的分享 --<OpenMLDB 进阶使用和高级特性介绍>. 大家好,我是 OpenMLDB PMC ...

  7. 搞定Redis高级特性与性能调优

    阅读文本大概需要15分钟. 本文适合使用 Redis 的普通开发人员,以及对 Redis 进行选型.架构设计和性能调优的架构设计人员: Redis 的数据结构和相关常用命令 数据持久化 内存管理与数据 ...

  8. 一文通透讲解Redis高级特性,多线程/持久化/淘汰机制等统统搞定

    Redis 是一个开源的,基于内存的可持久化的非关系型数据库存储系统.在实际项目中可以用 Redis 做缓存或消息服务器,Redis 也是目前互联网中使用比较广泛的非关系型数据库,下面就来深入分析Re ...

  9. Redis高级特性及优化

    2019独角兽企业重金招聘Python工程师标准>>> redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删 ...

最新文章

  1. CHUNGHOP k-6868万能空调遥控器的自己家用电器的代码+自己家里的宽带账号+机顶盒型号+桌子+椅子+垫子高度
  2. java string rt_如何使jvm加载我的java.lang.String而不是rt.jar中的那个
  3. 【BZOJ2095】【POI2010】Bridge 网络流
  4. TLS配置和流量分析实验
  5. 在linux云服务器上运行Jar文件
  6. 年薪 50w+ 的程序员,是这样写代码的?
  7. linqto 多个关键字模糊查询_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
  8. js 设计模式学习(1)
  9. Fancybox—Fancybox的API和配置选项说明
  10. aix如何查看日志策略_AIX系统日志学习笔记之一
  11. 实景三维数据在高速公路中的应用
  12. 旋转矩阵(方向余弦阵)
  13. Linux进程管理(redhat 8.0)
  14. 计算机找不到海信电视,海信电视突然看不了电视直播了,怎么解决?当贝市场良心分享...
  15. python删除excel指定行_python实现Excel删除特定行、拷贝指定行操作
  16. 学习编程,应该从哪里开始学习呢?
  17. 元引擎视频制作工具 一键生成原创视频软件
  18. 国内常用 DNS 汇总
  19. 学原油期货买什么书(怎么样买原油期货)
  20. 【SV 基础】queue 的一些用法

热门文章

  1. 设置SQLServer数据库内存
  2. dos命令安装windows服务
  3. MVC后台数据赋值给前端JS对象
  4. 蓝桥杯练习系统历届试题 翻硬币
  5. idea中,springboot项目部署到docker
  6. idea 本地远程debug服务器项目
  7. html提交列表编号自动生成目录,解析 Html 自动生成目录 TOC 的相关代码
  8. 为什么python不需要编译_为什么我用Go写机器学习部署平台,而偏偏不用Python?...
  9. 用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍
  10. java中数组合并的方法,数组合并--Java原生方法