• Redis缓存简述


    Redis

    用缓存 : 提前把数据取出来保存好(通常保存到读写更快的介质 , 比如内存) , 就可以更快地读写

    缓存分类

    分布式缓存

    Redis(分布式缓存)

    memcached(分布式)

    Etcd(云原生架构的一个分布式存储 , 存储配置 , 扩容能力)

    单机缓存 (存在问题 : 数据不一致)

    ehcache

    java内存集合 , 如HashMap

    caffeine(java内存缓存 , 高性能)

    Google Guava

    Redis缓存实现

    NoSQL 数据库

    key - value 存储系统 (区别 MySQL , 它存储的是键值对)

    Redis 数据结构

    基本

    String 字符串类型 : name : "String"

    List 列表 : name : ["List1","List1","List2"]

    Set 集合 : name : ["Set1" , "Set2"]

    Hash 哈希 : name : { "name1" : "Hash" , "name2" : "Hash2"}

    Zset 集合 : name : {name1 - 9 , name2 - 8} (适合做排行榜)

    高级

    bloomfilter (布隆过滤器 , 主要从大量的数据中快速过滤值, 比如邮件黑名单拦截)

    geo (计算地理位置)

    hyperlglog (pv /uv)

    pub /sub (发布订阅 , 类似消息队列)

    BitMap (10101010010101010101010)

    自定义序列化

    为了防止写入 Redis 的数据乱码 , 浪费空间等 , 可以自定义序列化器 .

    1. @Configuration
    2. public class RedisConfig {
    3.    @Bean
    4.    @SuppressWarnings("all")
    5.    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    6.        RedisTemplate objectObjectRedisTemplate = new RedisTemplate<>();
    7.        objectObjectRedisTemplate.setConnectionFactory(redisConnectionFactory);
    8.        //设置KEY 序列化使用 String 字符串
    9.        objectObjectRedisTemplate.setKeySerializer(RedisSerializer.string());
    10.        objectObjectRedisTemplate.setHashKeySerializer(RedisSerializer.string());
    11.        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
    12.        //设置Value 序列化 格式
    13.        objectObjectRedisTemplate.setValueSerializer(jsonRedisSerializer);
    14.        objectObjectRedisTemplate.setHashValueSerializer(jsonRedisSerializer);
    15.        return objectObjectRedisTemplate;
    16.   }
    17. }

    Java 操作 Redis

    Spring Data Redis (推荐)

    Spring Data : 通用的数据访问框架 , 定义一组 增删改查 的接口

    还可以操作 : mysql , reids , jpa

    1)引入依赖

    1.    org.springframework.boot
    2.    spring-boot-starter-data-redis

    2)配置 Reids

    1. #redis 有关
    2. redis:
    3.  database: 1
    4.  host: 127.0.0.1
    5.  port: 6379

    Jedis

    独立于Spring 操作 Redis 的 Java客户端

    配合Jedis Pool 使用

    Redisson

    分布式操作 Redis 的 Java 客户端 , 让你像在使用本地的集合一样操作Redis (分布式 Redis 数据网路)

    JetCache

    不在阐述

    对比:

    1.如果用Spring , 并且没有过多的定制化要求 , 可以用 Spring Data Redis , 最简单

    2.如果你用的不是Spring , 并且追求简单 , 并且没有过高的性能要求 , 可以用Jedis + Jedis Pool

    3.如果你用的不是Spring , 并且追求高性能 , 高定制化 , 可以用Lettue ,支持异步 ,连接池

    缓存预热

    问题 : 即使用了缓存 , 第一个用户的访问还是很慢 (假如第一个访问的是老板 直接毕业)

    缓存预热的优点 :

    1.解决上面的问题, 可以让用户始终访问很快

    2.也能一定程度上保护数据库

    缺点 :

    1.增加开发成本

    2.预热的时机和时间如果错了 , 有可能缓存的数据不对或者太老

    3.需要占用额外空间

    怎么缓存预热

    1.定时任务

    2.手动触发

    实现

    用定时任务,每天刷新所有用户的推荐列表 .

    注意点:

    1.缓存预热的意义 ((新增少、总用户多)

    2.缓存的空间不能太大,要预留给其他缓存空间

    3.缓存数据的周期 (此处每天一次)

    定时任务实现

    1.Spring Schedule (Spring boot 默认整合了)

    2.Quartz(独立于Spring 存在的定时任务框架)

    3.XXL-job 之类的分布式任务调度平台(界面 + sdk)

  • 相关阅读:
    Redis的过期删除策略
    【李宏毅】机器学习-RNN
    【Gensim概念】03/3 NLP玩转 word2vec
    职场新人向老板汇报工作时,需要注意什哪些事项?
    ORB-SLAM2 ---- ExtractorNode::DivideNode函数
    Python爬虫(二十三)_selenium案例:动态模拟页面点击
    Apache Tomcat安装、运行
    C/C++:指针用法详解
    python项目制作docker镜像,加装引用模块,部署运行!
    Shell脚本攻略:Linux防火墙(二)
  • 原文地址:https://blog.csdn.net/sytdsqzr/article/details/133580924