在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 复杂的配置
introduce | |
---|---|
value / cacheNames | 缓存组件的名字,便于cachemanager识别cache |
key | 缓存数据使用的key, 缓存数据采用key-value的方式,default method_arg |
keyGenerator | key keyGenerator二选一 |
cacheManager / cacheResolver | |
condition | 符合条件的情况下才缓存 |
unless |
不适用缓存的方法
使用缓存的前提,高命中率,如果一个方法是模糊查询,那么它每次根据请求的参数不同,结果都会不同,那么该方法的命中率低,不适合使用缓存。
自调用失效问题
和事务一样,自调用的方法会使缓存失效