精华内容
下载资源
问答
  • Redis缓存机制

    2019-09-25 16:52:02
    Redis缓存机制 Redis介绍 Redis是一款内存高速缓存数据库; 数据模型为:key - value,非关系型数据库使用的存储数据的格式; 可持久化:将内存数据在写入之后按照一定格式存储在磁盘文件中,宕机、断电后可以...

    Redis缓存机制

    Redis介绍

    Redis是一款内存高速缓存数据库;

    数据模型为:key - value,非关系型数据库使用的存储数据的格式;

    可持久化:将内存数据在写入之后按照一定格式存储在磁盘文件中,宕机、断电后可以重启redis时读取磁盘中文件恢复缓存数据;

    分布式:当前任务被多个节点切分处理,叫做分布式处理一个任务。单个服务器内存,磁盘空间有限,无法处理海量的缓存数据,必须支持分布式的结构;

    nosql:not only structured query language 不仅仅结构化查询语言

      结构化数据:有规律的一类数据;例如:人的信息,动物信息,考试信息

      非结构化数据:海量的不具备任何共同特性的数据集合;例如:网页,日志;图片

      关系型数据库:体现不同类结构化数据之间的关系的数据,例如ORACLE mysql

      非关系型数据库:存储的是非结构化的海量数据;无法体现数据的关系;例如 mongoDB redis

    Redis缓存

    数据库缓存:

    sql语句时key值,查询结果resultSet是value,当同一个查询语句访问时(select * from t_product),只要曾经查询过,调用缓存直接返回resultSet,节省了数据库读取磁盘数据的时间。

    持久层缓存:

    减少了连接数据库的时间;减少了resultSet封装成对象的过程。

    业务层和控制层的缓存:

    减少调用层次。

    描述缓存在业务层的逻辑:

    查询商品信息

    判断当前查询在缓存是否有数据

      如果有数据,直接返回,当前请求结束;

      如果没有数据,查询持久层数据库数据,获取数据存储再缓存一份,供后续访问使用;

    缓存雪崩/缓存击穿

    海量请求访问服务器,服务器的性能由缓存支撑,一旦一定范围的缓存数据未命中,请求的数据访问涌入数据库;承受不了压力造成宕机--重启--海量请求并未消失--宕机--重启,系统长时间不可用;这种情况就是缓存的雪崩。

    Redis五种数据结构和内部编码

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)


    String(字符串)

    string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

    string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

    string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

    实例:

    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> set name hanlaoshi
    OK
    127.0.0.1:6379> set location beijing
    OK
    127.0.0.1:6379> keys *
    1) "location"
    2) "name"

     

     

    Hash(哈希)

    Redis hash 是一个键值(key=>value)对集合。

    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

    实例:

    redis> HMSET myhash field1 "Hello" field2 "World"
    "OK"
    redis> HGET myhash field1
    "Hello"
    redis> HGET myhash field2
    "World"

    List(列表)

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    127.0.0.1:6379> lpush mylist01 100 200 300
    (integer) 3
    
    127.0.0.1:6379> lrange mylist01 0 1
    1) "300"
    2) "200"

    Set(集合)

    Redis的Set是string类型的无序集合。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

    sadd 命令

    添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

    实例:

     

    redis 127.0.0.1:6379> sadd runoob redis
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob mongodb
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 0
    redis 127.0.0.1:6379> smembers runoob
    1) "redis"
    2) "rabitmq"
    3) "mongodb"

    注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

    集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

    zset(sorted set:有序集合)

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

    zset的成员是唯一的,但分数(score)却可以重复。

    zadd 命令

    添加元素到集合,元素在集合中存在则更新对应score

    实例:

     

    redis 127.0.0.1:6379> zadd runoob 0 redis
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 mongodb
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 0
    redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
    1) "mongodb"
    2) "rabitmq"
    3) "redis"

     

    内部编码

    实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。

    可以看到每种数据结构都有两种以上的内部编码实现,例如string数据结构就包含了raw、int和embstr三种内部编码。

    同时,有些内部编码可以作为多种外部数据结构的内部实现,例如ziplist就是hash、list和zset共有的内部编码。

    我们可以通过object encoding命令查询内部编码:

     

    127.0.0.1:6379> set set:1 hello
    OK
    127.0.0.1:6379> object encoding set:1
    "embstr"
    127.0.0.1:6379> hset user:1 name kebi
    (integer) 1
    127.0.0.1:6379> object encoding user:1
    "ziplist"

     

    展开全文
  • redis缓存机制

    万次阅读 2018-08-06 11:34:53
    redis提供了三种缓存机制,LFU,LRU,TTL 1.LFU,least frequently used,即最小使用频率淘汰,每个对象使用共计24bit空间用来实施这个算法,24bit分成2个部分,前16bit用来记录上次减少时间(减少的是后面8bit...

    redis提供了三种缓存机制,LFU,LRU,TTL

    1.LFU,least frequently used,即最小使用频率淘汰,每个对象使用共计24bit空间用来实施这个算法,24bit分成2个部分,前16bit用来记录上次减少时间(减少的是后面8bit计数器),后面8个bit是一个对数计数器,用来记录这个对象的访问次数。需要注意的是,这个字段不是一直增加的,也需要减少,否则会出现一个情况,一个对象很久之前被频繁的使用,但是最近没有被使用,若这个值不减少的话,那么这个对象会一直处在一个不会被淘汰的位置。前面16bit的作用就是,记录一个“减量时间”,这是一个降低精度的Unix时间,将16bit的时间转换成分钟,不关心回绕问题。若这个时间很大,那么8bit计数器的值减半,否则只是简单的每次递减1。

    2.LRU,last recently used,即最近最少使用淘汰,一般做法是,将hash表的value做成一个指针,指向一个双链表节点,节点中保存实际的value,双链表按照上次访问时间降序排列,当访问到一个对象之后,更新访问时间,并将这个节点移动到表头,若节点不存在就直接插入到表头。当内存门限达到的时候,从链表尾开始删除若干entry。redis为了减少内存使用,不使用双链表或其他结构管理对象,采用随机算法,每次从hash表中随机选择一些key,一般是5个,将这些key存入一个全局的池,池大小一般是16,池中entry按照上次访问时间降序排列,每次从池中选择尾部的entry,就是最差的对象,将这个对象淘汰。

    server.h中声明的宏

    #define LRU_BITS 24
    #define LRU_CLOCK_MAX ((1 << LRU_BITS) - 1) /* Max value of obj->lru */
    #define LRU_CLOCK_RESOLUTION 1000 /* LRU clock resolution in ms */

    其中,LRU_BITS是管理LRU相关内容需要占用的内存大小,会嵌入对象结构中,LRU_CLOCK_MAX是24bit的掩码,LRU_CLOCK_RESOLUTION是时钟精度,基于ms,这里1000的意思是ms / 1000,得到的就是秒

    3.TTL,即生存时间,按照生存时间设置一个对象的生命周期,一个对象生命周期结束之后将其销毁

    evict.c中声明的结构

    #define EVPOOL_SIZE 16
    #define EVPOOL_CACHED_SDS_SIZE 255
    struct evictionPoolEntry
    {
        unsigned long long idle;    /* Object idle time (inverse frequency for LFU) */
        sds key;                    /* Key name. */
        sds cached;                 /* Cached SDS object for key name. */
        int dbid;                   /* Key DB number. */
    };
    
    static struct evictionPoolEntry *EvictionPoolLRU;

    其中,EVPOOL_SIZE定义了池的大小,即池中最多容纳16个entry。EVPOOL_CACHED_SDS_SIZE定义了缓存大小,是字节数。entry结构中,idle是一个LRU和LFU共用的字段,当使用LRU的时候,这个字段的含义是对象的空闲时间,当使用LFU的时候,这个时间是反向频率,这是为了编码的时候保持一致,因为在LRU中,空闲时间越大,这个对象越应该被淘汰,LFU是让频率越小的越容易被淘汰,为了在LFU中复用这个字段,使用255 - 频率得到一个反向频率,从而也是值越大越倾向于被淘汰。key就是hash表中key的名字,cached是缓存,目的是不希望多次申请和释放内存,当key存在的时候,cached中的值就是缓存的key的值,key释放的时候,cached不必清零。

    evict.c中提供的用于LRU算法的api:

    getLRUClock:返回当前时间,是秒数,取后24位

    LRU_CLOCK:获取当前时间,根据精度判断是否可以使用getLRUClock,例如,若更新对象频率太快,导致在同一个时间精度下发生2次或者以上,那么这两次对象操作时间无法突破了精度粒度,是一样的,就无法决定这两个对象应该淘汰哪个

    estimateObjectIdleTime:获取一个对象的idle时间,方法是用当前时间减上次访问时间,显然,得到的idle时间越大,此对象越倾向于被淘汰

    evictionPoolAlloc:创建一个用于LRU算法的池结构,全局有一个池就够了

    evictionPoolPopulate:从字典中随机选取若干key加入池,池按照访问时间降序排序,也就是按照idle时间升序排序,池中的entry使用缓存,若key不是很长的话,保存在缓存中,这样就不用多次申请和释放内存。只要池中有空的entry,那么key一定能加进来,否则把key和池中保存的所有key比较一下,把idle时间最小的从池中移除

    evict中提供的用于LFU算法的api:

    LFUGetTimeInMinutes:返回当前时间,单位是分钟,取后16bit

    LFUTimeElapsed:返回当前时间和某个对象上次访问时间的差值,是分钟,内部会处理回绕

    LFULogIncr:对数增加一个LFU计数器的值,内部其实是一个随机,counter越大,越不容易加,从而保证一个对数实现

    LFUDecrAndReturn:获取一个对象的LFU计数器的值,当对象递减时间到达,减少LFU计数器但是不更新对象的LFU字段,显式更新对象的访问时间和计数器值当一个对象真正被访问到的时候

    freeMemoryGetNotCountedMemory:返回AOF和slave buffer占用的内存,在内存到达门限之后要清理的内存不应该包括这两个部门,用此函数计算这两个部分占用内存的值

    freeMemoryIfNeeded:清理内存机制的主函数,每次server命令都调用此函数检查内存情况,持续随机找key删除,直到内存降到门限以下。可以改进增加每次删除key的次数,否则虽然降低到门限以下,很快又会达到

    展开全文
  • redis缓存机制测试点总结

    千次阅读 2020-07-16 21:40:13
    背景 Redis作为一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件。redis最长用的就是作缓存,本文主要介绍redis缓存机制测试

    背景

    Redis作为一个开源的、基于内存数据结构存储器,可以用作数据库缓存消息中间件。redis最常用的就是缓存,可以缓解数据库压力;如果数据是从第三方接口请求获取,从而提升性能;本文主要介绍redis缓存机制测试思路及测试步骤

    测试思路

    测试的很大一部分工作是整理测试思路,即合理的测试点。根据实际经验总结redis测试点如下:

    1. 缓存时间设置合理性。缓存时间设置,需要根据数据更新的频次合理设置;缓存时间太长会导致用户访问到的数据一直是老的,缓存设置时间太短对数据库访问会比较频繁。所以最好调研清楚实际数据更新的频次,再去设置缓存时间

    2. 存储逻辑合理性。这个以两个维度去测试:
      1. 服务端或数据库返回数据正确性。返回异常,不应该缓存;返回数据正常,才缓存;
      2. 存储缓存时查询条件。比如要缓存歌曲信息,可以查询歌名缓存也可以查询歌手缓存歌曲list;根据业务实际需求确认。
    3. 缓存读取逻辑合理性。以下是比较合理的逻辑:
      • 有缓存,优先读取缓存;
      • 无缓存,请求接口或查数据库获取数据;并存储缓存
    4. 缓存更新逻辑
      • 缓存失效后是否会更新缓存的内容
    5. 缓存内容
      • ​​​​​​​redis缓存具体内容是否正确、格式(list、string)是否合理、实际每次缓存的数据数是否与需求一致
    6. 缓存数据重复
      • ​​​​​​​同样的数据触犯缓存之后只有一条在redis缓存中可以查到,重复缓存会浪费资源

    测试步骤

    确认未缓存数据->使用未缓存数据参数请求接口->使用同一数据,再次请求->第二次请求响应时长,应该比第一次明显要少;

    展开全文
  • SpringBoot通过注解实现redis缓存机制 @Cacheable 查询 @CachePut 修改 @CacheEvict 删除 下面展示一些 内联代码片。 @Cacheable 查询 // An highlighted block //key:这边以dto类中的部门id 作为键 并加上一段...

    SpringBoot通过注解实现redis缓存机制

    1. @Cacheable 查询
    2. @CachePut 修改
    3. @CacheEvict 删除
      下面展示一些 内联代码片
    @Cacheable 查询
    
    // An highlighted block
    //key:这边以dto类中的部门id 作为键 并加上一段字符串 利于后面很好的维护代码
     @Cacheable(value = "getSchoolById", key = " #userDto.getDepartmentId() +'getFunctionTreeValue' ")
        public String redis(UserDto userDto) {
            Department byId = departmentMapper.getById(userDto.getDepartmentId());
            log.info("访问了数据库");
            return ResultInfo.success(byId.getDepartmentName());
        }
    

    实现效果:
    第一次 去redis查询 查不到 去数据库查询 这时会在日志中打印 == 访问了数据库== 第二次访问就会通过key (如果你两次都是同一个部门id) 就会直接去redis 拿 后台也不会打印日志

    @CachePut 修改
    
    //同理也是需要用同样的key
    @Cacheable(value = "getSchoolById", key = " #userDto.getDepartmentId() +'getFunctionTreeValue' ")
        public ResultInfo updateRedis(UserDto userDto) {
            Department department = new Department();
            department.setId(aiUserImportPhotoDto.getDepartmentId());
            department.setDepartmentName(aiUserImportPhotoDto.getStr());
            departmentMapper.updateByIdNoNull(department);
            log.info("访问了数据库");
            return ResultInfo.success(department.getDepartmentName());
        }
    
    
    注意:返回结果必须是一样的 因为redis 的值 就是你注解加的方法的返回值
    
    
    

    CacheEvict 删除 同理
    后续会有更新 过期时间的设置

    展开全文
  • 关于Redis缓存机制

    千次阅读 2018-05-24 17:57:47
    一、为什么要使用缓存技术?(1)持久化数据库的缺点关系型数据库有Mysql、Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查,数据全部存储在我们部署数据库的...
  • Redis缓存机制一为什么要用Redis

    万次阅读 2018-01-09 13:18:37
     Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人antirez(Salvatore Sanfilippo)开发的一款内存高速缓存数据库,该软件使用C语言编写,它的数据模型为key-value。  它支持丰富的数据结构(类型...
  • Redis缓存机制实现之前,我想先回顾一下mysql mysql存储在哪儿呢? 以windows为例,mysql的表和数据,存储在data 目录下frm ibd 后缀的文件中 mysql存储在机器/服务器的 硬盘中 所以mysql读写数据都需要...
  • django redis官方文档:简体中文版: http://django-redis-chs.readthedocs.io/zh_CN/latest/ 1.安装 pip install django-redis 2.为了使用 django-redis , 你应该将你的 django cache setting 改成这样 ...
  • Redis缓存机制】1.Redis介绍和使用场景

    万次阅读 多人点赞 2016-11-15 09:19:17
    Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人antirez(Salvatore Sanfilippo)开发的一款内存高速缓存数据库,该软件使用C语言编写,它的数据模型为key-value。 它支持丰富的数据结构(类型),...
  • 一 、简介 1.Redis的特点 Redis是一种非关系数据库(不会像Mysql一样多个表...官方回答 : 因为Redis是基于内存的,所以CPU不会是Redis的瓶颈,但是内存会是,而且多线程的实现比较麻烦,直接使用单线程更省事一点(PS:这...
  • Redis缓存机制和淘汰策略等(详解)

    千次阅读 2019-10-20 09:43:28
    Redis 1)Redis事务 Redis提供了一定是事务支持,可以保证一组操作原子执行不被打断,但是如果执行过程中出现错误,事务不能回滚,Redis未提供回滚支持。 multi 开启事务 exec 执行事务 使用multi开启事务后,操作...
  • Redis目前只支持Linux系统,因为开发此软件的创始者认为,Redis是为后台数据服务的,所以认为该软件使用在纯净的服务环境下,而不是应用型操作系统下,而Linux作为服务器操作系统的一哥,自然俘虏了Redis开发者的...
  • Redis缓存机制】10.主从模式

    千次阅读 2016-12-02 14:14:42
    redis的主从模式 (1)介绍 redis存储数据是在内存中运行的,运行速度比关系型数据库要快一些。而且它具有SortSet/Hash 等具有特色的数据类型,这是其它数据库无法比拟的。 redis有增删改查四种操作,和一般的数据库...
  • Redis缓存机制】3.key的操作

    千次阅读 2016-11-17 09:46:33
    我们之前使用Redis简单存储了三个参数: 在语句set name jack中,其中name就是一个key。我们Java中的变量名是有一定规则的, 比如组成内容可以是“数字”,“字母”以及“下划线”。 同理,key也有自己的命名规则:...
  • redis的主从模式之前提到过,这里我们使用redis来实现主从模式。 首先在VMware虚拟机中的Linux中打开两个终端,一个是用户jack,一个是newuser: 然后我们jack作为主机,redis服务运行在6379端口,我们设置newuser...
  • 到了我们处于VMware虚拟机上的Linux系统上的Redis服务,我们接下来 讲一下jedis的一些常用的API。 (1)jedis存储字符串 package cn.com.redis; import redis.clients.jedis.Jedis; public class Test1 { pu
  • redis缓存机制 保证数据一致性问题

    千次阅读 2015-03-06 16:16:23
    redis设置失效时间后,如果需要在未失效时保证数据一致就需要在更新数据库的同时更新redis,若是在放入redis同时需要存入mongodb等非关系型数据库,可以将消息放入一些消息机制,这样以保证数据一致性。
  • 使用Java开发项目的时候使用Redis的话,目前有一些开源API可以使用。 最常用的就是jedis,它提供了许多基于Java的对象和方法来调用Redis的指令。 jedis的jar包下载地址...
  • String类型操作 1.set key value 设置key对应的值为string类型的value 2.mset key1 value1 … keyN valueN 一次设置多个key的值 3.mget key1 key2 … keyN 一次获取多个key的值 4.incr key
  • 持久化功能redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会把硬盘中的数据恢复到内存(redis)的里边。数据保存到硬盘的过程就称为“持久化”效果redis有两种持久化功能...
  • 数据类型Hash (1)介绍 hash数据类型存储的数据与mysql数据库中存储的一条记录极为相似 ...Redis里面又有一个小型redis一样。 (2)操作 hset key field value 设置hash field为指定值,如果key不存
  • Set集合类型(1)介绍redis的set是string类型的无序集合set元素最大可以包含(2的32次方-1)个元素关于set集合类型除了基本的添加删除操作,其它有用的操作还包含集合的取并集(union),交集(intersection),差集...
  • 我们的Redis也有事务管理对象,其位于redis.clients.jedis.Transaction下。 Jedis事务的相关代码: package cn.com.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; ...
  • redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器 重启之后会把硬盘中的数据恢复到内存(redis)的里边。 数据保存到硬盘的过程就称为“持久化”效果。 redis有两种持久化功能,一...
  • Sort Set排序集合类型 (1)介绍 和set一样sorted set也是string类型元素的集合, 不同的是每个元素都会关联一个权。 通过权值可以有序的获取集合中的元素 该Sort Set类型适合场合: ...(以上需求可以通过简单sql

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,178
精华内容 42,471
关键字:

redis缓存机制

redis 订阅