【Spring】Redis的两个典型应用场景
来源:互联网 发布:爱淘宝每日抽红包链接 编辑:程序博客网 时间:2024/06/13 12:29
<h1 class="page-title center"> 【Spring】Redis的两个典型应用场景</h1></div><div class="meta center">
<i class="fa fa-tag"></i> <a href="/categories/backend/">backend</a> <i class="fa fa-tag"></i> <a href="/tags/原创/">原创</a>·<a href="/tags/Spring/">Spring</a></div><hr><div class="picture-container"></div><h2 id="Redis简介"><a href="#Redis简介" class="headerlink" title="Redis简介"></a>Redis简介</h2><p class="animation"><a href="http://redis.io/" target="_blank" rel="external">Redis</a>是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。本文介绍Redis在Spring Boot中两个典型的应用场景。</p>
场景1:数据缓存
第一个应用场景是数据缓存,最典型的当属缓存数据库查询结果。对于高频读低频写的数据,使用缓存可以第一,加速读取过程,第二,降低数据库压力。通过引入spring-boot-starter-redis依赖和注册RedisCacheManager,Redis可以无缝的集成进Spring的缓存系统,自动绑定@Cacheable, @CacheEvict等缓存注解。
引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId></dependency>
Redis配置(application.properties):
# REDIS (RedisProperties)spring.redis.host=localhostspring.redis.password=spring.redis.database=0
注册RedisCacheManager:
@Configuration@EnableCachingpublic class CacheConfig {
@Autowiredprivate JedisConnectionFactory jedisConnectionFactory;@Beanpublic RedisCacheManager cacheManager() { RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate()); return redisCacheManager;}@Beanpublic RedisTemplate<Object, Object> redisTemplate() { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>(); redisTemplate.setConnectionFactory(jedisConnectionFactory); // 开启事务支持 redisTemplate.setEnableTransactionSupport(true); // 使用String格式序列化缓存键 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); return redisTemplate;}
}
@Cachable, @CacheEvict使用,Redis中的存储结构可参见场景2中的配图:
@Cacheable(value="signonCache", key="'petstore:signon:'+#username", unless="#result==null")
public Signon findByName(String username) {
return dao.fetchOneByUsername(username);
}@CacheEvict(value="signonCache", key="'petstore:signon:'+#user.username")
public void update(Signon user) {
dao.update(user);
}
- @Cacheable: 插入缓存
- value: 缓存名称
- key: 缓存键,一般包含被缓存对象的主键,支持Spring EL表达式
- unless: 只有当查询结果不为空时,才放入缓存
- @CacheEvict: 失效缓存
Tip: Spring Redis默认使用JDK进行序列化和反序列化,因此被缓存对象需要实现java.io.Serializable接口,否则缓存出错。
Tip: 当被缓存对象发生改变时,可以选择更新缓存或者失效缓存,但一般而言,后者优于前者,因为执行速度更快。
Watchout! 在同一个Class内部调用带有缓存注解的方法,缓存并不会生效。
场景2:共享Session
共享Session是第二个典型应用场景,这是利用了Redis的堆外内存特性。要保证分布式应用的可伸缩性,带状态的Session对象是绕不过去的一道坎。一种方式是将Session持久化到数据库中,缺点是读写成本太高。另一种方式是去Session化,比如Play直接将Session存到客户端的Cookie中,缺点是存储信息的大小受限。将Session缓存到Redis中,既保证了可伸缩性,同时又避免了前面两者的限制。
引入依赖:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
Session配置:
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400)
public class SessionConfig {
}
- maxInactiveIntervalInSeconds: 设置Session失效时间,使用Redis Session之后,原Boot的server.session.timeout属性不再生效
Redis中的session对象:
小结
上面结合示例代码介绍了数据缓存,共享Session两个Redis的典型应用场景,除此之外,还有分布式锁,全局计数器等高级应用场景,以后在其他文章中再详细介绍。
参考
- Spring Data Redis
- Spring Cache抽象详解
- HttpSession with Redis
- 【Spring】Redis的两个典型应用场景
- ZooKeeper 典型的应用场景
- ZooKeeper 典型的应用场景
- ZooKeeper 典型的应用场景
- redis---应用的场景
- redis---应用的场景
- redis应用的场景
- Redis的应用场景
- redis的应用场景
- redis的应用场景
- Redis的应用场景
- redis的应用场景
- Redis的应用场景
- Redis的应用场景
- Redis的应用场景
- spring schedule的几个典型使用场景
- Hadoop的五个典型应用场景
- goto的一个典型应用场景
- An introduction to machine learning with scikit-learn
- 通过curl调用接口,因证书问题而调用失败的解办法
- jQuery+zTree加载树形结构菜单
- 密码及口令爆破
- JAVA基础之认识计算机
- 【Spring】Redis的两个典型应用场景
- TCP与UCP协议,及socket编程
- 三角形计数-LintCode
- 中国省市县sql语句
- 平衡二叉树
- visual studio 2017 问题记录
- java+selenium
- (面试系列)--隐式转换 and '==' '==='
- @keyframes简介(初级)