Redis面试话术

一.Redis基本数据类型

1.String
set get
mset mget
del
incr incrby
decr decrby
strlen append
2.hash
键不可重复 值可重复
hset hget hmset hmget
hsetnx (如果字段以存在则不执行任何指令)
hgetall
hdel (删除1个或多个字段)
hincrby 增加指定整数
hexists 是否存在指定的数据
hlen hash中 数据个数
hkeys hash中所有的key
hvals hash中所有的values
3.list
有序可重复
lpush 从左边添加一个或多个数据
rpush 从右边添加一个或多个数据
lrange 返回指定 开始和结束索引位的片段 结尾是-1 则返回所有数据
blpop 左弹出
brpop 右弹出
llen 返回元素个数
lrem
当count>0时, LREM会从列表左边开始删除。
当count<0时, LREM会从列表后边开始删除。
当count=0时, LREM删除所有值为value的元素。
lindex 返回指定索引位的值
lset设置指定索引的元素值
ltrim 5.3.2.5.3 只保留列表指定片段
linsert 向列表中插入元素 linsert list after 3 4
rpoplpush 将右边第一个元素从一个列表转移到另一个列表中
rpoplpush list newlist
4.set
无序不重复
sadd srem smemers dismembers
sdiff 获取a有b没有的元素
sinter 获取 a b都有的元素
sunion 获取a b 的并集
scard 获取集合中元素的个数
spop 从集合中随机弹出一个元素
5.zset
有序不重复
zadd zadd zsettest 10 apple 9 xiaomi 8 ibm
zscore 获取元素的分数 zscore zsettest apple
zrem 5.5.1.3 删除元素
zrange 正向返回指定返回的集合元素
zrange zsettest 0 -1 WITHSCORES
zrevrange 逆向返回指定返回的集合元素
ZRANK 获取元素的排名  从小到大
zrevrank 获取元素的排名  从大到小
zcard 获取集合中元素的个数

6.其他指令
EXPIRE 设置key的生存时间单位是秒
type 返回值的数据类型
rename 给值重命名
exists 判断指定值是否存在
keys 返回指定格式的所有key

二..Redis的持久化方式

1.Redis默认的持久化方式是Rdb方式,是以快照的方式将数据持久化到磁盘中;
a)其缺点是如果机器宕机那么最后持久化的数据会丢失,
b)如果数据不重要那么这种方式的效率比较高;
c)每个15分钟如果有1次修改操作则进行持久化
d)每个5分钟如果有10次修改操作则行持久化
e)每个1分钟如果有10000次修改操作则进行持久化

2.另一种是Aof持久化方式,这种方式是时时存储因此效率比较低但是数据安全;

三.redis-cluster投票:容错

Redis面试话术_第1张图片
(1)集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过(cluster-node-timeout),认为该master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail)?
如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态。也可以理解成集群的[0-16383]slot映射不完全时进入fail状态。
如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。

四.缓存穿透

所谓缓存穿透就是在我们的业务需求中,需要根据key去redis缓存中查询相关数据,如果对应的value值存在,在我们的逻辑中会将该数据写回redis缓存中,但是也存在一种情况就是value值不存在,这样就需要去数据库中去查询。但是有时候数据库中也没有相关的数据,这样如果该请求并发量大的话,会对数据库造成很大的压力,严重的可能会造成数据库宕机,这就叫做缓存穿透。
如何避免?
在我们的项目中也考虑到了缓存穿透的问题,比如我们的搜索模块,需要根据分类的名称去查询品牌信息,但是有时候如果有用户存在恶意攻击,会发送一个不存在的商品分类名称去redis中查询,这样redis中肯定没有相关的数据,会导致去db中查询,但是db中也没有相关数据,这样导致缓存穿透,我们当时是这么解决的:在db查询后,我们会对查询的结果集合做非空或者空集判断,如果是空集的话,我们会在redis中对应的数据上填写一个空值处理。

五.缓存雪崩(在集群环境下)

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)
(集群+冗余–》有钱)
mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
    相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6种数据淘汰策略:
• volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
• volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
• volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
• alkylurea:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
• allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
• no-enviction(驱逐):禁止驱逐数据

Redis是单进程单线程的
   redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销,也就是说Redis是单进程单线程的;

六.缓存的击穿:

1.什么是缓存的击穿:
执行一个业务的时候,首先查询redis,如果redis没有就去查询MySQL。如果一直没有的话,那这样的请求都会落到MySQL上,导致MySQL挂掉。
2.如何避免缓存的击穿:
1)如果缓存没有命中,MySQL也没有查询到,这时我们就在redis中创建一个key, value为null.
2) 对账程序(spring Quartz)比较MySQL和redis的数据差异

七.SpringDataRedis详解

什么是SpringDataRedis
Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现

八.SprigDataRedis和Jedis的区别和联系

1.SprigDataRedis底层是对Jedis的封装
2.使用时提供了RedisTemplate模板,而Jedis是需要自己写个工具类来封装对Redis的操作

九.如何设置缓存过期时间

redisTemplate.opsForValue().set("article_"+id, article,10,TimeUnit.SECONDS);

你可能感兴趣的:(Redis,java)