redis简介:
memcache :
1:支持简单数据类型
2:不支持数据磁盘持久化
3:不支持分片
4:不支持主从
redis:
1:数据类型丰富
2:支持数据磁盘持久化:RDB,AOF
3:支持分片
4:支持主从
为什么redis这么快?
1:完全基于内存的,绝大部分请求是纯粹的内存操作,执行效率高
2:数据结构简单,对数据操作也简单
3:采用单线程,避免了频繁对上下文切换和锁竞争(单线程是指处理一个网络请求的时候采用单 线程来处理,一个redis sevice执行时肯定不是单线程,例如做数据持久化的时候)
4:使用多路I/O复用,非阻塞I/O
redis的基本数据类型操作指令:
String :最基本的数据类型,二进制安全
设置 set key value 获取 get key
hash :String 元素组成的字典,适合存储对象
hmset lilei name "haha" age 27 title "hehe"
hget lilei nage
list :列表,按照String插入元素排序
lpush mylist aaa
lrange mylist 0 10
set:String 元素组成的无序集合,通过hash表实现,不允许重复
sadd myset 111
smembers myset
Sorted Set:通过分数来为集合中的元素进行从小到大的排序
zadd myset 3 abc
zrangebyscore myset 0 10
如何从海量的key中的查询固定前缀的key
keys:keys指令一次性返还所有匹配的key。如果key的数量大会使服务卡顿
keys pattern : keys k1
dbsize: 查看keys的数量
scan指令
scan cursor match pattern count number
scan 0 match k1* count 10
如何通过redis 实现分布式锁
setnx key value
exprie key time
实现分布式 :set key value ex 10 nx
如何通过redis实现异步队列?
通过list 使用rpush生产消息,lpop消费消息
rpush myrabbitmq aaa
缺点:没有等待队列里面有值就去消费,可以通过在应用层引入sleep机制去调用lpop去重试
优化:blpop myrabbitmq 30 (等待myrabbitmq这个key 30秒 )
缺点:只能让一个消费者消费,消费后就没了
优化:使用pub/sub主题订阅模式
pub发送消息,sub消费消息
subscribe mytopic :订阅主题为mytopic的消息
publish mytopic "hello" :发布主题为mytopic的消息
缺点:消息的状态是无状态的并且消息是即发即收的,当发布消息的时候某台服务器刚好下线就收不到该消息了
redis 持久化
RDB 持久化
redis重启后会去加载对应的redis.conf文件,对应的同步指令有save命令
save 900 1 :当900秒内有一条写入操作,则进行一次同步(阻塞主进程)
stop-writes-on-bgsave-error yes :当备份进程出错的时候,主进程就停止接受新的写入操作了
bgsave:fork出一个子现场来进行创建rdb文件,不阻塞服务器进程
lastsave:上次执行save指令的时间
pipeline