前言:有一篇文章对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:集群