Redis(Remote Dictionary Server ),即远程字典服务;是一个开源的,使用ANSI C语音编写,可支持网络,基于内存,可持久化的日志型,key-value的非关系型数据库,并提供多语言API;

redis的五种基本类型:String、hash、list、set、zet;

  • string

        String是redis最基本的存储类型,可存储512M,支持存储图片或序列化数据

        应用场景:存储共享session;分布式锁,计数器,限流

  • hash

        hash是一个redis中value值也是key-value形式的数据类型;

        应用场景:缓存用户信息

  • list

        根据list的特性,redis的list存储有序字符串,可存储2^32-1个元素

        应用场景:消息队列,文章列表

  • set

        根据set的特性,reids的set存储不可重复的元素

        应用场景:抽奖,用户标签,社交需求

  • zset

        有序不可重复元素

为什么选择redis

redis存储形式为key-value,而不选择map做缓存是因为map只能做本地数据存储,不能保证多实例服务器数据一致性,redis是分布式缓存可以保证数据一致;同时map需要jvm内存回收,当创建大量的map做数据缓存会消耗内存,而redis可以指定缓存过期机制;

redis为什么这么快

redis是基于内存;mysql是存储到磁盘;

redis单线程避免上下文切换;非阻塞I/O模型;

redis的虚拟内存机制

redis的虚拟内存机制指redis筛选出内存中使用频率相对较低的数据写入磁盘中,而内存中只存放一些热点数据,避免因内存不足而产生效率下降;

缓存击穿| 缓存穿透| 缓存雪崩

缓存击穿:指redis不存在而数据库有的数据,而此时大量的用户发起请求直接查询数据库导致数据库压力骤增;解决办法为:1)提前加热数据,调整过期时间。2)或者采用加锁的方式,对于查不到的数据查询数据库并增加到缓存中,使其他请求直接访问缓存;

缓存穿透:指redis和数据库均不存在数据,大量用户访问数据库造成数据库压力骤增;

解决办法:1)对于数据库查询不到的数据设置空值防止其他请求大量聚集访问数据库

2)使用布隆过滤器:将所有可能存在的数据哈希到一个bigmap中,一个i顶不存在的数据会被bigmap拦截,从而避免对底层存储系统的查询压力增加。布隆过滤器值对于某个元素经过K次hash后存储数组到k个位置,若其中一个hash返回0即不存在,则表示不存在此数据

布隆过滤器详解__瞳孔的博客-CSDN博客_布隆过滤器

缓存雪崩:缓存雪崩指redis中的key集中大量失效,导致所有用户集中访问数据库造成数据库压力增加,雪崩指大量的key集中访问数据库,而击穿指针对某一个key集中访问数据库;

解决办法:1)将redis的key值过期时间设置错开 2)使用某些带成功返回的原子操作命令,若返回失败再重新尝试获取缓存的方式;

redis的过期策略

redis采用定时清理,定期清理和惰性清理

定时清理:每个设置过期时间的key都设置一个定时器,当key过期时会及时清理,但是需要占用大量cpu资源,影响缓存的吞吐量和响应时间

惰性清理:当调用到某个key时才会去判断是否过期是否需要清理;极端情况会出现大量过期key因为未被访问而不被清理占用内存

定期清理:经过一段时间会定期的清理redis中的过期key;

redis使用定期清理和惰性清理两种策略结合,定期定理掉过期key,对于未被清理的key当被调用时清理;

redis的内存淘汰策略

1、淘汰过期key中最少使用的;2、淘汰所有key中最近最少使用的;

3、过期key中随机淘汰;4、所有key中随机淘汰;

5、设置过期时间的key中剩余过期时间最短的;

6、对于写请求不再提供服务器,直接返回错误;

redis持久化机制

redis持久化有RDB和AOF两种方式

RDB:指redis指定时间去生成数据快照,但是如果生成快照过程中redis崩溃则会丢失数据

生成数据的方式有BGSAVE,redis会fork出一个子进程去生成快照,父进程处于阻塞状态,当子进程生成快照后父进程继续处理;save命令,当redis执行save命令是开始生成快照,此时redis在生成快照完毕前不会处理任何命令,可以通过设置save 60 1000即60秒内处理1000条数据会触发BGSAVE;shutdown 若触发shutdowm命令,则开始save生成快照,快照生成完毕,redis服务器停止服务;

AOF:redis每执行一条命令,会追加到aof文件中;

aof有两种文件写入方式:1)append always,总是写入redis的命令,此种方式能避免数据丢失,但是影响redis的速度;2)append synscend。按秒写入文件,可能会丢失一秒内的数据

Redis持久化机制_不知努力的bd的博客-CSDN博客_redis持久化机制

redis

Redis?它主要用来什么的_码农汉子的博客-CSDN博客_redis

为什么要使用redis而不是把数据放在本地内存中? - 知乎

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐