美文网首页
HotFrameLearning Redis_01_简介

HotFrameLearning Redis_01_简介

作者: HMILYYLIMH | 来源:发表于2018-07-03 00:05 被阅读27次

    HotFrameLearning Redis_01_简介

    一、大致介绍

    1、介绍Redis之前,我有一堆的疑问,Redis是什么?有什么用?它能干什么?有什么特性?能解决我们日常的哪些问题?
       为什么要用Redis?Redis好在哪里?除了Redis外还有其他替代方案么?
    2、对于还没了解过Redis的童鞋,可以带着这些疑问往下看,而对于了解过Redis的童鞋那就走过路过不要错过^_^。
    3、另外目前讨论的版本也是比较新的版本3.x版本;
    

    二、简单认识Redis

    2.1 何为Redis?

       Redis 是一个开源的基于内存的数据结构化存储媒介,多用于数据库、缓存以及消息代理。
       再简言之,Redis 是一个基于内存的 key-value 数据库。
    

    2.2 原滋原味解释

    原文地址:https://redis.io/topics/introduction
    
    Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
    
    You can run atomic operations on these types, like appending to a string; incrementing the value in a hash; pushing an element to a list; computing set intersection, union and difference; or getting the member with highest ranking in a sorted set.
    
    In order to achieve its outstanding performance, Redis works with an in-memory dataset. Depending on your use case, you can persist it either by dumping the dataset to disk every once in a while, or by appending each command to a log. Persistence can be optionally disabled, if you just need a feature-rich, networked, in-memory cache.
    
    Redis also supports trivial-to-setup master-slave asynchronous replication, with very fast non-blocking first synchronization, auto-reconnection with partial resynchronization on net split.
    
    Other features include:
    
    Transactions
     - Pub/Sub
     - Lua scripting
     - Keys with a limited time-to-live
     - LRU eviction of keys
     - Automatic failover
    You can use Redis from most programming languages out there.
    
    Redis is written in ANSI C and works in most POSIX systems like Linux, *BSD, OS X without external dependencies. Linux and OS X are the two operating systems where Redis is developed and more tested, and we recommend using Linux for deploying. Redis may work in Solaris-derived systems like SmartOS, but the support is best effort. There is no official support for Windows builds, but Microsoft develops and maintains a Win-64 port of Redis.
    
    

    三、Redis的一些特性

    3.1 数据类型

       Redis支持多种数据结构,这也是它的亮点所在,除外Redis的单个Value最大限制为1GB,已经远远超过memcached的
    1MB的大小限制。下面我们看看它有哪些数据类型,能干什么用,内部结构是怎么样的。
    
        • strings:字符串类型,最基本的数据类型,通常来存储基本的字段值;
        • hash:是一个string类型的Field和Value之间的映射表,通常用来存储一个对象中各个Key与Value信息的映射;
        • lists:元素都是string类型的双向链表,通常用来存储好友列表,粉丝列表,前十首热门歌曲,最新消息排行等;
        • set:是一个无序的string类型数据的集合,其内部用的是HashMap实现,只是Value都是空的而已,通常用来对数据
          做交集、并集、差集等操作,因此就有类似共同好友,共同兴趣等业务数据应运而生;
        • sortset:有序set,其内部仅仅只是在set基础上新增了一个排序score字段,通常用于具有排序功能的业务数据展示;
    

    3.2 持久化

       Redis 提供了两种持久化方式,一个是RDB(Redis DataBase),另一个是AOF(Append Only File),至于说谁好谁差
    呢?应该说各有所长,然而官网却建议我们两者结合使用,双保险嘛。   
    
        • RDB:就是在不同的时间点生成的快照文件并存储到硬盘上;
        • AOF:就是将redis的那些写指令记录下来,目的就是为了下次redis重启时可以快速执行这些指令恢复数据;
        
       不过既然用到Redis存储,个人建议如果大家没有什么特殊的持久化需求的话,完全不用理会这两种持久化的方式,直接
    关闭即可,因为redis本来擅长的领域就是内存数据库,对于持久化存储方面不擅长。   
    

    3.3 主从同步

       Redis 所谓的主从一方面可是一主有多从,但是另外一方面每个从节点也可以有多个从节点。而这样做的目的其实很简
    单,一来是为了提升读的性能,二来也是为了去中心化增加数据冗余备份。一旦主节点挂了,从节点就得立马顶上去。
       
       然而主从之间的同步的思路也是挺简单的,都是slave主动向master发出sync指令,意思就是告诉master,slave需要同
    步数据啦。master收到sync后则会调用bgsave指令fork一个子进程来持久化存储master的数据,在master的持久化的这个
    短短期间内,master的write指令则存储到内存中。待master的子进程持久化完成后则将持久化的这个文件发送给slave节点,
    待slave接收完成并将数据加载到slave内存中,然后master节点还会将持久化期间缓存的write指令再次发给slave节点。
    

    3.4 发布订阅

       该发布订阅,和我们常用的MQ发送订阅的模式是一样的,支持订阅单个频道,也支持订阅多个频道,还支持类似正则表
    达式一样的模式匹配。
    

    3.5 事务

       Redis 也拥有自己的一套事务机制,只是这个所谓的事务机制没有关系型数据库那么强大,但是还是勉强够用,其实Redis
    的事务,就是一组命令的集合,MULTI、EXEC、DISCARD 和 WATCH 是 Redis 事务相关的命令。既然是一组命令的执行,那么
    Redis给了我们什么样的保证呢?来保证执行不被其他命令打断或篡改呢?
    
        • 保证一:事务是一个单独的隔离操作,所有命令被序列号有序执行;
        • 保证二:事务是一个原子操作,要么全部执行,要么全部不执行;
    
       然而在实际应用中总是那么差强人意,事务中如果是因为语法错误的话,则是不会提交事务,但是如果是运行时错误的
    话,那就完蛋了,所有命令都会被执行,没有回滚机制,难道就没有解救措施了么,这个还真没有,运行时错误是编程时
    需要杜绝的,这样的话其实也不存在需要什么回滚操作,一切顺其自然一气呵成。
    
       当然Redis还提供一个WATCH命令,来防止EXEC执行后发现值被篡改的话,则EXEC也照样返回失败处理;
    

    3.6 Lua脚本

        Lua脚本功能是Reids 2.6版本的最大亮点,通过内嵌对Lua环境的支持,解决了长久以来不能高效地处理CAS命令的缺点, 
    并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。
    

    3.7 回收策略

        回收策略,还有一个变态的辅助帮手,就是客户端每执行一个命令,都会检测内存是否超标,如果超标,果断淘汰。
        
        六种回收策略如下:
        • noeviction 不回收;
        • allkeys-lru 从所有键中删除最近最少使用的键;
        • volatile-lru 从设置了过期时间的键中删除最近最少使用的键;
        • allkeys-random 从所有键中随机删除;
        • volatile-random 从设置了过期时间的键中随机删除;
        • volatile-ttl 从设置了过期时间的键中选择存活时间最短的键删除;
    

    3.8 线程模型

        Redis 之所以有着飞一样的读写速度,这还得得益于它的单进程单线程模样的线程模型。经过Redis官网的测试性能结
    果达到10W+的QPS。
    
        优秀的线程模型不但简化了代码逻辑,而且也不用考虑并发,也不用考虑各种锁的问题,更不存在多线程切换消耗CPU
    的问题了,一切的一切,就是单线程挨个挨个执行。
    
        但是这种线程模型架构也带来一定的问题,牺牲了多核CPU性能,视多核CPU如无物,简直暴殄天物,反过来讲,目前
    得到大家的方响,也没说redis十分慢,若如果真的遇到了redis十分慢的话,那很有可能是开发者的姿势不对,说不定又
    在哪里进行了耗时的操作。
    

    四、Redis优缺点

    4.1 优点

        • 速度快,10W+的QPS,而且数据结构类似HashMap查询复杂度低;
        • 数据结构相对比较丰富,而且存储的Value也相对足够大;
        • 支持事务,而且还支持Lua脚本进行CAS操作;
        • 主从复制,支持读写分离,而且还支持RDB与AOF两种持久化方式;
    

    4.2 缺点

        • 不能充分利用多核CPU的硬件优势;
        • 多主多从模式中,如果某一区域独立的主从同时挂掉且造成哈希槽的部分不可用,那么整个集群将会导致不可用;
        • 网络波动会造成主从之间会进行全量数据复制,如果快照文件过大,则会给内存带来非常大的压力;
        • 主从复制如果不在同一局域网,则会给主从复制的性能带来很大的损伤;
    

    4.3 对比memcached

        • 数据类型:Redis不仅支持简单的k/v类型,还支持list,set.zset,hash等数据结构,但memcached支持图片视频缓存;
        • 存储方式:Redis在物理内存用完时还能将很少用的Value进行磁盘存储,有AOF与RDB两种持久化存储方式;
        • 主从模式:Redis支持一主多从,也可以支持多主多从,但memcached利用magent适用于一主多从;
        • 灾难恢复:Redis可以通过从AOF或RDB方式恢复数据,而memcached则不可恢复;
        • 数据大小:Redis的Value最大能支撑1G大小,而memcached最大支撑只有1M;
        • 内存分配:Redis会浪费一定时间去分配内存空间,而memcached则事先就分配好了一定的Page、Slab、Chunk空间;
        • 等等还有很多,就不一一列举了,想了解的更多跟详细,大家可以自行约会度娘问个究竟。
    

    五、下载地址

    https://gitee.com/ylimhhmily/HotFrameLearning.git

    HotFrameLearning交流QQ群: 235322432

    HotFrameLearning交流微信群: 微信沟通群二维码图片链接

    欢迎关注,您的肯定是对我最大的支持!!!

    <上一篇        首页        下一篇>

    相关文章

      网友评论

          本文标题:HotFrameLearning Redis_01_简介

          本文链接:https://www.haomeiwen.com/subject/wviruftx.html