[TOC]redis
redis是一种基于键值对(key-value)数据库,其中value能够为string、hash、list、set、zset等多种数据结构,能够知足不少应用场景。还提供了键过时,发布订阅,事务,流水线,等附加功能 sql
字符串类型是redis最基础的数据结构,首先键是字符串类型,并且其余几种结构都是在字符串类型基础上构建的,因此字符串类型能为其余四种数据结构的学习尊定基础。mongodb
字符串类型实际上能够是字符串(简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频)),但最大不能超过512M。数据库
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
复制代码
缓存功能:字符串最经典的使用场景,redis最为缓存层,Mysql做为储存层,绝大部分请求数据都是 redis中获取,因为redis具备支撑高并发特性,因此缓存一般能起到加速读写和下降 后端压力的做用。json
计数器:许多运用都会使用redis做为计数的基础工具,他能够实现快速计数、查询缓存的功能, 同时数据能够一步落地到其余的数据源。如:视频播放数系统就是使用redis做为视频播放数计数的基础组件。后端
共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不一样服务器上, 用户刷新一次访问可能会须要从新登陆,为避免这个问题能够用redis将用户session集中管理, 在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登陆信息都直接从redis中集中获取。缓存
限速:处于安全考虑,每次进行登陆时让用户输入手机验证码,为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率。安全
在redis中哈希类型是指键自己又是一种键值对结构,如value={{field1,value1},......{fieldN,valueN}} 。bash
Redis hash 是一个键值(key=>value)对集合。服务器
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
每一个 hash 能够存储 232 -1 键值对(40多亿)
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"
复制代码
哈希结构相对于字符串序列化缓存信息更加直观,而且在更新操做上更加便捷。因此经常用于用户信息等管理,可是哈希类型和关系型数据库有所不一样,哈希类型是稀疏的,而关系型数据库是彻底结构化的,关系型数据库能够作复杂的关系查询,而redis去模拟关系型复杂查询,开发困难,维护成本高。
列表类型是用来储存多个有序的字符串,列表中的每一个字符串成为元素(element),一个列表最多能够储存 2的32次方-1个元素,在redis中,能够队列表两端插入(pubsh)和弹出(pop),还能够获取指定范围的元素列表、获取指定索引下表的元素等,列表是一种比较灵活的数据结构,它能够充当栈和队列的角色,实际开发中有不少应用场景。
列表最多可存储 232 - 1 元素 (4294967295, 每一个列表可存储40多亿)。
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
复制代码
消息对列: redis的lpush+brpop命令组合便可实现阻塞队列,生产者客户端是用lupsh从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性
文章列表:每一个用户都有属于本身的文章列表,如今须要分页展现文章列表,此时能够考虑使用列表,列表不但有序,同时支持按照索引范围获取元素。
使用技巧:
集合类型也是用来保存多个字符串的元素,但和列表不一样的是集合中不容许有重复的元素,而且集合中的元素是无序的,不能经过索引下标获取元素,redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,并合理的使用好集合类型,能在实际开发中解决不少实际问题。
集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1(4294967295, 每一个集合可存储40多亿个成员)。
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabitmq"
3) "mongodb"
复制代码
标签(tag):集合类型比较典型的使用场景,如一个用户对娱乐、体育比较感兴趣,另外一个可能对新闻感兴 趣,这些兴趣就是标签,有了这些数据就能够获得同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。(用户和标签的关系维护应该放在一个事物内执行,防止部分命令失败形成数据不一致)
其余
sadd=tagging(标签)
spop/srandmember=random item(生成随机数,好比抽奖)
sadd+sinter=social Graph(社交需求)
有序集合和集合有着必然的联系,他保留了集合不能有重复成员的特性,但不一样得是,有序集合中的元素是能够排序的,可是它和列表的使用索引下标做为排序依据不一样的是,它给每一个元素设置一个分数,做为排序的依据。(有序集合中的元素不能够重复,可是csore能够重复,就和一个班里的同窗学号不能重复,但考试成绩能够相同)。
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
复制代码
排行榜:有序集合经典使用场景。例如视频网站须要对用户上传的视频作排行榜,榜单维护多是多方面:按照时间、按照播放量、按照得到的赞数等。
redis提供了“发布、订阅”模式的消息机制,其中消息订阅者与发布者不直接通讯,发布者向指定的频道(channel)发布消息,订阅该频道的每一个客户端均可以接收到消息。
redis主要提供发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅。
publish channel:test "hello world 复制代码
subscrible channel:test
复制代码
pubsub numsub channel:test
复制代码
unsubscribe channel:test
复制代码
psubscribe ch*
punsubscribe ch*
复制代码
redis是一个支持持久化的内存数据库,也就是说redis须要常常将内存中的数据同步到磁盘来保证持久化,持久化能够避免因进程退出而形成数据丢失。
RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发。
save命令:阻塞当前Redis,直到RDB持久化过程完成为止,若内存实例比较大会形成长时间阻塞,线上环境不建议用它.
bgsave命令:redis进程执行fork操做建立子线程,由子线程完成持久化,阻塞时间很短(微秒级),是save的优化,在执行redis-cli shutdown关闭redis服务时,若是没有开启AOF持久化,自动执行bgsave
针对RDB不适合实时持久化,redis提供了AOF持久化方式来解决 开启:redis.conf设置:appendonly yes (默认不开启,为no) 默认文件名:appendfilename "appendonly.aof"
运行流程示意图以下:
config set dir /usr/local # 将dump.rd 保存到/usr/local/目录下
复制代码
bgsave
复制代码
将dump.rdb放到redis安装目录与redis.conf同级目录,重启redis便可
优势:
1.压缩后的二进制文,适用于备份、全量复制,用于灾难恢复
2.载RDB恢复数据远快于AOF方式
缺点:
1.没法作到实时持久化,每次都要建立子进程,频繁操做成本太高
2.保存后的二进制文件,存在老版本不兼容新版本rdb文件的问题.
针对RDB不适合实时持久化,redis提供了AOF持久化方式来解决
redis.conf设置:appendonly yes (默认不开启,为no)
默认文件名:appendfilename "appendonly.aof"
1.全部的写入命令(set hset)会append追加到aof_buf缓冲区中
2.AOF缓冲区向硬盘作sync同步
3.随着AOF文件愈来愈大,需按期对AOF文件rewrite重写,达到压缩
4.当redis服务重启,可load加载AOF文件进行恢复
appendonly yes //启用aof持久化方式
#appendfsync always //每收到写命令就当即强制写入磁盘,最慢的,可是保证彻底的持久化,不推荐使用
appendfsync everysec //每秒强制写入磁盘一次,性能和持久化方面作了折中,推荐
#appendfsync no //彻底依赖os,性能最好,持久化没保证(操做系统自身的同步)
no-appendfsync-on-rewrite yes //正在导出rdb快照的过程当中,要不要中止同步aof
auto-aof-rewrite-percentage 100 //aof文件大小比起上次重写时的大小,增加率100%时,重写
auto-aof-rewrite-min-size 64mb //aof文件,至少超过64M时,重写
复制代码
1.设置appendonly yes
2.将appendonly.aof放到dir参数指定的目录
3.启动Redis,Redis会自动加载appendonly.aof文件
1.当AOF和RDB文件同时存在时,优先加载AOF
2.若关闭了AOF,加载RDB文件
3.加载AOF/RDB成功,redis重启成功
4.AOF/RDB存在错误,启动失败打印错误信息![]()