-
Redis的优点和缺点? redis有哪些类型?
Redis的优点
性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
丰富的数据类型 – Redis支持 String, List, Hash, Set 及 sorted set 数据类型。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis的缺点
是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis五大数据类型 String, List, Hash, Set 及 sorted set 数据类型
-
redis String类型有哪些常用命令?列举4个
赋值语法:
SET KEY_NAME VALUE: (说明:多次设置name会覆盖) (Redis SET 命令用于设置给定 key 的值。如果 key 已经存储值, SET 就覆写旧值,且无视类型)
命令:
SETNX key1 value:(not exist) 如果key1不存在,则设值 并返回1。如果key1存在,则不设值并返回0;(解决分布式锁 方案之一,只有在 key 不存在时设置 key 的值。Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值)
SETEX key1 10 lx :(expired) 设置key1的值为lx,过期时间为10秒,10秒后key1清除(key也清除)
SETRANGE string range value: 替换字符串
取值语法:
GET KEY_NAME :Redis GET命令用于获取指定 key 的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。
GETRANGE key start end :用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)
GETBIT key offset :对 key 所储存的字符串值,获取指定偏移量上的位(bit)
GETSET语法: GETSET KEY_NAME VALUE :Getset 命令用于设置指定 key 的值,并返回 key 的旧值,当 key 不存在时,返回 nil
STRLEN key :返回 key 所储存的字符串值的长度
删值语法:
DEL KEY_Name :删除指定的KEY,如果存在,返回值数字类型。
-
redis String类型有哪些应用场景?列举4个
1、验证码:
2、缓存功能:String字符串是最常用的数据类型,不仅仅是redis,各个语言都是最基本类型,因此,利用redis作为缓存,配合其它数据库作为存储层,利用redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。
3、计数器:许多系统都会使用redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。
4、bitmap位图:可广泛用于,签到、活跃、打卡等场景统计。
5、分布式锁
-
redis Hash类型有哪些常用命令?列举4个
赋值语法:
HSET KEY FIELD VALUE :为指定的KEY,设定FILD/VALUE
HMSET KEY FIELD VALUE [FIELD1,VALUE1]…… :同时将多个 field-value (域-值)对设置到哈希表 key 中。
取值语法:
HGET KEY FIELD :获取存储在HASH中的值,根据FIELD得到VALUE
HMGET KEY field[field1] :获取key所有给定字段的值
HGETALL KEY :返回HASH表中所有的字段和值
HKEYS KEY :获取所有哈希表中的字段
HLEN KEY :获取哈希表中字段的数量
删除语法:
HDEL KEY field1[field2] :删除一个或多个HASH表字段
-
redis Hash类型有哪些应用场景?列举2个
- 购物车:以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素
- 存储对象:hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象
-
描述什么是缓存穿透及解决方案
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
持久层查询不到就缓存空结果,查询时先判断缓存中是否exists(key) ,如果有直接返回空,没有则查询后返回,
注意insert时需清除查询的key,否则即便DB中有值也查询不到(当然也可以设置空缓存的过期时间)
1、不管数据实际上存不存在,我们都把这个键存到缓存中(有效期设置的短一些,比如一分钟到三分钟),然后值设置为一个特定值,业务中如果获取到的结果是这个特定值,则报错返回。
2、是使用 redis 的布隆过滤器(Bloom Filter),将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
-
描述什么是缓存雪崩及解决方案
雪崩:缓存大量失效的时候,发生大量的缓存穿透, 引发大量查询数据库。
解决办法:
缓存预热(手动走一遍) 用锁/分布式锁或者队列串行访问 缓存失效时间均匀分布
-
描述什么是热点key及解决方案
缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求到数据库,这时,大并发量可能直接将数据库给挂掉。
热点key:某个key访问非常频繁,当key失效的时候有大量线程来构建缓存,导致负载增加,系统崩溃
1 监控告警平台
2 使用锁,单机用synchronized,lock等,分布式用分布式锁。
3 缓存过期时间不设置,而是设置在key对应的value里。如果检测到存的时间超过过期时间则异步更新缓存。
4 在value设置一个比过期时间t0小的过期时间值t1,当t1过期的时候,延长t1并做更新缓存操作。
5 设置标签缓存,标签缓存设置过期时间,标签缓存过期后,需异步地更新实际缓存
-
描述下Redis集群的特点、容错性解决方案
1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护
5、Redis集群预分好16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时, redis 先对key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节
什么时候判断master不可用?
投票机制。投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.
-
什么情况下Redis整个集群会不可用
如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态. 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.