【redis】-- 缓存(redis作为缓存使用)

目录

  • 1.redis的回收策略

    • redis的LRU回收算法
  • 2.关于redis作为缓存时出现的击穿,穿透,雪崩问题
    • 1.击穿
    • 2.穿透
    • 3.缓存雪崩

redis有两种使用方式一是作为数据库使用,二是作为缓存使用。

将redis作为缓存,当你新增数据时,让它自动地回收旧数据是件很方便的事情。这个行为在开发者社区非常有名,因为它是流行的memcached系统的默认行为。而redis回收数据LRU是redis唯一支持的回收算法。

1.Maxmemory配置指令
maxmemory配置指令用于配置Redis存储数据时指定限制的内存大小。通过redis.conf可以设置该指令,或者之后使用CONFIG SET命令来进行运行时配置。
例如为了配置内存限制为100mb,以下的指令可以放在redis.conf文件中。
maxmemory 100mb
设置maxmemory为0代表没有内存限制。对于64位的系统这是个默认值,对于32位的系统默认内存限制为3GB。
当指定的内存限制大小达到时,需要选择不同的行为,也就是策略。 Redis可以仅仅对命令返回错误,这将使得内存被使用得更多,或者回收一些旧的数据来使得添加数据时可以避免内存限制。

1.redis的回收策略

当maxmemory限制达到的时候Redis会使用的行为由 Redis的maxmemory-policy配置指令来进行配置。

以下的策略是可用的:

  • noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
  • allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
  • volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • allkeys-random: 回收随机的键使得新添加的数据有空间存放。
  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
  • volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

如果没有键满足回收的前提条件的话,策略volatile-lru, volatile-random以及volatile-ttl就和noeviction 差不多了。

选择正确的回收策略是非常重要的,这取决于你的应用的访问模式,不过你可以在运行时进行相关的策略调整,并且监控缓存命中率和没命中的次数,通过RedisINFO命令输出以便调优。

一般的经验规则:

  • 使用allkeys-lru策略:当你希望你的请求符合一个幂定律分布,也就是说,你希望部分的子集元素将比其它其它元素被访问的更多。如果你不确定选择什么,这是个很好的选择。.
  • 使用allkeys-random:如果你是循环访问,所有的键被连续的扫描,或者你希望请求分布正常(所有元素被访问的概率都差不多)。
  • 使用volatile-ttl:如果你想要通过创建缓存对象时设置TTL值,来决定哪些对象应该被过期。

allkeys-lru 和 volatile-random策略对于当你想要单一的实例实现缓存及持久化一些键时很有用。不过一般运行两个实例是解决这个问题的更好方法。

为了键设置过期时间也是需要消耗内存的,所以使用allkeys-lru这种策略更加高效,因为没有必要为键取设置过期时间当内存有压力时。

redis的LRU回收算法

redis的回收算法并非真正的LRU算法,而是依据redis而改造过的算法。Redis为什么不使用真实的LRU实现是因为这需要太多的内存。不过近似的LRU算法对于应用而言应该是等价的。

LRU算法关于redis的具体实现:http://ifeve.com/redis-lru/

2.关于redis作为缓存时出现的击穿,穿透,雪崩问题

1.击穿

缓存击穿:指的是在高并发的情况下(一定要是高并发情况,不然称不上击穿因为访问量低时,击穿不影响效率),在redis中设置的某一个或少量键因为超时被删除,或被回收算法回收不存在时(总之就是键被删除了),突然涌入大量的请求,请求被删除的键键。此时大量的请求穿过redis缓存,之间服务数据库,对数据库造成压力,导致数据库效率降低,或崩溃的情况

要解决缓存击穿问题,最主要是有多个线程同时服务一个数据造成了,问题的出现,所以要解决缓存击穿问题最好是加锁,让同一时间只有一个数据来访问从而缓解服务器的压力。

redis实现分布式锁:https://www.cnblogs.com/wf614/p/12275028.html

2.穿透

缓存穿透是指,大量请求请求数据库中不存在,导致请求越过redis缓存直接访问数据库,通过大量的查询操作,使数据库服务器不能正常提供服务的情况。

要解决缓存穿透的问题,那么就要让这些请求到达不了数据库。所以可以在redis中存储所有数据库中的数据信息,让redis阻挡这些请求。

可以使用布隆过滤器(bloom):

布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

所以,因为布隆过滤器存储数据占用的空间很小,可以先把数据库中的数据都存入布隆过滤器中,然后每次请求都先判断它请求的数据是否存在,如果存在在提供服务,否则就不提供服务。

如上图所说,因为布隆过滤器判断条件是根据hash算出来的。所以有可能造成误判,使请求不存在数据的请求到达数据库,不过这样的情况出现的可能性很小(>1%),所以可以使用布隆过滤器对数据进行,过滤。

不过布隆过滤器,不能删除数据,当数据库中某些数据被删除时,布隆过滤器中其对应的键还存在,这是也会出现问题。此时可以选用其他和布隆过滤器类似但可以进行更改的过滤器,如布谷鸟过滤器。

3.缓存雪崩

缓存雪崩:是指在某一个时间段因为大量的key到达过期时间,被删除,间接导致大量请求到达数据库的情况。

缓存雪崩和缓存穿透类似都是,因为某种原因导致key失效。不过而在最大的区别是,它们失效key的数量不一样。故不能通过解决穿透的方法来解决缓存雪崩。

要解决缓存雪崩问题,要分为两种情况:

1.失效的数据是时点型数据(时点型数据是指到没有数据的这些数据会失效,而我们不能预测新的数据是什么,即我们知道某些数据会在某个时间点被改变,而我们不知道数据被改变后的具体是什么,而被改变后存在redis缓存中的数据就成了无效数据的情况):这种情况我们可以在业务层添加计时器,到要过期的时间点时延时,在延时的时间里同步数据。

2.失效的不是时点数据而是热数据:我们可以给这些数据设置随机超时时间,使大量数据不在同时过期。

原文地址:https://www.cnblogs.com/wf614/p/12331709.html

时间: 2024-10-06 03:40:22

【redis】-- 缓存(redis作为缓存使用)的相关文章

nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存

一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发生单点故障,并且单服务器需要处理所有的请求会导致压力较大. 单台Redis服务器内存容量有限,不易扩展. 第一个问题可以通过Redis主从模式实现单节点的高可用(HA). 从节点(slave)是主节点(master)副本,当主节点(master)宕机后,Redis 哨兵(Sentinel)会自动将从

Java环境配置 数据库 缓存Redis Nosql MongoDB 安装

系统选择 centos 7.0 1.java安装篇 rpm -qa |grep java 检测是否java yum remove java-1.7.0-openjdk 使用命令删除java 到oracle官方下载java安装包 rpm -ivh jdk-7u60-linux-x64.rpm ->安装jdk 2.Tomcat 安装篇 在apache官方下载tomcat wget http://apache.fayea.com/apache-mirror/tomcat/tomcat-7/v7.0.5

spring + redis 实现数据的缓存

1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错.因为commons-pooljar的目录根据版本的变化,目录结构会变.前面的版本是org.apache.pool,而后面的版本是org.apache.pool2... style=" color: white; font-size: 17px; font-weight: bo

第九章 企业项目开发--分布式缓存Redis(1)

注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis 1.1.为什么用分布式缓存(或者说本地缓存存在的问题)? 见<第八章 企业项目开发--分布式缓存memcached> 1.2.有了memcached,为什么还要用redis? 见<第一章 常用的缓存技术> 2.代码实现 2.1.ssmm0 pom.xml 只在dev环境下添加了以下代码: <!-- redis:多台服务器支架用什么

关于缓存Redis

1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redi

第二百九十四节,Redis缓存-Redis安装

redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周

Redis之清除所有缓存

方法: /// <summary> /// 清除redis所有缓存 /// </summary> /// <param name="redisUrl"></param> public static void RemoveAllRedisCache(string redisUrl) { using (RedisClient redisClient = new RedisClient(redisUrl)) using (var redisMa

redis作为mysql的缓存服务器(读写分离) (转)

一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步.在部分场合可以对关系数据库起到很好的补充作用.它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便. 二.架构图<ignore_js_

企业项目开发--分布式缓存Redis

第九章 企业项目开发--分布式缓存Redis(1) 注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis 1.1.为什么用分布式缓存(或者说本地缓存存在的问题)? 见<第八章 企业项目开发--分布式缓存memcached> 1.2.有了memcached,为什么还要用redis? 见<第一章 常用的缓存技术> 2.代码实现 2.1.ssmm0 pom.xml 只在dev环境下添加了以下代码

(转)Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 (这里仅从数据缓存方面考虑,当然,后期可以采用Hadoop+HBase+Hive等分布式存储分析平台) 三.主流解Cache和数据库对比: 上述技术基本上代表了当今在数据存储方面所有的实现方案,其中主要涉及到了普通关系型数据库(MySQL/PostgreSQL),NoSQL数据