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);
         // 开启事务支持
         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的典型应用场景,除此之外,还有分布式锁,全局计数器等高级应用场景,以后在其他文章中再详细介绍。

Redis的两个典型应用场景的更多相关文章

  1. 【Spring】Redis的两个典型应用场景--good

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

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

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

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

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

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

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

  5. ZooKeeper典型应用场景

    ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例 ...

  6. 从Paxos到ZooKeeper-三、ZooKeeper的典型应用场景

    ZooKeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布与订阅.另一方面,通过对ZooKeeper中丰富的数据节点类型进行交叉使用,配合Watc ...

  7. ZooKeeper典型应用场景一览

    原文地址:http://jm-blog.aliapp.com/?p=1232 ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据 ...

  8. ZooKeeper典型应用场景(转)

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题.网上 ...

  9. DaemonSet 典型应用场景 - 每天5分钟玩转 Docker 容器技术(129)

    Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. DaemonS ...

随机推荐

  1. centos8下gz,bz2,zip压缩解压缩

    for gz 1.制作压缩包 [root@192 mnt]# tar czf mydir.tar.gz mydir1/ 2.解压gz 压缩包 [root@192 mnt]# tar xvf mydir ...

  2. Spring Boot Web 开发@Controller @RestController 使用教程

    在 Spring Boot 中,@Controller 注解是专门用于处理 Http 请求处理的,是以 MVC 为核心的设计思想的控制层.@RestController 则是 @Controller ...

  3. 吴裕雄 python 神经网络——TensorFlow 输入数据处理框架

    import tensorflow as tf files = tf.train.match_filenames_once("E:\\MNIST_data\\output.tfrecords ...

  4. 【转】ssh 远程执行命令

    原文:https://blog.csdn.net/liuxiao723846/article/details/82667482 SSH 是 Linux 下进行远程连接的基本工具,不光可以登录,也可以远 ...

  5. 临时解决执行 Composer Install 返回 Killed 的问题

    昨天在 Linux 服务器上部署 PHP 项目时遇到了一个问题,系统为 Centos 7 ,1 核 1G 的配置.通过 Git 拉取代码后,由于是基于 Laravel 框架的项目,所以需要使用 Com ...

  6. Mac终端ls颜色设置

    mac自带的终端是款非常好用的ssh工具,但ls命令下文件与文件夹都是单一的颜色,为了更好区分,作出修改. 终端默认背景颜色为白色,(终端->偏好设置->描述文本),可修改背景颜色与字体大 ...

  7. php学习 打星星

    <?php // 输入几行 $k=9; // 打孔三角 for($i=1;$i<=$k;$i++){ if($i==$k){ for($n=1;$n<=$k*2-1;$n++){ e ...

  8. Centos610安装Oracle

    官方安装参考 第一部分 依赖包 依赖包安全前先桌面安装 安装依赖包 yum -y install gcc gcc-c++ make binutils compat-libstdc++-33 elfut ...

  9. toPlainString() 和 toString()(转载)

    函数 toPlainString() 和 toString() 对于 BigDecimal b ; (b=(0.4321)^ 20) String s = b.toPlainString() ; Sy ...

  10. 【C++初学者自学笔记二】函数重载(模块一)

    1.概念:同意作用域的一组参数列表不同,函数名相同的函数,这组函数叫函数重载(C语言是不能定义相同名称的函数,但是C++可以允许定义). 2作用:重载函数通常来命名一组功能相似的函数,这样做减少了函数 ...