0717-7821348
爱彩人彩票网官网

爱彩人彩票网官网

您现在的位置: 首页 > 爱彩人彩票网官网
爱彩人app下载-关于Redis的n种妙用,不仅仅是缓存(附有自学材料共享哦)
2019-05-11 23:21:15

redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),调集类型(set),有序调集类型(zset)

Redis用作缓存,首要两个用处:高性能,高并发,由于内存天然支撑高并发

运用场景

分布式锁(string)

setnx key value,当key不存在时,将 key 的值设为 value ,回来1。若给定的 key 现已存在,则setnx不做任何动作,回来0。

当setnx回来1时,表明获取锁,做完操作今后del key,表明开释锁,假定setnx回来0表明获取锁失利,整体思路大约便是这样,细节仍是比较多的,有时刻单开一篇来解说

计数器(string)

如知乎每个问题的被浏览器次数

s爱彩人app下载-关于Redis的n种妙用,不仅仅是缓存(附有自学材料共享哦)et key 0
incr key // incr readcount::{帖子id} 每阅览一次
get key // get readcount::{帖子id} 获取阅览量

分布式大局仅有id(string)

分布式大局仅有id的完成方法有许多,这儿只介绍用redis完成

每次获取userId的时分,对userId加1再获取,能够改善为如下方法

直接获取一段userId的最大值,缓存到本地渐渐累加,快到了userId的最大值时,再去获取一段,一个用户服务宕机了,也顶多一小段userId没有用到

set userId 0
incr usrId //回来1
incrby us爱彩人app下载-关于Redis的n种妙用,不仅仅是缓存(附有自学材料共享哦)erId 1000 //回来10001

音讯行列(list)

在list里边一边进,一边出即可

# 完成方法一
# 一向往list左面放
lpush key value
# key这个list有元素时,直接弹出,没有元素被堵塞,直到等候超时或发现可弹出元素停止,上面比方超时时刻为10s
brpop key value 10
# 完成方法二
rpush key value
blpop key value 10

新浪/Twitter用户音讯列表(list)

假定说小编li重视了2个微博a和b,a发了一爱彩人app下载-关于Redis的n种妙用,不仅仅是缓存(附有自学材料共享哦)条微博(编号为100)就履行如下指令

lpush msg::li 100

b发了一条微博(编号为200)就履行如下指令:

lpush msg::li 200

假定想拿最近的10条音讯就能够履行如下指令(最新的音讯必定在list的最左面):

# 下标从0开端,[start,stop]是闭区间,都包含
lrange msg::li 0 9

抽奖活动(set)

# 参与抽奖活动
sadd key {userId}
# 获取一切抽奖用户,大轮盘转起来
smembers key
# 抽取count名中奖者,并从抽奖活动中移除
spop key count
# 抽取count名中奖者,不从抽奖活动中移除
srandmember key count

完成点赞,报到,like等功能(set)

# 1001用户给8001帖子点赞
sadd like::8001 1001
# 撤销点赞
srem like::8001 1001
# 查看用户是否点过赞
sismember like::8001 1001
# 获取点赞的用户列表
smembers like::8001
# 获取点赞用户数
scard like::8001

完成重视模型,或许知道的人(set)

seven重视的人

sevenSub -> {qing, mic, james}

青山重视的人

qingSub->{seven,jack,mic,james}

Mic重视的人

MicSub->{seven,james,qing,jack,tom}

# 回来sevenSub和qingSub的交集,即seven和青山的一同重视
sinter sevenSub qingSub -> {mic,james}
# 我重视的人也重视他,下面比方中我是seven
# qing在micSub中回来1,不然回来0
sismember micSub qing
sismember jamesSub qing
# 我或许知道的人,下面比方中我是seven
# 求qingSub和sevenSub的差集,并存在sevenMayKnow调会集
sdiffstore sevenMayKnow qingSub sevenSub -> {se爱彩人app下载-关于Redis的n种妙用,不仅仅是缓存(附有自学材料共享哦)ven,jack}

电商产品挑选(set)

每个产品入库的时分即会树立他的静态标签列表如,品牌,尺度,处理器,内存

# 将解救者y700P-001和ThinkPad-T480这两个元素放到调集brand::lenovo
sadd brand::lenovo 解救者y700P-001 ThinkPad-T480
sadd screenSize::15.6 解救者y700P-001 机械革新Z2AIR
sadd processor::i7 解救者y700P-001 机械革新X8TIPlus
# 获取品牌为联想,屏幕尺度为15.6,而且处理器为i7的电脑品牌(sinter为获取调集的交集)
sinter brand::lenovo screenSize::15.6 processor::i7 -> 解救者y700P-001

排行版(zset)

redis的zset天然生成是用来做排行榜的、老友列表, 去重, 历史记载等事务需求

# user1的用户分数为 10
zadd ranking 10 user1
zadd ranking 20 user2
# 取分数最高的3个用户
zrevrange ranking 0 2 withscores

过期战略

定时删去

redis 会将每个设置了过期时刻的 key 放入到一个独立的字典中,今后会定时遍历这个字典来删去到期的 key。

定时删去战略

Redis 默许会每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中一切的 key,而是选用了一种简略的贪心战略。

从过期字典中随机 20 个 key;

删去这 20 个 key 中现已过期的 key;

假定过期的 key 比率超越 1/4,那就重复进程 1;

慵懒删去

除了定时遍历之外,它还会运用慵懒战略来删去过期的 key,所谓慵懒战略便是在客户端拜访这个 key 的时分,redis 对 key 的过期时刻进行查看,假定过期了就当即删去,不会给你回来任何东西。

定时删去是会集处理,慵懒删去是零星处理。

为什么要选用定时删去+慵懒删去2种战略呢?

假定过期就删去。假定redis里放了10万个key,都设置了过期时刻,你每隔几百毫秒,就查看10万个key,那redis基本上就死了,cpu负载会很高的,耗费在你的查看过期key上了

可是问题是,定时删去或许会导致许多过期key到了时刻并没有被删去掉,那咋整呢?所以便是慵懒删去了。这便是说,在你获取某个key的时分,redis会查看一下 ,这个key假定设置了过期时刻那么是否过期了?假定过期了此刻就会删去,不会给你回来任何东西。

并不是key到时刻就被删去掉,而是你查询这个key的时分,redis再懒散的查看一下

经过上述两种手法结合起来,确保过期的key必定会被干掉。

所以说用了上述2种战略后,下面这种现象就不难解说了:数据明明都过期了,可是还占有着内存

内存筛选战略

这个问题或许有小伙伴们遇到过,放到Redis中的数据怎样没了?

由于Redis将数据放到内存中,内存是有限的,比方redis就只能用10个G,你要是往里边写了20个G的数据,会咋办?当女逼然会干掉10个G的数据,然后就保存10个G的数据了。那干掉哪些数据?保存哪些数据?当然是干掉不常用的数据,保存常用的数据了

Redis供给的内存筛选战略有如下几种:

  1. noeviction 不会继续服务写恳求 (DEL 恳求能够继续服务),读恳求能够继续进行。这样能够确保不会丢掉数据,可是会让线上的事务不能继续进行。这是默许的筛选战略。
  2. volatile-lru 测验筛选设置了过期时刻的 key,最少运用的 key 优先被筛选。没有设置过期时刻的 key 不会被筛选,这样能够确保需求耐久化的数据不会忽然丢掉。(这个是运用最多的)
  3. volatile-ttl 跟上面相同,除了筛选的战略不是 LRU,而是 key 的剩下寿数 ttl 的值,ttl 越小越优先被筛选。
  4. volatile-random 跟上面相同,不过筛选的 key 是过期 key 调会集随机的 key。
  5. allkeys-lru 差异于 volatile-lru,这个战略要筛选的 key 对象是整体的 key 调集,而不只是过期的 key 调集。这意味着没有设置过期时刻的 key 也会被筛选。
  6. allkeys-random 跟上面相同,不过筛选的战略是随机的 key。allkeys-random 跟上面相同,不过筛选的战略是随机的 key。

耐久化战略

Redis的数据是存在内存中的,假定Redis发作宕机,那么数据会悉数丢掉,因而有必要供给耐久化机制。

Redis 的耐久化机制有两种,榜首种是快照(RDB),第二种是 AOF 日志。快照是一次全量备份,AOF 日志是接连的增量备份。快照是内存数据的二进制序列化方法,在存储上十分紧凑,而 AOF 日志记载的是内存数据修正的指令记载文本。AOF 日志在长时刻的运转进程中会变的无比巨大,数据库重启时需求加载 AOF 日志进行指令重放,这个时刻就会无比绵长。所以需求定时进行 AOF 重写,给 AOF 日志进行减肥。爱彩人app下载-关于Redis的n种妙用,不仅仅是缓存(附有自学材料共享哦)

RDB是经过Redis主进程fork子进程,让子进程履行磁盘 IO 操作来进行 RDB 耐久化,AOF 日志存储的是 Redis 服务器的次序指令序列,AOF 日志爱彩人app下载-关于Redis的n种妙用,不仅仅是缓存(附有自学材料共享哦)只记载对内存进行修正的指令记载。即RDB记载的是数据,AOF记载的是指令

RDB和AOF究竟该怎么挑选?

  1. 不要只是运用 RDB,由于那样会导致你丢掉许多数据,由于RDB是隔一段时刻来备份数据
  2. 也不要只是运用 AOF,由于那样有两个问题,榜首,经过 AOF 做冷备没有RDB康复速度快; 第二,RDB 每次简略粗犷生成数据快照,愈加强健,能够防止 AOF 这种杂乱的备份和康复机制的 bug
  3. 用RDB康复内存状况会丢掉许多数据,重放AOP日志又很慢。Redis4.0推出了混合耐久化来处理这个问题。将 rdb 文件的内容和增量的 AOF 日志文件存在一同。这儿的 AOF 日志不再是全量的日志,而是自耐久化开端到耐久化完毕的这段时刻发作的增量 AOF 日志,一般这部分 AOF 日志很小。所以在 Redis 重启的时分,能够先加载 rdb 的内容,然后再重放增量 AOF 日志就能够彻底代替之前的 AOF 全量文件重放,重启功率因而大幅得到提高。

缓存雪崩和缓存穿透

缓存雪崩是什么?

假定有如下一个体系,高峰期恳求为5000次/秒,4000次走了缓存,只要1000次落到了数据库上,数据库每秒1000的并发是一个正常的目标,彻底能够正常作业,但假定缓存宕机了,每秒5000次的恳求会悉数落到数据库上,数据库立马就死掉了,由于数据库一秒最多抗2000个恳求,假定DBA重启数据库,立马又会被新的恳求打死了,这便是缓存雪崩。


怎么处理缓存雪崩

事前:redis高可用,主从+岗兵,redis cluster,防止全盘溃散

事中:本地ehcache缓存 + hystrix限流&降级,防止MySQL被打死

过后:redis耐久化,快速康复缓存数据

缓存穿透是什么?

假定客户端每秒发送5000个恳求,其间4000个为黑客的歹意进犯,即在数据库中也查不到。举个比方,用户id为正数,黑客结构的用户id为负数,

假定黑客每秒一向发送这4000个恳求,缓存就不起作用,数据库也很快被打死。


怎么处理缓存穿透

查询不到的数据也放到缓存,value为空,如set -999 “”

总而言之,缓存雪崩便是缓存失效,恳求悉数悉数打到数据库,数据库瞬间被打死。缓存穿透便是查询了一个必定不存在的数据,而且从存储层查不到的数据没有写入缓存,这将导致这个不存在的数据每次恳求都要到存储层去查询,失去了缓存的含义。

写在最终:柠檬为我们预备了一些适合于1-5年以上开发经历的java程序员面试涉及到的绝大部分面试题及答案做成了文档和学习笔记文件以及架构视频材料免费共享给我们(包含Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术材料),期望能够协助到我们。

获取方法:请我们重视并私信小编关键词:“材料”即可获取你需求的各类材料。