1、Redis为什么快
每秒10万+的QPS。
完全基于内存,绝大部分请求是纯粹的内存操作。
数据结构简单,对数据操作也简单。
采用单线程,避免不必要的上下文切换和竞争。
使用多路I/O复用模型。
底层实现方式以及与客户端之间通信的应用协议不一样,Redistribution自己构建了VM机制
2、Redis常用结构及其应用场景。
String:计数器、缓存、验证码、登录信息
list:关注列表、粉丝列表
hash:存储多个用户信息、队列秒杀。
set:排重、关注列表。
sorted Set(Zset):排序、排行。
3、Redis常用命令
String:set key value:将单个字符值关联到key,存储value。
get key : 返回key对应的value。
mset key value key value:设置多个键值对。
incr key :将key中存储的数字加一。
decr key :key值减一。
incrby key number:key值+number。
decrby key number:key值-number。
setex key seconds value:给key-value设置过期时间。
getset key value:给key设置值,返回key以前的值。
set :sadd key value value:将多个元素加入到集合key中,值不重复。
smembers key:返回集合key中所有元素。
srem key member:移除集合key中多个member元素。
scard key:返回key的基数。
sdiff key[key。。]:返回集合与给定集合的差集。
sismember key member:判断key集合中是否包含member元素。
list :lpush key value value:将多个值从表右边添加到集合key中。
rpush key value value:将多个值从表左边添加到集合key中。
lrange key start stop:查询start到stop之间的数据。stop为-1查询所有。
lpop key:移除最左边元素
rpop key:移除最右边元素
lrem key count value:移除列表key中第count个value。
count:正数:左边开始;0:所有;负数:右边开始
zset :zadd key zs 150 ls 160:有序集合key中,zs为150,ls为160的。
zcard key:返回key中元素的个数。
zcount key min max:返回集合key中在max到min之间的元素。
zpopmax key [count] :删除key中最高分数前count个元素。默认1可不写。
zpopmin key [count]:同上,删除的是最低分数。
zrank key member:返回member在集合key中从小到大的排名。
zrevrank key member:同上,从大到小。
hash :hset key field value:给key设置field、value键值对
hget key field:获取key中建为name的值。
hmset key field value field value:给集合key设置两个键值对
hmget key field filed:获取集合key中两个field建的值。
hkeys key:返回key所有值中的key
hvals key:返回key所有值中的值
hgetall key:返回key中所有键值对。
4、如何Redis数据防止丢失
通过Redis持久化,把内存中的数据和命令保存到磁盘中做备份。当Redis宕机,重启服务后可以从磁盘中的备份恢复数据。
5、持久化是什么。有几种方式
持久化:将内存中的数据备份到磁盘的过程。
方式:AOF、RDB。通过配置redis.conf进行配置。
6、AOF、RDB。
AOF:记录写命令。格式清晰、容易理解、数据更安全,采用append模式,即使持久化过程中宕机,也不会引起数据丢失。文件体积大,恢复慢。
RDB:记录数据快照。文件体积小,恢复速度快。因为他每隔一段时间保存一次,所以可能会丢失数据。
7、Redis淘汰策略
volatile-lru:从已设置过期时间的数据里面挑选使用最少的数据
volatile-ttl:从已设置过期时间的数据里面挑选将要过期的数据
volatile-random:从已设置过期时间的数据里面随机挑选
allkeys-lru:从数据中挑选最少使用的数据
allkeys-random:随机挑选
no-enviction:不使用淘汰。
8、Redis事务
基于commands队列,没开启事务command直接执行提交、开启事务后command则进入排队状态,依次执行。不满足原子性,成功操作不会回滚,失败不影响后续执行。
9、Redis如何实现一对多发消息
发布订阅实现:订阅者通过SUBSCRIBE channel命令订阅某个频道,发布者通过publish channel message向该频道发送消息,则该频道所有订阅者都可以收到消息。
10、数据库和Redis的数据一致性怎么做的
在修改数据库后,直接删除Redis中的数据,重新从数据库获取最新的数据
阿里的canal:canal模拟MySQL Slave的交互协议向MySQL master发送dump请求。master接收到请求后返回binLog日志给slave(这里的slave只canal)canal解析接收到的binlog对象。
11、缓存击穿,穿透,雪崩
击穿:缓存中没有但是数据库有的数据(一般只缓存到期)
解决:1、设置热点数据不过期
2、互斥锁。在缓存失效时,就对当前key进行枷锁,去数据库查,并赋值给这个key,操作成功后释放锁。
3、接口限流熔断、降级
穿透:用户不断请求缓存和数据库都没有数据。
解决:1、对用户权限进行校验、对id进行基础校验
2、对没有值的key做空处理。缓存有效期设短。
雪崩:缓存中数据大量过期,而数据查询量大。引起数据库压力大甚至宕机
解决:1、数据过期时间不要设在一起
2、可以的话把缓存搞到不同数据库
3、设置热点数据吧过期