redis有关面试题1

redis的特点:

  redis本质上是一个key-value类型的内存数据库,整个数据库系统加载在内存当中操作,定期通过异步操作把数据库数据flash硬盘上进行保存。因为是纯内存操作,redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知的最快的key-value数据库。redis出色的不仅仅是性能,还支持保存多种数据结构,并且单个value可以存储的最大限制是1GB,另外redis还可以对key-value设置过期时间

  缺点是:数据库容易收到物理内存的限制,不能做海量数据的高性能读写,只适用于较小数据量的高性能操作何运算的场景。

 

1.redis为什么这么快

  基于内存

  单线程减少上下文切换,同时保证原子性

  使用多路I/O复用模型,非阻塞IO; 

  多种数据结构(hash、跳表等)

 

2.为什么使用单线程

  因为 Redis 是基于内存的操作,CPU 不会成为 Redis 的瓶颈,而最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。

 

3.redis缓存三大问题

  1.缓存穿透是指客户端请求的数据再缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。不断发起这样的请求,给数据库带来压力

    缓存空对象、布隆过滤、 增强id的复杂度,避免被猜测id规律  

    做好数据的基础格式校验、加强用户权限校验、做好热点参数的限流

  2.缓存雪崩是指在同一时间段大量的key同时失效或者redis服务器宕机,导致大量请求到达数据库,带来巨大压力。

    给不同的key的TTL添加随机值

    利用redis集群提高服务的可用性

    给缓存业务添加降级限流策略

    给业务添加多级缓存

  3.缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务比较复杂的key突然失效,无数的请求访问会在瞬间给数据库带来巨大的冲击

    逻辑过期

    互斥锁

 

4.先删后写还是先写后删

  先删除缓存再更新数据库 脏读问题:两个线程,一个更新操作,一个查询操作,当更新操作删除数据缓存后,这个时候查询操作没有找到缓存,就从数据库中找到旧数据,并将旧数据写入到缓存中,此时更新操作再把数据库中数据更新,导致数据不一致。脏读。

  先更新数据库再删除缓存  脏读几率小:更新和查询,缓存失效,查询操作查询缓存没有,就找到数据库中的旧数据,此时,更新操作来了,删除缓存,并更新数据库,最后查询操作将查询的值缓存到缓存中,出现数据不一致问题。但是几率很小,往往数据库的读操作的速度远快于写操作。

解决:

1)缓存设置过期时间,实现最终一致性;

2)使用 Cannel 等中间件监听 binlog 进行异步更新;

3)通过 2PC 或 Paxos 协议保证一致性。

 

5.redis如何保证原子性:

https://blog.csdn.net/HiJamesChen/article/details/109382666

posted @ 2023-03-01 17:53  一个苦逼的23届毕业生  阅读(9)  评论(0编辑  收藏  举报