redis题库

Redis常见题库

redis是什么

Redis是一非关系性数据库,基于内存高速缓存数据库,使用C语言编写,Redis是一个key-value存储系统,
支持五种数据类型,String、list、set、zset、hash
常被用做缓存来提高项目查询的效率

redis的特点

1:主要特点是redis基于内存,效率高,速度快
2:支持事务管理
2:redis可以支持数据持久化
3:而且支持多种语言集成
4:也可以配置主从复用
5:可以使用自带哨兵机制来实现高可用

为什么使用redis

解决应用服务器的cpu和内存压力
减少io的读操作,减轻io的压力
关系型数据库的扩展性不强,难以改变表结构

redis使用场景

1:适用于海量数据的读写,对于热点数据的缓存 【查询多,更新少】
2:Redis提供的有序集合数据类构能实现各种复杂的 排行榜应用
3:使用redis 充当计数器【商品的浏览量,视频播放次数】这些数据如果每次更新数据库,对于数据库压力太大
【Redis提供的incr命令来实现计数器】
4:点赞、好友等相互关系的存储等功能【还有订阅、队列、延时操作、分布式锁等等。。。】

关系型数据库和非关系型数据库

什么是关系型数据库

采用关系模型来组织数据的数据库,关系模型就是二维表格模型。一张二维表的表名就是关
系,二维表中的一行就是一条记录,二维表中的一列就是一个字段

什么是非关系型数据库

非关系型,分布式,一般不保证遵循ACID原则的数据存储系统。
分关系型数据库一般分为四类
文档型数据库 ,kv键值对数据库,图数据库,列表数据库
redis属于键值对类型数据库

非关系型数据库优缺点

优点:
根据需要添加字段,不需要多表联查。仅需id取出对应的value
适用于SNS(社会化网络服务软件。比如facebook,微博)
严格上讲不是一种数据库,而是一种数据结构化存储方法的集合
缺点:
只适合存储一些较为简单的数据
不合适复杂查询的数据
不合适持久存储海量数据

redis的主从复用

redis进行读写分离
redis支持主从复用。数据可以从主服务器向任意数量的服务器同步,同步使用的是发布/订阅机制
【Mater Slave的模式,从Slave向Master发起SYNC命令】
从服务器下还可以拥有从服务器

聊一下redis的哨兵模式

Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,哨兵会对redis服务器进行监控,
当一个哨兵发现某一个redis服务器宕机后,后通知其他哨兵一起监控,如果一半以上的哨兵认为此服务器宕机,可以通过api通知管理员,
如果宕机的是一个主服务器,那么哨兵会进行一个选举,如果超过规定时间没有选举出来一个主服务器,就会放弃本次选举,等待选举出来一个服务器作为主服务器
当上一个redis主服务器修复好或者重启后,会作为从服务器继续进行工作

缓存穿透、缓存击穿、缓存雪崩的区别

1:缓存穿透:是指访问者传递了一个缓存和数据库中都不存在的id,这样会造成每次缓存都不命中数据,去访问db数据库,造成穿透
2:缓存击穿:是指在某个热点数据失效后,大量访问这个热点数据的请求都会落在db数据库上,会造成数据库压力过大【一般不会造成数据库宕机】
3:缓存雪崩:是指大量缓存的信息在某一个时间段集体失效过期,会造成大量的缓存击穿现象,所有请求落在db数据库上,引起db数据库压力过大,可能造成数据库宕机

缓存穿透解决方案

1:将数据库查询为空的解决集也存放在缓存中,设置过期时间短一点
2:利用setnx做一个互斥锁

//大量用户查询这个key值,key相同
public String get(key) {
	//在缓存中获取这个key
      String value = redis.get(key);
      //如果这个key不存在
      if (value == null) {
          //使用setnx【key不存在就设置成功,存在就设置失败】去设置一个之前不存在的key【后面的线程访问这个key就存在,这个key模拟的互斥锁,在一个线程进来后,其他线程进不去,就无法访问数据库】
          //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
      if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表设置成功
               value = db.get(key);//从数据库中获取此数据 并设置到缓存中
                      redis.set(key, value, expire_secs);
                      redis.del(key_mutex);//删除这个之前不存在的key
              } else { 
               //其他线程进不去,就其中在这里等待一会,目的是为了给刚刚去数据库的线程一点时间,将数据放在缓存中
                      sleep(50);
                      //刚刚去查询数据库的线程将数据放在缓存中,这时候在重新进入本方法,传递key查询
                      get(key);  
              }
          } else {
          //如果缓存中查询到内容,就返回
              return value;      
          }
 }

缓存击穿解决方案

1:利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试【这个互斥锁请研究上面代码】
2:如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒

缓存雪崩解决方案

1:设置热点数据永远不过期
2:给缓存的失效时间,加上一个随机值,避免集体失效。如果Redis是集群部署,将热点数据
均匀分布在不同的Redis库中也能避免全部失效的问题
3:双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时
间。自己做缓存预热操作。然后细分以下几个小点

3.1. 从缓存A读数据库,有则直接返回
3.2. A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。
3.3. 更新线程同时更新缓存A和缓存B。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、什么是 Redis? 2、Redis 相比 memcached 有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 的全称是什么? 6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些方案? 11、Redis 集群方案什么情况下会导致整个集群不可用? 12、MySQL 里有 2000w 数据,Redis 中只存 20w 的数据, 如何保证 Redis 中的数据都是热点数据? 13、Redis 有哪些适合的场景? 14、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 15、RedisRedisson 有什么关系? 16、Jedis 与 Redisson 对比有什么优缺点? 17、Redis 如何设置密码及验证密码? 18、说说 Redis 哈希槽的概念? 19、Redis 集群的主从复制模型是怎样的? 20、Redis 集群会有写操作丢失吗?为什么? 21、Redis 集群之间是如何复制的? 22、Redis 集群最大节点个数是多少? 23、Redis 集群如何选择数据库? 24、怎么测试 Redis 的连通性? 25、Redis 中的管道有什么用? 26、怎么理解 Redis 事务? 27、Redis 事务相关的命令有哪几个? 28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、Redis 回收进程如何工作的? 31、Redis 回收使用的是什么算法? 32、Redis 如何做大量数据插入? 33、为什么要做 Redis 分区? 34、你知道有哪些 Redis 分区实现方案? 35、Redis 分区有什么缺点? 36、Redis 持久化数据和缓存怎么做扩容? 37、分布式 Redis 是前期做还是后期规模上来了再做好?为 什么? 38、Twemproxy 是什么? 39、支持一致性哈希的客户端有哪些? 40、Redis 与其他 key-value 存储有什么不同? 41、Redis 的内存占用情况怎么样? 42、都有哪些办法可以降低 Redis 的内存使用情况呢? 43、查看 Redis 使用情况及状态信息用什么命令? 44、Redis 的内存用完了会发生什么? 45、Redis 是单线程的,如何提高多核 CPU 的利用率? 46、一个 Redis 实例最多能存放多少的 keys?List、Set、 Sorted Set 他们最多能存放多少元素? 47、Redis 常见性能问题和解决方案? 48、Redis 提供了哪几种持久化方式? 49、如何选择合适的持久化方式? 50、修改配置不重启 Redis 会实时生效吗?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值