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.缓存穿透是指客户端请求的数据再缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。不断发起这样的请求,给数据库带来压力
缓存空对象、布隆过滤、
2.缓存雪崩是指在同一时间段大量的key同时失效或者redis服务器宕机,导致大量请求到达数据库,带来巨大压力。
利用redis集群提高服务的可用性
给缓存业务添加降级限流策略
4.先删后写还是先写后删
先删除缓存再更新数据库 脏读问题:两个线程,一个更新操作,一个查询操作,当更新操作删除数据缓存后,这个时候查询操作没有找到缓存,就从数据库中找到旧数据,并将旧数据写入到缓存中,此时更新操作再把数据库中数据更新,导致数据不一致。脏读。
先更新数据库再删除缓存 脏读几率小:更新和查询,缓存失效,查询操作查询缓存没有,就找到数据库中的旧数据,此时,更新操作来了,删除缓存,并更新数据库,最后查询操作将查询的值缓存到缓存中,出现数据不一致问题。但是几率很小,往往数据库的读操作的速度远快于写操作。
解决:
1)缓存设置过期时间,实现最终一致性;
2)使用 Cannel 等中间件监听 binlog 进行异步更新;
3)通过 2PC 或 Paxos 协议保证一致性。
5.redis如何保证原子性:
https://blog.csdn.net/HiJamesChen/article/details/109382666