-git
一、介绍Redis以前,我有一堆的疑问,Redis是什么?有什么用?它能干什么?有什么特性?能解决咱们平常的哪些问题? 为何要用Redis?Redis好在哪里?除了Redis外还有其余替代方案么? 二、对于还没了解过Redis的童鞋,能够带着这些疑问往下看,而对于了解过Redis的童鞋那就走过路过不要错过^_^。 三、另外目前讨论的版本也是比较新的版本3.x版本;
Redis 是一个开源的基于内存的数据结构化存储媒介,多用于数据库、缓存以及消息代理。 再简言之,Redis 是一个基于内存的 key-value 数据库。
原文地址: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支持多种数据结构,这也是它的亮点所在,除外Redis的单个Value最大限制为1GB,已经远远超过memcached的 1MB的大小限制。下面咱们看看它有哪些数据类型,能干什么用,内部结构是怎么样的。 • strings:字符串类型,最基本的数据类型,一般来存储基本的字段值; • hash:是一个string类型的Field和Value之间的映射表,一般用来存储一个对象中各个Key与Value信息的映射; • lists:元素都是string类型的双向链表,一般用来存储好友列表,粉丝列表,前十首热门歌曲,最新消息排行等; • set:是一个无序的string类型数据的集合,其内部用的是HashMap实现,只是Value都是空的而已,一般用来对数据 作交集、并集、差集等操做,所以就有相似共同好友,共同兴趣等业务数据应运而生; • sortset:有序set,其内部仅仅只是在set基础上新增了一个排序score字段,一般用于具备排序功能的业务数据展现;
Redis 提供了两种持久化方式,一个是RDB(Redis DataBase),另外一个是AOF(Append Only File),至于说谁好谁差 呢?应该说各有所长,然而官网却建议咱们二者结合使用,双保险嘛。 • RDB:就是在不一样的时间点生成的快照文件并存储到硬盘上; • AOF:就是将redis的那些写指令记录下来,目的就是为了下次redis重启时能够快速执行这些指令恢复数据; 不过既然用到Redis存储,我的建议若是你们没有什么特殊的持久化需求的话,彻底不用理会这两种持久化的方式,直接 关闭便可,由于redis原本擅长的领域就是内存数据库,对于持久化存储方面不擅长。
Redis 所谓的主从一方面但是一主有多从,可是另一方面每一个从节点也能够有多个从节点。而这样作的目的其实很简 单,一来是为了提高读的性能,二来也是为了去中心化增长数据冗余备份。一旦主节点挂了,从节点就得立马顶上去。 然而主从之间的同步的思路也是挺简单的,都是slave主动向master发出sync指令,意思就是告诉master,slave须要同 步数据啦。master收到sync后则会调用bgsave指令fork一个子进程来持久化存储master的数据,在master的持久化的这个 短短时间间内,master的write指令则存储到内存中。待master的子进程持久化完成后则将持久化的这个文件发送给slave节点, 待slave接收完成并将数据加载到slave内存中,而后master节点还会将持久化期间缓存的write指令再次发给slave节点。
该发布订阅,和咱们经常使用的MQ发送订阅的模式是同样的,支持订阅单个频道,也支持订阅多个频道,还支持相似正则表 达式同样的模式匹配。
Redis 也拥有本身的一套事务机制,只是这个所谓的事务机制没有关系型数据库那么强大,可是仍是勉强够用,其实Redis 的事务,就是一组命令的集合,MULTI、EXEC、DISCARD 和 WATCH 是 Redis 事务相关的命令。既然是一组命令的执行,那么 Redis给了咱们什么样的保证呢?来保证执行不被其余命令打断或篡改呢? • 保证一:事务是一个单独的隔离操做,全部命令被序列号有序执行; • 保证二:事务是一个原子操做,要么所有执行,要么所有不执行; 然而在实际应用中老是那么差强人意,事务中若是是由于语法错误的话,则是不会提交事务,可是若是是运行时错误的 话,那就完蛋了,全部命令都会被执行,没有回滚机制,难道就没有解救措施了么,这个还真没有,运行时错误是编程时 须要杜绝的,这样的话其实也不存在须要什么回滚操做,一切顺其天然一鼓作气。 固然Redis还提供一个WATCH命令,来防止EXEC执行后发现值被篡改的话,则EXEC也照样返回失败处理;
Lua脚本功能是Reids 2.6版本的最大亮点,经过内嵌对Lua环境的支持,解决了长久以来不能高效地处理CAS命令的缺点, 而且能够经过组合使用多个命令, 轻松实现之前很难实现或者不能高效实现的模式。
回收策略,还有一个变态的辅助帮手,就是客户端每执行一个命令,都会检测内存是否超标,若是超标,果断淘汰。 六种回收策略以下: • noeviction 不回收; • allkeys-lru 从全部键中删除最近最少使用的键; • volatile-lru 从设置了过时时间的键中删除最近最少使用的键; • allkeys-random 从全部键中随机删除; • volatile-random 从设置了过时时间的键中随机删除; • volatile-ttl 从设置了过时时间的键中选择存活时间最短的键删除;
Redis 之因此有着飞同样的读写速度,这还得得益于它的单进程单线程模样的线程模型。通过Redis官网的测试性能结 果达到10W+的QPS。 优秀的线程模型不但简化了代码逻辑,并且也不用考虑并发,也不用考虑各类锁的问题,更不存在多线程切换消耗CPU 的问题了,一切的一切,就是单线程挨个挨个执行。 可是这种线程模型架构也带来必定的问题,牺牲了多核CPU性能,视多核CPU如无物,简直暴殄天物,反过来说,目前 获得你们的方响,也没说redis十分慢,若若是真的遇到了redis十分慢的话,那颇有多是开发者的姿式不对,说不定又 在哪里进行了耗时的操做。
• 速度快,10W+的QPS,并且数据结构相似HashMap查询复杂度低; • 数据结构相对比较丰富,并且存储的Value也相对足够大; • 支持事务,并且还支持Lua脚本进行CAS操做; • 主从复制,支持读写分离,并且还支持RDB与AOF两种持久化方式;
• 不能充分利用多核CPU的硬件优点; • 多主多从模式中,若是某一区域独立的主从同时挂掉且形成哈希槽的部分不可用,那么整个集群将会致使不可用; • 网络波动会形成主从之间会进行全量数据复制,若是快照文件过大,则会给内存带来很是大的压力; • 主从复制若是不在同一局域网,则会给主从复制的性能带来很大的损伤;
• 数据类型: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.gitredis
HotFrameLearning交流QQ群: 235322432数据库
HotFrameLearning交流微信群: 微信沟通群二维码图片连接编程
欢迎关注,您的确定是对我最大的支持!!!segmentfault