学习笔记-redis

目录

4种存储结构

常见的redis命令

1 String类型

2 Hash类型 命令

3 List类型命令 

场景:

4 集合set命令

场景

5 有序集合Zset命令

场景

6 布隆过滤器

2.6.1 bitmap

Redis单线程和高性能

Redis线程模型

Redis持久化

1、RDB 快照(Redis DataBase)

2、AOF(Append Only File)

RDB 与 AOF 对比

3、RDB+AOF模式

Redis缓存

Redis内存淘汰策略-maxmemery-policy

在过期数据删除:

在所有key中删除:

不处理:

Redis 4种架构模式

主从模式

 哨兵模式 sentinel

Reids集群

1 、集群选举

为什么redis推荐奇数个节点?

说说Redis哈希槽的概念

脑裂问题

分布式锁

 分布式锁

缓存异常

1、缓存穿透问题

解决方法:

2、缓存失效(缓存击穿)

3、缓存雪崩

热点缓存key重建

 缓存与数据库双写不一致

常见问题


Redis的使用场景

缓存:热点数据,提升性能,减少数据库磁盘查询

数据共享(分布式):Session,解决单点登录用户状态。

分布式锁:Long flag = jedis.setnx(key, "1"),存在就会set不成功

全局 ID:int类型,incrby,利用原子性  incrby userid 1000,分库分表的场景,一次性拿一段

计数器:incrby 文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库

限流:以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false

位统计、购物车、用户消息时间线 timeline、消息队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜

4种存储结构

String,List(列表),Set(无序集合),Zset(有序集合),Hash键值

常见的redis命令

del key

keys * 扫描全库,如果库key多有可能性能慢,会造成阻塞。

分页  scan 0 match  aa* count 2    返回的是游标

1 String类型

set key value

get key value

计数器命令 :INCR tblkey:orderid

2 Hash类型 命令

hget key field

hset key field value

hdel key field

hmget key field1 field2 ... fieldN

hmset key field1 value1 field2 value2 ... fieldN valueN

获取key下全部信息:hgetall key

3 List类型命令 

value可重复

LPUSH/RPUSH key value

LPOP/RPOP key value

LRANGE key start stop   展示列表从start - stop : stop=-1表示最后一个

LRANGE key 0 -1  全量

场景:

微博消息推送  大V发微博,推送给关注的人LPUSH

4 集合set命令

SADD key member   添加

SREM key member  取消  

SISMEMBER key member  判断MEMBER是否是(1:是 0:无)

SCARD member 返回集合个数

smembers key  集合成员

SRANDMEMBER key [count]  抽奖(不会从集合删除)

SPOP  key [count]  抽奖(会从集合删除)

sinter(交集intersection) 命令

sdiff(差集)命令 sdiff a b  相当于a-b

场景

1、微信关注模型:

zhagsan->{lisi,wangwu,chenliu} ;  lisi->{wangwu}; wangwu->{lisi,xieba}

共同关注(交集) SINTER zhagsan lisi   --> wangwu

推荐可能认识的人(差集) SDIFF zs ls ->{xz}

2、小程序抽奖

SRANDMEMBER key [count]  抽奖(不会从集合删除)

SPOP  key [count]  抽奖(会从集合删除)

3、消息点赞

SISMEMBER key member  判断MEMBER是否是(1:是 0:无) 再 sadd或者srem

5 有序集合Zset命令

Redis 有序集合(sorted set) | 菜鸟教程

score 分值 通过这个排序

ZADD key score1 member1 [score2 member2]

ZREM key member [member ...]

ZINCRBY key increment member

场景

热点新闻

ZINCRBY news:20200101 1 "新闻A"  --------每点击一次新闻A+1

ZREVRANGE  news:20200101 0 9 稻香园  ---排序

6 布隆过滤器

不存在,就一定不存在,存在,不一定存在,注意,布隆过滤器不允许修改,只能重建。

2.6.1 bitmap

8bit = 1b = 0.001kb

setbit key offset value    --- offset偏移量。value:1或0

getBit key offset 

bitCount key [start end] 统计为1 的总数

bitOp operation destkey key [key …]---operaton可以是(AND、OR、NOT、XOR)

优势

1.基于最小的单位bit进行存储,所以非常省空间。
2.设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。
3.二进制数据的存储,进行相关计算的时候非常快。
4.方便扩容

限制
redis中bit映射被限制在512MB之内,所以最大是2^32位。

使用场景

1、防止黑客的缓存穿透问题,将所有key放入布隆过滤器中,hash碰撞也没关系,因为布隆过滤器会非常大

2、用户是否在线(千万账号)userid为int类型的时候 setbit online 1001 1

3、用户签到 + 用户活跃的 bitCount key [start end] 统计为1 的总数

$start_date = '20170708';
$end_date = '20170709';
$offset = floor((strtotime($start_date) - strtotime($end_date)) / 86400);
$redis->setBit('sign_123456', $offset, 1);

//算活跃天数
$redis->bitCount('sign_123456', 0, -1)

4、连续签到

  1. 指定时间内,判断多少人签到连续签到成功
    // SETBIT 日期  用户ID  value
    
    SETBIT 20211015 10 1
    SETBIT 20211016 10 1
    SETBIT 20211017 10 1
    SETBIT 20211018 10 1
    
    SETBIT 20211015 20 1
    SETBIT 20211016 20 0
    SETBIT 20211017 20 1
    SETBIT 20211018 20 1
    
    SETBIT 20211015 30 1
    SETBIT 20211016 30 1
    SETBIT 20211017 30 1
    SETBIT 20211018 30 1
    
    SETBIT 20211015 40 1
    SETBIT 20211016 40 0
    SETBIT 20211017 40 0
    SETBIT 20211018 40 1
    
    BITOP AND destmap 20211015 20211016 20211017 20211018
    
    BITCOUNT destmap
    2

Redis单线程和高性能

Redis线程模型

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

  • 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。

  • 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。

Redis不是严格意义上的单线程,单线程是指客户端发起的命令式单线程的。也就是执行命令式单线程。持久化、异步删除等都是由额外线程做的

Redis 的IO多路复用,利用epoll实现多路复用。

Redis持久化

1、RDB 快照(Redis DataBase)

redis.conf 中可以配置策略。持久化到磁盘.rdb文件中,默认dump.rdb。

1、save方式,同步操作,会阻碍线程

2、bgsave方式,后台执行性,异步,不会阻塞

缺点:当快照文件做恢复时,生成子进程,如果父进程还在写数据,这部分数据会丢失。

RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。

2、AOF(Append Only File)

redis.conf 开启:appendonly 改成 yes 。

策略(触发机制): appendfsync always/everysec/no 默认 everysec 每秒

原理:redis的命令会通过write追加到aof文件中,会生成子进程重写机制。

redis重启后,重放,可以配合重写策略。

缺点:文件大

RDB 与 AOF 对比

3、RDB+AOF模式

混合持久化:实际是特殊的AOF。将RDB的save关闭,打开aof

将快照记录以二进制到AOF文件中,后续命令追加。

Redis缓存

Redis内存淘汰策略-maxmemery-policy

生成环境需要设置最大内存,超过最大内存怎么处理? 默认是noeviction,不允许写入

在过期数据删除:

1、volatile-ttl:设置过期时间键值先后删除

2、volatile-random:设置过期时间键值对随机删除

3、volatile-lru:LRU算法最近最少使用(Lest Recently Used)--推荐

4、volatile-lfu:LFU算法最不经常使用(Least Frequently Used)

类似热点数据

在所有key中删除:

5、allkey-random

6、allkey-lru

7、allkey-lfu

不处理:

8、noeviction:内存满了直接OOM不允许写入  ---默认

Redis 4种架构模式

单机、主从、哨兵sentinel、集群cluster

主从模式

Redis的主从结构可以采用一主多从或者级联结构。可以分担读。

这就涉及到上面说的备份,rdb还是aof模式,又或者rdb+aof模式

优点1、解决数据备份问题
2、做到读写分离,提高服务器性能
缺点1、不会主从切换,需要人工干预
2、无法扩容

 哨兵模式 sentinel

复制一份redis.conf 修改配置。

主节点复制写,从节点可以提供读

哨兵sentinel不提供读写,只负责监控master,选举 

Reids集群

Cluster 集群模式,不仅包含了哨兵、主从复制等功能,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容

官方说明至少3个master节点,集群间通过gossip协议:ping/meet/pong/faild等命令,可以横向扩容最好不要超过1000。

集群的键空间被分割为16384个slots(即hash槽),通过hash的方式将数据分到不同的分片上的。

集群的特点

  • 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

  • 节点的fail是通过集群中超过半数的节点检测失效时才生效。

  • 客户端与 Redis 节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

 redis-cli -a 密码 --cluster 1 IP1:port IP1:port IP1:port ...

1代表一从节点

# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.11.128 6379 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

1 、集群选举

Redis集群搭建及选举原理 - 白露非霜 - 博客园

当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master 可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下: 1.slave发现自己的master变为FAIL

2.将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息

3.其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个 epoch只发送一次ack

4.尝试failover的slave收集master返回的FAILOVER_AUTH_ACK

5.slave收到超过半数master的ack后变成新Master(这里解释了集群为什么至少需要三个主节点,如果只有两 个,当其中一个挂了,只剩一个主节点是不能选举成功的)

6.slave广播Pong消息通知其他集群节点。 从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待 FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票

•延迟计算公式: DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms •SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方 式下,持有最新数据的slave将会首先发起选举(理论上)。

为什么redis推荐奇数个节点?

首先Redis是推荐奇数个节点,从来没有过必须是奇数节点的说法。

原因是从成本上考虑,因为奇数个节点和偶数个节点允许宕机的节点数是一样的,

集群中,半数以上节点认为主节点故障了,才会选举新的节点。

比如3个节点和4个节点都只允许宕机一台,那么为什么要搞4个节点去浪费服务资源呢?

说说Redis哈希槽的概念

一致性hash算法和redis集群动态数据存储_sherry_y_fan的博客-CSDN博客

Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

脑裂问题

集群脑裂问题,就是一个集群多个主节点,会导致数据丢失。

当集群主节点挂了,重新选举新的主节点,当挂了的主节点恢复后,就有两个主节点。

规避脑裂问题:配置 min-slaves-to-write 1  半数写入成功,客户端才收到成功。

但这就牺牲了集群的可用性。即用数据一致性换取了高可用。

redis做缓存,其实没必要保证数据一致性。

分布式锁

通过synchronized(this){}

 缺陷:

单机没问题,但是高并发集群就会出问题。

 分布式锁

JVM的锁是不适合分布式的。

第一种:

原理:redis的key只要对一次设置才能成功!

 注意防止异常finally 繁殖宕机设置超时时间

以上方法,普通并发是可以的,

如果高并发,线程执行时间超过超时时间,有可能被误删锁了。

缓存异常

1、缓存穿透问题

缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案

  1. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;

  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

  3. 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

解决方法:

1)缓存空对象,且一定要设置过期时间。

 2)布隆过滤器

建一个布隆过滤器,将所以可以放进去

     

2、缓存失效(缓存击穿)

一般秒杀活动开始,同时上架一批货品,这是会将热点商品同时放入缓存中,那这边数据的失效时间是一样的,导致有可能同时失效。

解决方案:

缓存失效时间设置添加随机数

3、缓存雪崩

缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而系统崩掉。(Redis挂了,或者数据量太多)

解决方案

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

  2. 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。

  3. 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

  4. 限流策略,允许异步的情况,可以

  5. 降级处理,给些友好的提示

热点缓存key重建

例如:一些冷数据,是不会放入缓存的,但是突然将爆的情况,那请求会直接访问数据库,导致系统挂了

解决方案:分布式锁 set nx , 先拦一下

 缓存与数据库双写不一致

以下两张图,都有问题

 

 解决方案

1、并发情况很小,后者自己内部数据,加个超时时间1分钟,短时间数据不一致没关系

2、高并发情况,访问的是公共数据。一定要数据一致的情况,分布式锁,读写锁!会牺牲性能~

缓存预热:

maxIdle,MaxTotal 

常见问题

1、什么是 Redis?

2、Redis 的数据类型?

3、使用 Redis 有哪些好处?

4、Redis 相比 Memcached 有哪些优势?

5、Memcache 与 Redis 的区别都有哪些?

6、Redis 是单进程单线程的?

7、一个字符串类型的值能存储最大容量是多少?

8、Redis 的持久化机制是什么?各自的优缺点?

9、Redis 常见性能问题和解决方案:

10、redis 过期键的删除策略?

11、Redis 的回收策略(淘汰策略)?

12、为什么 Redis 需要把所有数据放到内存中?

13、Redis 的同步机制了解么?

14、Pipeline 有什么好处,为什么要用 pipeline?

15、是否使用过 Redis 集群,集群的原理是什么?

16、Redis 集群方案什么情况下会导致整个集群不可用?

17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?

18、Jedis 与 Redisson 对比有什么优缺点?

19、Redis 如何设置密码及验证密码?

20、说说 Redis 哈希槽的概念?

21、Redis 集群的主从复制模型是怎样的?

22、Redis 集群会有写操作丢失吗?为什么?

23、Redis 集群之间是如何复制的?

24、Redis 集群最大节点个数是多少?

25、Redis 集群如何选择数据库?

26、怎么测试 Redis 的连通性?

27、怎么理解 Redis 事务?

28、Redis 事务相关的命令有哪几个?

29、Redis key 的过期时间和永久有效分别怎么设置?

30、Redis 如何做内存优化?

31、Redis 回收进程如何工作的?

32、都有哪些办法可以降低 Redis 的内存使用情况呢?

33、Redis 的内存用完了会发生什么?

34、Redis 多线程的实现机制?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
scrapy-redis是基于redis的分布式组件,它是scrapy框架的一个组件。它的主要作用是实现断点续爬和分布式爬虫的功能。 使用scrapy-redis可以实现分布式数据处理,爬取到的item数据可以被推送到redis中,这样你可以启动尽可能多的item处理程序。 安装和使用scrapy-redis非常简单,一般通过pip安装Scrapy-redis:pip install scrapy-redis。同时,scrapy-redis需要依赖Python 2.7, 3.4 or 3.5以上,Redis >= 2.8和Scrapy >= 1.1。在使用时,你只需要做一些简单的设置,几乎不需要改变原本的scrapy项目的代码。 scrapy-redis将数据存储在redis中,你可以在redis中查看存储的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [scrapy_redis的基本使用和介绍](https://blog.csdn.net/WangTaoTao_/article/details/107748403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [爬虫学习笔记(十二)—— scrapy-redis(一):基本使用、介绍](https://blog.csdn.net/qq_46485161/article/details/118863801)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值