redis 学习

在Java程序中使用redis

Jedis

在Java代码中使用redis,引用redis包,使用一个 Jedis 类 ,这个类是可以和 redis数据库直接交互的。

JedisPool JedisPoolConfig

使用流水线技术,访问redis,提供读写效率

在spring中使用redis

1  因为要使用到连接池,所以需要对连接池进行配置,配置对象 JedisPoolConfig  ,配置空闲数,连接数,最大等待时间

2  连接工厂RedisConnectionFactory接口,4个实现类 JedisConnectionFactory , JredisConnectionFactory ,  LettuceConnectionFactory  , SrpConnectionFactory 。连接工程配置端口和主机,jedispoolconfig,密码。

普通的方法,不能将对象保存到redis中,需要我们提供序列化方案,将对象序列化和反序列化。spring提供了封装方案,RedisSerializer 接口,它有实现类

3  RedisTemplate对象,拥有两个属性keySerializer , valueSerializer ,键序列器,值序列器,配置RedisPlate对象 需要引用 连接工厂 ,或者键值序列化器,也可以使用默认的序列化器。

redis 6 中操作数据类型

string list set  hash zset HyperLogLog基数

spring-data-redis对 有序集合的封装

TypedTuple 接口 ,一个内部接口,是ZSetOperations接口的内部接口。这个接口定义了两个方法 getValue getScore

默认的实现类DefaultTypedTuple 

RedisZSetCommods下的内部类Range ,对范围进行了封装

redis常用的技术

事务操作

mutil  开启事务

watch key1 [] 监听key1键,被监听的键在事务操作前执行,会触发事务回滚

unwatch key1[]

exec 执行事务

discard 回滚

在spring中使用redis事务,需要 借助 SessionCallBack 接口

 

watch监听原理,CAS技术

流水线pipelined

redisTemplate.executePipelined(callback)

发布/订阅

超时命令,如果redis的键超时了,redis不会收回它,而是标识它

哨兵模式

Java代码中使用哨兵,使用哨兵线程池 JedisSentinelPool 对象

spring代码中 使用哨兵,使用哨兵配置对象 JedisSentinelConfiguration 对象,它要传给连接工厂

redis和数据库整合,缓存整合

redis和数据库读操作

数据缓存往往会在redis设置超时时间,redis上的数据超时后,就不能从redis上读取超时的数据,只能从数据库读取,再缓存到redis。

redis和数据库写操作

写操作要考虑到一致性问题。

写操作时,谨慎点,从数据库读取数据,然后更新数据,再写入redis缓存。

使用spring机制整合redis缓存

缓存管理组件  CacheManager

spring3.1内置了5个缓存管理器

SimpleCacheManager 最为简单的缓存管理组件

NoOpCacheManager

ConcurrentMapCacheManager

CompositeCacheManager

EhCacheCacheManager Ehcache最为流行的缓存供应商,Java领域最为广泛的缓存。

 

redis和spring整合的缓存管理器

spring3.2

RedisCacheManager 需要redis服务器的缓存组件,要引用  RedisTemplate 对象, 设置超时时间,缓存名称,缓存名称是后面注解,如@Cacheable的name属性。

 

 

在配置类上开启缓存 @EnableCaching

 

@Cacheable:对请求参数和结果缓存,下次用同一个参数请求,就不再调用方法,直接从缓存中拿出数据 一般在缓存中查询数据,如果缓存没有,那么就会执行方法,然后缓存

@CacheEvict:清空缓存

@CachePut:更新缓存,在方法执行完毕之后,同时更新缓存中的对应的数据。方法一定会执行。

keyGenerator 缓存数据标记数据的主键生成策略 serialize 缓存数据,数据的序列化策略

 

@Caching 一个分组  @CacheConfig   复杂的配置

 

Cacheable属性introduce
value / cacheNames 缓存组件的名字,便于cachemanager识别cache
key 缓存数据使用的key, 缓存数据采用key-value的方式,default method_arg
keyGenerator key keyGenerator二选一
cacheManager / cacheResolver  
condition 符合条件的情况下才缓存
unless 与condition相反

不适用缓存的方法

使用缓存的前提,高命中率,如果一个方法是模糊查询,那么它每次根据请求的参数不同,结果都会不同,那么该方法的命中率低,不适合使用缓存。

自调用失效问题

和事务一样,自调用的方法会使缓存失效

原文地址:https://www.cnblogs.com/lin7155/p/13757457.html