介绍

在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis

SpringBoot 2.x后 ,原来底层使用的 Jedis 被 lettuce[赖忒死] 替换。所以在springboot中引入spring-boot-starter-data-redis依赖时,默认使用的时Lettuce。

  • jedis:采用的直连,多个线程操作的话,是不安全的。如果要避免不安全,使用jedis pool连接池!更像BIO模式(阻塞模式)。

  • lettuce:采用netty(高性能网络框架,异步请求),实例可以在多个线程中共享,不存在线程不安全的情况!可以减少线程数量了,更像NIO模式。

而我们要是使用的是StringRedisTemplate 而不是 RedisTemplate

StringRedisTemplate是RedisTemplate的子类(不代表value只能是string,而是序列化策略为StringRedisSerializer)

  • RedisTemplate默认采用的是JDK的序列化策略,即JdkSerializationRedisSerializer,保存的key和value都是采用此策略序列化保存的。比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面,当然从Redis获取数据的时候也会默认将数据当做字节数组转化。

  • StringRedisTemplate的API假定所有的数据类型化都是字符类型,即key和value都是字符串类型。默认采用的是String的序列化策略,即StringRedisSerializer,保存的key和value都是采用此策略序列化保存的。

作用

redis连接数据库,可以实现排行榜(有序集合),缓存(字符串类型)等功能

快速开始

导入依赖

<!--redis场景启动器-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis 连接池 -->
<!--新版本连接池lettuce-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

配置文件

#****************************redis****************************
# Redis数据库索引(默认为0)
redis: database:# 默认库default: 0# 缓存库cache: 1# 排行榜库sort: 2# 搜索历史的库history: 3spring:redis:host: 127.0.0.1lettuce:pool:# 连接池最大连接数(使用负值表示没有限制)max-active: 20# 连接池中的最大空闲连接max-idle: 10# 连接池中的最小空闲连接min-idle: 5# 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: 5000# Redis服务器连接密码(默认为空,代表没有密码)password: 10401# Redis服务器连接端口port: 6379# 连接超时时间(毫秒)timeout: 5000

配置类

 import io.lettuce.core.resource.DefaultClientResources;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisPassword;import org.springframework.data.redis.connection.RedisStandaloneConfiguration;import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.util.ObjectUtils;​import java.time.Duration;​@Configurationpublic class RedisConfig {​@Value("${redis.database.default}")private int defaultDataBase;​@Value("${redis.database.sort}")private int sortDataBase;​@Value("${redis.database.cache}")private int drugCacheDataBase;​@Value("${redis.database.history}")private int historyDataBase;​@Value("${spring.redis.host}")private String host;​@Value("${spring.redis.port}")private int port;​@Value("${spring.redis.password}")private String password;​@Value("${spring.redis.lettuce.pool.max-active}")private int maxActive;​@Value("${spring.redis.lettuce.pool.max-wait}")private int maxWait;​@Value("${spring.redis.lettuce.pool.max-idle}")private int maxIdle;​@Value("${spring.redis.lettuce.pool.min-idle}")private int minIdle;​@Value("${spring.redis.timeout}")private long timeout;​    /*** 配置redis连接池*/@Beanpublic GenericObjectPoolConfig poolConfig() {GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();poolConfig.setMaxTotal(maxActive);poolConfig.setMaxIdle(maxIdle);poolConfig.setMinIdle(minIdle);poolConfig.setMaxWaitMillis(maxWait);return poolConfig;}​    /*** 配置默认客户端资源*/@Bean("defaultClientResources")public  DefaultClientResources getDefaultClientResources(){return DefaultClientResources.create();}private StringRedisTemplate getStringRedisTemplate(int database, GenericObjectPoolConfig poolConfig, DefaultClientResources defaultClientResources) {// 构建工厂对象RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();config.setHostName(host);config.setPort(port);if (!ObjectUtils.isEmpty(password)) {RedisPassword redisPassword = RedisPassword.of(password);config.setPassword(redisPassword);}LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofSeconds(timeout)).poolConfig(poolConfig).clientResources(defaultClientResources).build();LettuceConnectionFactory factory = new LettuceConnectionFactory(config, clientConfig);// 设置使用的redis数据库factory.setDatabase(database);// 重新初始化工厂factory.afterPropertiesSet();return new StringRedisTemplate(factory);}​@Bean(name="redisTemplateDefault")public StringRedisTemplate redisTemplateDefault(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(defaultDataBase, poolConfig,defaultClientResources);}​@Bean(name="redisTemplateSort")public StringRedisTemplate redisTemplateSort(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(sortDataBase, poolConfig,defaultClientResources);}​@Bean(name="redisTemplateDrugCache")public StringRedisTemplate redisTemplateCacheDrug(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(drugCacheDataBase, poolConfig,defaultClientResources);}​@Bean(name="redisTemplateHistory")public StringRedisTemplate redisTemplateHistory(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(historyDataBase, poolConfig,defaultClientResources);}}

一总往Spring容器注入了四个StringRedisTemplate对象,分别对应操作不同的库

使用

指定名称的从IOC容器获取,因为配置了多个对象

@Resource(name = "redisTemplateDefault")
private StringRedisTemplate stringRedisTemplate;

SpringBoot整合redis(StringRedisTemplate),操作一个redis服务器的多个库相关推荐

  1. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

  2. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 1.前言 本文主要介绍使用SpringBoot与shiro实现基 ...

  3. SpringBoot整合JDBC数据库操作第七弹-自定义RowMapper

    SpringBoot整合JDBC数据库操作第七弹-自定义RowMapper 上篇文章我们讲到了怎么对数据的查询操作,每次查询数据都会在返回中构建一个匿名类去封装返回结果,这样的话导致我们有大量的冗余代 ...

  4. SpringBoot整合JDBC数据库操作第二弹-配置基本数据库连接源

    SpringBoot整合JDBC数据库操作第二弹-配置基本数据库连接源 上篇文章我们讲到了如何配置整合JDBC的基础环境,这篇文章我们讲解一下如何去配置服务的DataSource数据库数据源,方便其对 ...

  5. Redis数据操作(redis入门)

    一.字符串类型 在redis里面有一个特别重要的命令"keys",可以进行全部数据的列出. 1.设置新的数据: set username-dlnu hello; 2.取得对应的数据 ...

  6. redis常用操作2, redis操作键值, redis安全设置

    string数据 127.0.0.1:6379> setnx k1 888 #键存在,setnx检测到,不会覆盖: (integer) 0 127.0.0.1:6379> get k1 & ...

  7. maven netty 配置_使用Springboot整合开发Netty(一个表白的小案例)

    写了很久的java并发包里面的文章,今天换一个口味.很早之前学的Netty,由于最近项目经常使用到,遇到了很多坑,因此想通过一个体系教程说一下这个高性能异步通信框架Netty,这也是netty的第一篇 ...

  8. SpringBoot 整合activiti5.22 实现一个完整的请假流程

    最近在熟悉activiti的使用,翻阅了很多资料,自己也整理了一点出来方便以后自己使用 一.引入依赖 <dependencies><dependency><groupId ...

  9. springboot整合通用mapper操作数据库

    1. 建表sql create table user (`id` int PRIMARY KEY auto_increment COMMENT '用户id', `name` VARCHAR(255) ...

最新文章

  1. JAVA产生加密公钥私钥_Java生成非对称型加密的公钥和私钥
  2. python中关于list列表的增删查改操作
  3. ubuntu apt-get dpkg应用中的一些问题及解决方法
  4. css 横线_CSS-画一个太极阴阳图
  5. python后端开发工程师面试题
  6. x shell 配置 和相关注意点(vm相关注意点)
  7. 在VS2003下把一个DataTable Update 到数据库
  8. 程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**
  9. 小米发布会之文案错误:大哥你先处罚自己!再处罚相关高管!
  10. 移动端:zepto框架
  11. 开源免费录屏和直播软件OBS Studio教程
  12. 基于java jsp企业人事管理系统mysql
  13. 360浏览器显示服务器拒绝连接,360浏览器提示“您与此网站之间建立的连接不安全完美解决方法...
  14. Hibernate入门简介----张冬
  15. Linux使用sendmail邮件监控[运维监控]
  16. K210使用MaixPy IDE长时间显示连接中的解决方案
  17. kibana监控logstash
  18. 广西大学计算机考研资料汇总
  19. Android多点触控之——MotionEvent(触控事件)
  20. LayUI # 清空下拉框的值

热门文章

  1. [不明觉厉] 下一个排列
  2. 电影解说都是怎么配音的?两种方法教你给视频配音
  3. HTML 网页中以超链接的方式调用iphone 手机的app
  4. 二叉树前序遍历与后序遍历
  5. 第7章 Linux下的文件编程(一)
  6. 深入理解Java虚拟机(第三版)-- 判定对象存活算法、引用、回收方法区
  7. 参考平面及其高度_设计规范参考数据
  8. 为什么TransFormer中的FFN有两层,先升维再降维?
  9. 博客的美化配置(NexT主题)
  10. amazon - business 之 references link market