Redis简介

Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。本文介绍Redis在Spring Boot中两个典型的应用场景。

场景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=localhost
spring.redis.password=
spring.redis.database=0

注册RedisCacheManager:

@Configuration
@EnableCaching
public class CacheConfig { @Autowired
private JedisConnectionFactory jedisConnectionFactory; @Bean
public RedisCacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
return redisCacheManager;
} @Bean
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
// 使用String格式序列化缓存键
redisTemplate.setKeySerializer(new 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的典型应用场景,除此之外,还有分布式锁,全局计数器等高级应用场景,以后在其他文章中再详细介绍。

参考

http://emacoo.cn/blog/spring-redis

【Spring】Redis的两个典型应用场景--good的更多相关文章

  1. Redis的两个典型应用场景

    Redis简介 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Red ...

  2. Spring系列之Redis的两种集成方式

    在工作中,我们用到分布式缓存的时候,第一选择就是Redis,今天介绍一下SpringBoot如何集成Redis的,分别使用Jedis和Spring-data-redis两种方式. 一.使用Jedis方 ...

  3. redis之(二十一)redis之深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  4. 深入理解Spring Redis的使用 (一)、Spring Redis基本使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  5. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

  6. Redis基础知识之—— 缓存应用场景

    转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端- ...

  7. spring redis入门

    小二,上菜!!! 1. 虚拟机上安装redis服务 下载tar包,wget http://download.redis.io/releases/redis-2.8.19.tar.gz. 解压缩,tar ...

  8. Redis+Caffeine两级缓存,让访问速度纵享丝滑

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中, ...

  9. 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景

    作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...

随机推荐

  1. (转)使用getevent监听Android输入设备文件

    尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节Android事件分发完全解 ...

  2. android连接本地tomcat服务器,报timeout

    1.在eclipse环境下连接时,没有任何问题 2.直接将服务端发布到tomcat服务下,报timeout 3.查明原因: 3.1打开IE访问,一切正常,可以获取到数据,说明不是服务端的问题 3.2打 ...

  3. Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_100_CI_AS" in the equal to operation.

    ErrorMessage Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" ...

  4. android studio出现 waiting for adb

    cmd进入命令行,进入adb所在的目录下: 出现的鬼异问题如下. C:\Users\xxxx>adb start-server adb server is out of date. killin ...

  5. MarkdownPad2添加目录(输出为HTML时可用)

    平时看书的时候懒得上网写在线博客,就在电脑上用了很长时间的MarkDownPad2来记录自己的心得笔记,等那天高兴了再把他们贴出来.界面清爽,是我使用它最重要的原因,但是MarkdownPad2导出的 ...

  6. C# 该行已经属于另一个表 的解决方法[转]

    该文转自:http://blog.sina.com.cn/s/blog_48e4c3fe0100nzs6.html DataTable dt = new DataTable(); dt = ds.Ta ...

  7. SUID ,SGID ,Sticky

    SUID passwd:s SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者: chmod u+s FILE chmod u-s FILE 如果FILE本身原来就有执行权限, ...

  8. JavaScript跨域总结与解决办法(转)

    JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首先什么是跨域 ...

  9. MacOS Cocos2d-x-3.2 创建HelloWorld项目

    开发环境: Mac OSX 10.9.3 Cocos2d-x-3.2 首先,打开终端cd到目录/cocos2d-x-3.2/tools/cocos2d-console/bin下,运行cocos.py脚 ...

  10. HDAO

    dx11 hdao10.1 除了dx的sample竟然搜不到什么文档.... 估计去问别人也是让我继续看代码.. ---------------------------------------- 算法 ...