redis相关以及redis做分布式锁可能出现的问题 - Go语言中文社区

redis相关以及redis做分布式锁可能出现的问题


前言:有一篇文章对redis的介绍不错,拿来加深印象。 

在Redis中,允许用户设置最大使用内存大小server.maxmemory,当Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。1.volatile-lru:从已设置过期的数据集中挑选最近最少使用的淘汰2.volatile-ttr:从已设置过期的数据集中挑选将要过期的数据淘汰3.volatile-random:从已设置过期的数据集中任意挑选数据淘汰4.allkeys-lru:从数据集中挑选最近最少使用的数据淘汰5.allkeys-random:从数据集中任意挑选数据淘汰6.noenviction:禁止淘汰数据redis淘汰数据时还会同步到aof

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

redis的数据类型

http://www.imooc.com/article/255861

五大数据类型的区别:

list  ------>有序的集合,可重复数据,可插入多个null值   【linedList 或者ziplist】

set  ----->它是一个无序集合,包含的元素不重复,只能插入一个null值

hash---->  结构  :key  value[field,value]

Sorted sets 类型(有序集合类型) :[ziplist,skiplist+hashtable]

类似于Map的key-value对,key有序 ,不重复

value : 浮点数,称为 score有序 :内部按照score 从小到大的顺序排列  

STring :

使用redis做事务:

redis做缓存可能出现的问题

1:缓存穿透

        问题缓存穿透是指查询一个一定不存在的数据

        解决方案:    空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

2:缓存雪崩

        问题:缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

           解决方案: 原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

3:缓存击穿

        问题:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮

        解决方案:分布式锁

在访问数据库资源之前,我们使用redis给访问数据库的程序加上锁,以及在结束的时候释放锁

          代码:Long lock = jedis.setnx("lock", "23");

            释放锁:jedis.del("lock");

4:缓存的使用模式

        Cache-Aside和Cache As SoR

Cache-Aside:  业务代码围绕Cache编写,由业务代码维护缓存;

双写模式

5:分布式锁的问题:

5.1:reisdis 或者 redison

redison:Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务

6:redis主从复制和Mysql 的主从复制

Mysql 的主从复制:

Mysql数据库的主从复制:

步骤一:主库db的更新事件(update、insert、delete)被写到binlog 

步骤二:从库发起连接,连接到主库 

步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库 

四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log. 

五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db. 

redis 的主从复制:

redis主从复制的原理:

全量同步:

-从服务器连接主服务器,发送SYNC命令; 

-  主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 

-  主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 

-  从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 

-  主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 

-  从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

redis的哨兵模式:

redis的数据模型中年String 中的key最多可以放多少个?int 的最大值(2的32次方)

redis有一个他的最大内存,超过之后会怎么样?怎么解决?
1:淘汰策略

2:集群

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/l848168/article/details/103693131
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-19 08:44:33
  • 阅读 ( 1209 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢