一、redis支持数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。redis
二、redis持久化的两种方式:RDB和AOF后端
RDB持久化是在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操做过程是fork(叉)一个子进程,先将数据集写入临时文件,写入成功后,再替换以前的文件,用二进制压缩存储。缓存
优势:(1)文件备份只有一个文件,容易查找恢复;(2)灾难恢复效率高;安全
缺点:(1)若是在定时持久化前出现宕机,数据将丢失;(2)RDB是经过fork子进程来协助完成持久化,若是数据集较大会致使服务器短期内中止服务bash
AOF持久化以日志的形式记录服务器所处理的每个写、删除操做,查询操做不会记录,以文本的方式记录,能够打开文件看到详细的操做记录。服务器
优势:数据安全性更高,能够配置同步持久化网络
缺点:灾难恢复效率低session
三、缓存穿透、缓存击穿、缓存雪崩及解决方案数据结构
缓存穿透ui
访问一个不存在的key,缓存不起做用,请求会穿透到DB,流量大时DB会挂掉。
解决方案
缓存击穿
一个存在的key,在缓存过时的一刻,同时有大量的请求,这些请求都会击穿到DB,形成瞬时DB请求量大、压力骤增。
解决方案
缓存雪崩
大量的key设置了相同的过时时间,致使在缓存在同一时刻所有失效,形成瞬时DB请求量大、压力骤增,引发雪崩。
解决方案
四、redis 适合的场景
会话缓存(Session Cache)
最经常使用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其余存储(如Memcached)的优点在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,若是用户的购物车信息所有丢失,大部分人都会不高兴的,如今,他们还会这样吗?
幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。
全页缓存(FPC)
除基本的会话token以外,Redis还提供很简便的FPC平台。回到一致性问题,即便重启了Redis实例,由于有磁盘的持久化,用户也不会看到页面加载速度的降低,这是一个极大改进,相似PHP本地FPC。
再次以Magento为例,Magento提供一个插件来使用Redis做为全页缓存后端。
此外,对WordPress的用户来讲,Pantheon有一个很是好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
队列
Reids在内存存储引擎领域的一大优势是提供 list 和 set 操做,这使得Redis能做为一个很好的消息队列平台来使用。Redis做为队列使用的操做,就相似于本地程序语言(如Python)对 list 的 push/pop 操做。
生产者消费者模式简单实现过程:
一、插入数据:
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lpush list 4
(integer) 4
复制代码
二、显示数据:
复制代码
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
复制代码
三、取出数据:
复制代码
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lpop list
"3"
127.0.0.1:6379> lpop list
"2"
127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> lpop list
(nil)
复制代码
排行榜/计数器
Redis在内存中对数字进行递增或递减的操做实现的很是好。集合(Set)和有序集合(Sorted Set)也使得咱们在执行这些操做的时候变的很是简单,Redis只是正好提供了这两种数据结构。
排行榜简单实现过程:
一、设置了4个玩家的分数,若是玩家分数已经存在,则会覆盖以前的分数。
复制代码
127.0.0.1:6379> zadd ph 90 user
(integer) 1
127.0.0.1:6379> zadd ph 80 user1
(integer) 1
127.0.0.1:6379> zadd ph 70 user2
(integer) 1
127.0.0.1:6379> zadd ph 60 user3
(integer) 1
复制代码
二、zscore——查看user2玩家分数
复制代码
127.0.0.1:6379> zscore ph user2
"70"
复制代码
三、zrevrange——按名次查看排行榜
复制代码
127.0.0.1:6379> zrevrange ph 0 -1 withscores
1) "user"
2) "90"
3) "user1"
4) "80"
5) "user2"
6) "70"
7) "user3"
8) "60"
复制代码
四、查询前三名玩家分数。
复制代码
127.0.0.1:6379> zrevrange ph 0 2 withscores
1) "user"
2) "90"
3) "user1"
4) "80"
5) "user2"
6) "70"
复制代码
五、zrevrank——查看玩家的排名,zrevrank是以分数由高到低的排序返回玩家排名(实际返回的是以0开始的索引),对应的zrank则是以分数由低到高的排序返回排名。
复制代码
127.0.0.1:6379> zrevrank ph user2
(integer) 2
127.0.0.1:6379> zrank ph user2
(integer) 1
复制代码
六、zrem——移除某个玩家
复制代码
127.0.0.1:6379> zrem ph user1
(integer) 1
127.0.0.1:6379> zrevrange ph 0 -1 withscores
1) "user"
2) "90"
3) "user2"
4) "70"
5) "user3"
6) "60"
复制代码
七、del——删除排行榜
复制代码
127.0.0.1:6379> del ph
(integer) 1
127.0.0.1:6379> get ph
(nil)
127.0.0.1:6379> zrevrange ph 0 -1 withscores
(empty list or set)
复制代码
发布/订阅
最后(但确定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实很是多。我已看见人们在社交网络链接中使用,还可做为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来创建聊天系统。
"发布/订阅"模式包含两种角色,分别是发布者和订阅者。订阅者能够订阅一个或者多个频道(channel),而发布者能够向指定的频道(channel)发送消息,全部订阅此频道的订阅者都会收到此消息。
发布/订阅模式简单实现过程:
一、订阅频道
复制代码
127.0.0.1:6379> subscribe channel:1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel:1"
3) (integer) 1
复制代码
执行上面命令客户端会进入订阅状态,处于此状态下客户端不能使用除subscribe、unsubscribe、psubscribe和punsubscribe这四个属于"发布/订阅"以外的命令,不然会报错。
进入订阅状态后客户端可能收到3种类型的回复。每种类型的回复都包含3个值,第一个值是消息的类型,根据消类型的不一样,第二个和第三个参数的含义可能不一样。
消息类型的取值多是如下3个:
(1)subscribe。表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个是当前客户端订阅的频道数量。
(2)message。表示接收到的消息,第二个值表示产生消息的频道名称,第三个值是消息的内容。
(3)unsubscribe。表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,当此值为0时客户端会退出订阅状态,以后就能够执行其余非"发布/订阅"模式的命令了。
二、发布消息
复制代码
127.0.0.1:6379> publish channel:1 hi
(integer) 1
127.0.0.1:6379> publish channel:1 nihao
(integer) 1
复制代码
返回值表示订阅此频道的数量
三、订阅者接收消息
复制代码
127.0.0.1:6379> subscribe channel:1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel:1"
3) (integer) 1
1) "message"
2) "channel:1"
3) "hi"
1) "message"
2) "channel:1"
3) "nihao"
复制代码