首先为什么要用redis。性能和并发,分布式锁也很方便。
redis的优缺点
缺点:Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片。
没有索引,没有外键,缺少int/date等基本数据类型,多条件查询需要通过集合内联(sinter,zinterstore) 和连接间接实现开发效率低,可维护性不佳。
优点:redis支持持久化操作。redis提供了两种不同的持久化方法来讲数据存储到硬盘里面,第一种是rdb形式,一种是aof形式。
没有Scheme约束,数据结构的变更相对容易,一开始确定数据类型,抗压能力强,性能极高,10万/qps
Redis 定时、定期等多种缓存失效机制,减少内存泄漏
redis支持五种数据类型
redis五种数据类型建议的应用场景
https://blog.csdn.net/hcmony/article/details/80694560

redis集群和分布式
Redis有三种集群模式,第一个就是主从模式,第二种“哨兵”模式,第三种是Cluster集群模式,第三种的集群模式是在Redis 3.x以后的版本才增加进来的,我们今天就来说一下Redis第一种集群模式:主从集群模式。
具体怎么搭建?为什么叫集群分布式?不是集群/分布式?

redis哨兵是什么?
看文章也是集群模式中的一种

缓存的收益和成本
1、缓存带来的回报
1)高速读写
缓存加速读写速度:CPU L1/L2/L3 Cache、Linux page Cache加速硬盘读写、浏览器缓存、Ehcache缓存数据库结果
2)降低后端负载
后端服务器通过前端缓存降低负载: 业务端使用Redis降低后端MySQL负载等
2、缓存带来的代价
1)数据不一致
缓存层和数据层有时间窗口不一致,和更新策略有关
2)代码维护成本
原本只需要读写MySQL就能实现功能,但加入了缓存之后就要去维护缓存的数据,增加了代码复杂度。
3)堆内缓存可能带来内存溢出的风险影响用户进程,如ehCache、loadingCache

               堆、java虚拟机栈、方法区、本地方法栈、程序计数器 

               堆内缓存和远程服务器缓存redis的选择

               1、堆内缓存一般性能更好,远程缓存需要套接字传输

               2、用户级别缓存尽量采用远程缓存

               3、大数据量尽量采用远程缓存,服务节点化原则

缓存雪崩
如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU 和内存造成巨大压力,严重的会造成数据库宕机。
解决方案在小d课堂的笔记里 不沾上来了
缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到对应key的value,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库

配置redis
docker安装redis教程很多 再用到的时候自己搜一下吧
pom:

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

application.properties:
#=========redis基础配置=========
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6390
#连接超时时间 单位 ms(毫秒)
spring.redis.timeout=3000

        #=========redis线程池设置=========
        #连接池中的最大空闲连接,默认值也是8。
        spring.redis.pool.max-idle=200

        #连接池中的最小空闲连接,默认值也是0。
        spring.redis.pool.min-idle=200

        #如果赋值为-1,则表示不限制;pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        spring.redis.pool.max-active=2000

        #等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时
        spring.redis.pool.max-wait=1000

工具类:br/>@Resource
private StringRedisTemplate stringRedisTemplate;
RedisTemplate中定义了5种数据结构操作
redisTemplate.opsForValue();  //操作字符串
redisTemplate.opsForHash();   //操作hash
redisTemplate.opsForList();   //操作list
redisTemplate.opsForSet();   //操作set
redisTemplate.opsForZSet();   //操作有序set
主要学习了opsForList的一些用法。range是取值 不影响集合,leftpop rightpop是弹出值
外网访问配置:
protected-mode no

redistemplate存储的key的value带有乱码\xAC\xED\x00\x05sr\x00\x11java.lang.Integer\x12\xE2\xA0\xA4\xF7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xAC\x95\x1D\x0B\x94\xE0\x8B\x02\x00\x00xp\x00\x00\x00\x02
解决方法:

@Configuration
public class RedisConfigurtion {

    @Autowired
    private RedisTemplate redisTemplate;

    @Bean
    public RedisTemplate stringSerializerRedisTemplate() {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        return redisTemplate;
    }

}

常用的五种redis数据类型略过,着重看zset 看看是怎么回事。
与set一样不允许有重复的元素,但score可以重复。

下午拿回耳机继续redis的demo
因为在service层需要加注解@Service ,但实现的接口也叫service,导致注解只能写这个@org.springframework.stereotype.Service。以后不要犯。

几个常用的方法
add add("zset1","zset-1",1.0))新增一个有序集合
remove remove("zset1","zset-6"))从有序集合中移除一个或者多个元素
range range("zset1",0,-1));0至-1是所有, 0至99是 去分数0-99的所有数据
size 获取有序集合的成员数,内部调用的就是zCard方法
incrementScore incrementScore("zset1","zset-1",1.1));增加元素的score值,并返回增加后的值
rank rank("zset1","zset-2"));返回有序集中指定成员的排名,其中有序集成员按分数值递增(从小到大)顺序排列
range range("zset1",0,-1))通过索引区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列 注意下表也是从0开始的 如果 1, 10 那么实际是相当于第二名开始的。


ok简单的redis操作就看这些吧
redis自己写了一个缓存demo 相比 mysql着实快了不少

其中有几点以后需要的时候再看
redis的二级缓存和redis的事物机制,数据持久化的方式rdb和aof细节 有什么用?redis作为mybatis缓存整合讲解/CacheConfig作用?

向王哥请教redis和mybatis二级缓存 并不常用,并且有场景限制,适合数据不怎么变动的场景,比如一两个月变一次。频繁变动是不适合的。