
Redis是什么Redis(Remote Dictionary Server)即远程字典服务。是一个开源的、使用 ANSI C 语言编写的支持网络、可基于内存亦可持久化的键值Key-Value型 NoSQL 数据库。Redis会周期性的把更新的数据写入磁盘或者把修改操作追加的记录文件并且在此基础上实现了master-slave(主从)同步。免费和开源是当下最热门的NoSQL技术之一Redis能干嘛1.内存存储效率高持久化内存中是断电即失所以说持久化很重要rdbaof2.效率高用于高速缓存3.发布订阅系统4.地图信息分析5.计时器计数器浏览量特性1.多样的数据类型2.持久化3.集群4.事务Redis是单线程的Redis 6.0 以前完全单线程网络 IO 命令执行 全部由一个线程处理。为什么单线程还这么快纯内存操作单线程避免了线程切换和锁竞争非阻塞 IO 模型epoll/kqueueRedis 6.0 及以后命令执行依然是单线程网络 IO 采用多线程接收请求、发送数据核心命令处理还是单线程保证原子性、无竞争面试最标准回答直接背Redis 命令执行阶段是单线程的所以不存在线程安全问题Redis 6.0 之后引入了多线程 IO用来提升网络读写效率但核心指令处理依旧是单线程。Redis是C语言写的官方提供的数据为 10W 的QPS。这完全不比 key-value的Memcache差Redis为什么单线程还这么快1.误区1高性能的服务器一定是多线程的2.误区2多线程一定快CPU上下文会切换CPU 内存 硬盘核心redis是将所有的数据全部放在内存中所以说使用单线程去操作效率就是最高的。多线程CPU上下文会切换这是一个耗时的操作对于内存系统来说如果没有上下文切换效率就是最高的。多次读写都是在一个CPU上在内存情况下这个就是最佳的方案。五大数据类型Redis 是一个开源BSD许可的内存中的数据结构存储系统它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构如 字符串strings 散列hashes 列表lists 集合sets 有序集合sorted sets 与范围查询 bitmaps hyperloglogs 和 地理空间geospatial 索引半径查询。 Redis 内置了 复制replicationLUA脚本Lua scripting LRU驱动事件LRU eviction事务transactions 和不同级别的 磁盘持久化persistence 并通过 Redis哨兵Sentinel和自动 分区Cluster提供高可用性high availability。Redis-KeyString 字符串String类型的使用场景value除了我们字符串还可以是我们的数字计数器统计多单位的数量 mset uid:{ID}:{关注量} uid:{ID}:{粉丝量}。。。粉丝数对象缓存存储List 列表在redis里面我们可以list玩成栈堆阻塞队列所有的list命令都是l开头的Redis不区分大小写list 有序可重复他实际上是一个链表 before node after ,left ,right 都可以插入值如果key 不存在创建新的链表如果key存在新增内容如果移除了所有值空链表 便不存在在两边插入或者改动值效率最高中间元素相对来说效率会低一点场景消息排队 消息队列 (Lpush Rpop) 栈Lpush LpopSet 集合set 无序 不重复微博 A用户将所有关注的人放在一个set集合中将他的粉丝也放在一个集合中共同关注共同爱好二度好友推荐好友 六度分割理论Hash 哈希Map集合 key-map只是这个值是一个map集合本质和String 类型没有太大区别还是一个简单的key-value!hash变更的数据user name age,尤其是用户信息之类的经常变动的信息hash更适合于对象存储String更加适合字符Zset 有序集合在set的基础上增加了一个值。set k1 v1zset k1 score1 v1案例思路set排序 存储班级成绩表工资表排序普通消息-1 重要消息-2 带权重进行判断排行榜应用实现取Top N测试三种特殊数据类型geospatial 地理位置朋友的定位附近的人打车距离计算Redis的Geo在Redis3.0版本就推出了这个功能可以推算地理位置的信息两地之间的距离方圆几里的人hypeloglog 可以统计基数什么是基数A{1,3,5,7,8,7}B{1,3,5,7,8}基数不重复的元素的个数 5 可以接受误差简介Redis2.8.9版本更新了Hyperloglog数据结构Redis Hyperloglog基数统计的算法优点占用的内存是固定2^64不同的元素的基数只需要费12KB的内存如果要从内存角度比较的话Hyperloglog首选bitmaps 位存储统计用户信息活跃不活跃登录未登录打开未打卡!两个状态的都可以使用bitMapsBitmaps位图数据结构都是操作二进制进行记录就只有0和1两个状态365天365bit 1字节8bit 46个字节左右。Redis持久化Redis是内存数据库如果不将内存中的数据保存到磁盘中那么一旦服务的进程退出服务的数据库状态也会消息。所以Redis提供了持久化功能RDBRedis DataBase什么是RDB在主从复制中rdb就是备用的在从机上面在指定的时间间隔内将内存中的数据集快照写入磁盘也就是Snapshot快照它恢复时是将快照文件直接读到内存中。Redis会单独创建fork一个子进程来行持久化会将数据写入到一个临时文件中待持久化过程都结束了再用这个临时文件替换上次持久化好的文件。整个过程中主进程不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复且对于数据恢复的完整性不是非常敏感那么RDB方式要比AOF方式更加高效。RDB的缺点是最后一次持久化后的数据可能丢失。默认都是RDB。触发机制1.save的规则满足情况下会自动触发rbd规则2.执行flushall命令也会触发我们的rdb规则3.退出redis,也会产生rdb文件4.备份就会自动生成一个dump.rdb如何恢复rdb文件1.只需要将rdb文件放在我们redis启动目录就可以redis启动的时候会自动检查dump.rdb文件恢复其中的数据优点1.适合大规模的数据恢复2.对数据的完整性要求不高缺点1.需要一定的时间间隔进行操作如果redis意外宕机了这个最后一次修改的数据就没有了。2.fork进程的时候会占用一定的内存空间。AOF (Append only File)将我们的所有命令都记录下来history,恢复的时候就把这个文件全部再执行一遍以日志的形式来记录每一个写操作将Redis执行过得所有指令记录下来读操作不记录之追加文件但不可以改写文件redis启动之初会读取改文件重新构建数据换言之redis重启的话就会根据日志文件的内容将与指令从前到后执行一次已完成数据的恢复工作。Aof保存的是appendonly.aof文件默认是不开启的需要手动配置我们只需要将reids配置文件中的appendonly改为yes就开启了aof!重启redis就可以生效了重写规则说明aof默认就是文件的无限追加文件会越来越大!优点1.每一次修改都同步文件的完整会更加好2.每秒同步一次可能会丢失一秒的数据3.从不同步效率最高缺点1.相对于数据文件来说aof远远大于rdb,修复的速度也比rdb慢2.Aof运行效率也要比rdb慢所以我们redis默认配置是rdb补充1.RDB持久化方式能够在指定的时间间隔内对你的数据进行快照存储2.AOF持久化方式记录每次对服务器写的操作当服务器重启的时候就会重新执行这些命令来恢复原始的数据AOF命令以Redis协议追加保存每次写的操作到文件末尾Redis还能对AOF文件进行后台重写使得AOF文件的体积不至于过大。3.只做缓存如果你希望你的数据在服务器运行时候存在可以不使用任何持久化4.同时开启两种持久化方式在这种情况下当redis重启的时候会优先载入AOF文件来恢复原始的数据因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据要完整。RDB的数据不实时同时使用两者时服务器重启也只会找AOF文件那要不要只是用AOF?建议不要因为RDB更适合用于备份数据库AOF在不断变化不好备份快速重启而且不会有AOF可能潜在的Bug,留着作为万一的手段。5.性能的建议因为RDB文件只用作后备用途建议只在Slave上持久化RDB文件并且只要15分钟备份一次就够了。只保留save 900 1 这个规则。如果Enable Aof ,好处是在最恶劣的情况下也只会丢失不超过两秒数据启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的只要硬盘许可应该尽量减少AOF rewrite的频率。AOF重写的基础默认值为64M,太小了可以设置为5G以上。、如果不Enable Aof .仅靠Master-Slave Repllcation实现高可用也可以能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉(断电)可能会丢失十几分钟的数据启动脚本也要比较两个Master/Slave中的RDB文件载入较新的那个微博就是这种架构。