redis

1、redis数据结构

string, list, set, SortSet, hash

HyperLogLog:适用于基数体积很大的统计

Geo:用于坐标,显示周边信息

发布/订阅

2、击穿/穿透/雪崩
缓存击穿

在缓存过期的时刻,同时有大量请求达到DB,对DB造成请求大,压力大。

  • 设置热点数据永不过期
  • 互斥锁。如果为null,加锁,设置值之后释放锁
缓存穿透

查询一个不存在的数据,一直请求。比如id=0的数据。

  • 布隆过滤器
  • 设置key对应的value=null
缓存雪崩

大量的key设置了相同的缓存时间,在同一时间失效,造成瞬间DB的大量请求,压力骤增,引发雪崩。

  • 过期时间随机
分析:

以上三种情况,实际归根结底,都是redis无数据,给DB造成压力。

3、redis分布式锁

使用setnx获取锁,再使用expire加一个过期时间,以防没有释放,造成堵塞。并同时将setnxexpire合并成一条指令,防止setnx执行完毕,expire未执行造成堵塞。

4、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?

使用keys 命令查找具有相同开头的数据。

由于redis是单线程的,所以如果是线上的数据,keys命令会造成停顿。需要加上scan命令,这样可以无阻塞的获取到数据,但是获取到的数据可能有一定的重复, 在程序中做一次去重。

由于scan命令是增量式迭代命令,不能保证返回后的数据被修改,所以该命令只能对返回的数据有限的保证。

5、redis异步队列

使用list存储数据,使用rpush生产消息,使用lpop消费消息。当lpop没有消息的时候,可以使用sleep,一会再重试。也可以使用blpop命令,block left pop,可以阻塞直到消息到来。

实现1:N

使用pub/sub发布订阅模式实现一对多。但是当消费者下线时,消息会丢失。

6、Redis如何实现延时队列?

使用sortset数据结构,用时间戳作为score,信息内容作为keyzadd生产消息。消费时,使用zrangebyscore获取N秒之前的数据,轮询处理 。

7、redis日志

redis有RDBAOF两种保存日志的方式。

RDB就是保存在磁盘上,可以选择没两个小时归档最近一天的数据。RDB实际上是fork一个子进程,使用子进程备份数据,然后替换之前的文件,使用二进制进行压缩存储。

AOF则是以日志形式记录每一个写,删命令,以文本的方式记录,可以看到详细的执行记录。AOF可以选择一秒记录一次,这样最多丢失一秒的数据。

RDB以二进制存储,所以文件会更小。其执行方式使它在效率上会更快,但是在数据保存时效性上,没有AOF强,对比2小时归档和1s执行记录。

在实际应用中,我们一般两种方式都会使用,并且使用异地容灾的存储方式,比如一个服务器在上海,复制一份数据到北京的服务器。这样当服务器炸了,也有数据可以备份。AOF可以保证数据的即时性,不会丢失很多数据。RDB可以尽量的保证全量性。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是 Redis? Redis 是完全开源免费的,遵守BSD协议[https://www.jianshu.com...
    奇点一氪阅读 9,292评论 10 249
  • 一、简述 Redis 全称Remote Dictionary Server。是一个开源的 BSD[https://...
    Djbfifjd阅读 1,019评论 0 1
  • 前言 常用的SQL数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的IO压力,但由于数据...
    Java_xiaoman阅读 391评论 0 1
  • 1. Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合Sorted...
    裘马轻狂大帅阅读 326评论 0 3
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,098评论 0 4