新手入门:Redis相关面试题整理

108 阅读5分钟

1. 什么是雪花id,简述雪花id的优缺点?

使用雪花算法生成的一种唯一标识符号,常用于分布式系统,雪花ID具有时间戳、节点标记与序列号,可用于保证其唯一性。优点是全局唯一,通过时间戳能保证ID是按序生成,缺点是容易发生时间回拨,假如系统时间改变,那么雪花ID生成收到干扰,就不唯一了,同时对节点的要求较高,假如节点标识有变动,那么生成的ID也不唯一,容易丢失序列。

2. JWT 和 session 的区别是什么?

JWT也就是Json Web Token,和session都是用于身份认证及识别的机制。通常存储在用户端设备上,而session通常存储在服务器端上,JWT可以携带用户的ID、权限、过期时间等信息,而Session通常只能携带ID,JWT可以实现较多加密方法,相对Session更安全。

3. 简要描述SpringCache的常用注解

@Cacheable:第一次执行时结果缓存起来,后续再执行先查看有没有缓存,如果有就直接用缓存结果,没有再执行。@Cacheput:执行完后把结果放入缓存中。@CacheEvit 删除缓存,每次执行完它注解的方法后,就会执行删除指定的缓存

4. JWT 的优点是什么?

1.安全性,可以使用签名算法进行加密,使数据更安全更完整;2.自包含,服务器端不需要存储用户的任何状态,JWT已经包含了所有信息;3.跨平台可用:JWT使用Json,各个平台和语言的支持性都比较好;3.拓展性强,可以在载荷上自定义信息;4.易于传输,对服务器端低。

5. 简述Redis的持久化策略?

Redis的持久化策略为RDB(Redis Database)和AOF(Append Only File),RDB是隔一段时间就把Redis数据库中的数据给备份到硬盘中,优点是迅速、占用空间小,缺点是假如在这段间隔时间内Redis崩溃了那么数据就丢失了;AOF则是记录所有对原数据的操作,不管是增删改查都及时记录下来,优点是即使Redis崩溃了也可以根据记录重放,逐步复原当前数据库,缺点是每一步都要记录,对于空间占用较大,而且恢复数据库的时间较慢。实际应用中,这两种策略通常结合使用,使得两种方法优点互补,既可以用AOF确保数据可靠性,又可以用RDB来确保数据恢复的速度。

6. 列举Redis的常用数据类型?

String字符串、list列表、hash键值对、set集合、sorted set有序集合。

7. 跨域的常用解决方案?

CORS(Cross-Origin Resource Sharing),跨域资源共享,通常在服务器端设置响应头,使得不同用户可以访问同一源头的数据,http也可以访问。 可以使用@CrossOrigin注解来调用。

8. Redis的数据过期策略?

定时删除、定期删除和惰性删除。定时删除会在创建键的时候设置一个过期时间,当时间到了之后定时器会立刻删除此键,优点是对内存占用较小,内存整体分布较均衡,缺点是定时器会占用一定服务器CPU性能,当设置的定时删除的键过多时,对CPU压力大,而且同一时间删除的键过多时容易发生缓存雪崩,对Redis性能有影响;定期删除是每隔一段时间就扫描数据库,对其中过期的数据进行删除,优点是可以通过设置扫描间隔与删除的量来控制删除数据的频率,降低CPU负载,又不至于像惰性删除一样对长期不用的数据置之不理,缺点是较难把握设置的参数,同时对于已经过期但是还没有执行此策略删除的数据,如果把过期数据返回客户端将会造成事故;惰性删除是在访问该键的缓存时再判断键有没有过期,如果过期就删除重新获取,优点是对Redis性能没有直接影响,缺点时如果不访问该键则缓存一直不删除,长期占用内存,积累多后对于内存性能影响大。

9. redis的缓存雪崩、缓存穿透、缓存击穿分别是什么?以及对应的解决方案?

1.常见于高并发,假如某一时间内过期的缓存过多而访问人数又太多,此时多个访问请求发向mysql数据库查询,对于服务器压力过大。解决方法是设置内存过期时间为随机时间,使得缓存的内存占用较为均匀,避免同一时间过期太多。2.假如某个无效查询,在redis缓存中也没有,就会发向mysql数据库查询,而mysql中也没有,但是也占用了服务器性能。如果同一时间内大量无效查询发向服务器,那么压力就很大了,会影响到其他用户的使用。解放方法是设置一个布隆过滤器,在写入数据的时候就把ID给记录下来,接下来有访问请求的时候先在布隆过滤器中查询是否有对应ID,如果有的话就允许访问,否则就拒绝,这样可以避免大量无效查询对服务器性能造成影响。3.某一数据为热点数据,同一时间大量用户访问该数据,例如秒杀活动或者热门商品列表,如果此时缓存过期了那么大量的访问请求就会发往mysql数据库执行查询,对于服务器压力较大。解决方法是对于热门数据的缓存不要设置过期时间,而是通过后端及时更新数据。