Redis学习笔记

特点

单进程单线程
基于内存操作
具有临时性和永久性
数据结构服务器
无中心的分布式集群
拥有原子操作

数据类型

String

- 最多512M大小字符串
- 二进制安全;是一种**动态字符串**

Hash

通过"数组 + 链表"的链地址法来解决部分哈希冲突

List

- 双向链表,最多2^32-1个元素,
- 它是链表而不是数组,插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)

Set


- 无序的字符串集合,方便计算交际、并集、差集等;
- 最多2^32-1个元素
- 应用:关注列表、粉丝列表、共同关注粉丝等

Zset


- 内部实现用的是一种叫做**「跳跃表」**的数据结构;
- 集合成员关联着一个评分,按最低到最高分排列;
- 应用:有排序条件的列表,热门文章等 




事务

    wathc //监视某个key
    multi//以此开始
        中间执行具体的命令
    exec //结束,提交事务;如果执行期间key被其他客户端修改,则exec失败
  1. 在exec调用之前,中间出错,则exec不会执行
  2. 在exec调用之后,执行出错,则已成功的不会回滚

redis持久化

  1. 用于重启后的数据恢复
  2. Redis目前支持的持久化 rdb aof

rdb 是快照存储默认的方式,将快照数据存储在dump.rdb文件中;save | bgsave(会新启动一个进程来执行)

save 900 1
save 300 10
save 60 10000

aof 默认没有开启,可以修改appendonly yes 来开启

appendfsync always  每次命令都写
appendfsync everysec 每秒同步一次(默认)
appendfsync no 不主动同步

redis恢复

配置了rdb|aof 优先使用aof

通过 save|bgsave|bgrewriteaof

redis数据淘汰策略

redis可以通过maxmemory 配置项来设置允许用户使用的最大内存大小,当内存数据集大小达到一定的大小时,就会根据maxmemory-policy noeviction配置项配置的策略来进行数据淘汰。

  • volatile-lru
    从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-random
    从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • volatile-ttl
    从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • allkeys-lru
    从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random
    从数据集(server.db[i].dict)中任意选择数据淘汰
  • noeviction
    禁止驱逐数据,永远不过期,仅对写操作返回一个错误,默认为该项

redis、memcached和mongodb的对比

  1. memcached
    性能高,不是瓶颈,memcached可以利用多核优势,单实例吞吐量极高,可达几十万QPS,适用于最大程度扛量
    只支持简单的key/value数据结构
    无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失
    数据无法同步迁移
    内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计
    在并发场景下,用cas保证一致性
  2. redis
    支持多种数据结构,如string(字符串),list(双向链表),dict(hash表),set(集合),zset(排序set),hyperloglogs(基数估算),在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储惟降低内存耗用
    多数据结构可减少网络IO次数
    支付持久化操作,可以进行aof及rdb数据持久化到磁盘,进行数据备份或数据恢复等
    支持replication数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制
    单线程,所有命令串行执行,并发情况下不需要考虑数据一致性问题,性能受限于CPU性能,单实例最高可达5-6万QPS
    支持消息订阅机制,可以用来进行消息订阅与通知
    支持简单的事务,只保证事务中的每个操作连续执行
  3. mongodb
    文档形数据库,可以存放xml、json、bson类型数据
    支持丰富的数据表达,索引,查询语言丰富
    QPS比redis、memcached相对小
    适合大数据量存储,依赖操作系统vm做内存管理,吃内存比较厉害,最好不要与别的服务在一起
    支持master-slave,replication机制,采用binlog方式进行持久化
    不支持事务,内置了数据分析功能
  4. 应用场景

    redis和memcached在性能上都比较高,redis在存储小数据时比memcached性能更高,但在100k以上的数据中,memcached性能要高于redis;

    在内存使用效率上,如果kv存储memcached内存利用率更高,而如果redis采用hash结构来做kv存储,由于其组合式压缩,内存利用率高于memcached;

    在利用多种数据结构操作数据时,memcached需要将数据在客户端操作,增加了网络IO开销,故性能低于redis;在存储大量数据时,mongodb更适合存储海量数据

Redis做异步队列,你是怎么用的

1. 一般使用list结构作为队列,**rpush**生产消息,**lpop**消费消息。当lpop没有消息的时候,要适当sleep一会再重试。
2. list还有个指令叫**blpop**,在没有消息的时候,它会阻塞住直到消息到来。
3. 使用pub/sub主题订阅者模式,可以实现 1:N 的消息队列
4. 在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如**RocketMQ**等

Redis如何实现延时队列


使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用**zrangebyscore**指令获取N秒之前的数据轮询进行处理

RDB的原理是什么

fork和cow。fork是指redis通过创建子进程来进行RDB操作,cow指的是**copy on write**,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来

Redis的同步机制

Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次**bgsave**,并同时将后续修改操作记录到内存buffer,待完成后将RDB文件全量同步到复制节点,复制节点接受完成后将RDB镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。后续的增量数据通过AOF日志同步即可,有点类似数据库的binlog。

缓存穿透和击穿么,他们跟雪崩的区别

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

缓存雪崩是因为大面积的缓存失效,打崩了DB。

缓存击穿指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。


**缓存穿透** 可以在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。
**缓存击穿**的话,设置热点数据永远不过期。或者加上互斥锁就能搞定了
**Redis**还有一个高级用法**布隆过滤器(Bloom Filter)**这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。

你可能感兴趣的:(redis)