创建SpringBoot项目:https://blog.csdn.net/weixin_41381863/article/details/106504682

引入相关依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><!-- 这里会根据引入的springboot版本自动选择,也可单独指定版本 --><!-- 最新版本查询:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --><!-- <version>2.3.0.RELEASE</version> --></dependency><!-- 如果需要配置连接池,还需要以下依赖。不使用连接池则不需要 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

配置属性

### redis配置 ###
spring.redis.host=127.0.0.1
spring.redis.port=6379
# 安装的时候如果没有设置密码则没有此项
spring.redis.password=123456
# 使用redis的哪一个库,默认是0
spring.redis.database=0
# redis连接超时时间 单位毫秒
spring.redis.timeout=2000
# 连接池最大连接数(负值表示没有限制,比如-1)
spring.redis.lettuce.pool.max-active=20
# 获取连接最大阻塞等待时间(负值表示没有限制,比如-1)
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=20
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=100
# springboot默认使用的redis连接是lettuce。
# 如果需要换成jedis需要额外引入jedis的依赖包。
# 并且使用下面的配置#spring.redis.jedis.pool.max-active=
### redis配置 ###

如果需要使用jedis,则加入以下的依赖包(最好是在spring-boot-starter-data-redis中将lettuce的依赖排除)。

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><!-- 最新版本查询:https://mvnrepository.com/artifact/redis.clients/jedis/3.3.0 --><version>3.3.0</version>
</dependency>

使用RedisTemplate操作redis

RedisTemplate是springboot-redis提供的一个操作redis的模板,它一个泛型类RedisTemplate<K, V>。注意,它是被默认装配进Spring的IoC的,即我们可以直接使用@Autowired或@Resource使用它。除此之外,还提供了一个StringRedisTemplate来操作redis,同样的,StringRedisTemplate也是被默认装配进IoC的。这就是为什么,很多书籍或博客写了配置RedisTemplate,而直接使用了StringRedisTemplate。其中,StringRedisTemplate继承RedisTemplate<String, String>。按道理讲,装配了父类,却直接注入子类,肯定是会报错的(不知道你是否有思考过这个问题^_^)。这么一来,如果只使用StringRedisTemplate,其实配置或者不配置RedisTemplate<K, V>都没什么实际意义。

接下来,慢慢道来为什么要配置RedisTemplate,以及StringRedisTemplate和RedisTemplate关系。

注意一:假如我们不配置RedisTemplate,而直接使用RedisTemplate。会导致我们存入redis的数据变成以下形式。

key:

value:

而直接使用StringRedisTemplate,又不会出现这种情况。

RedisTemplate使用的默认使用的序列化是JdkSerializationRedisSerializer<T>。StringRedisTemplate继承了RedisTemplate,但是,在StringRedisTemplate的构造方法中,重新设置了序列化方式为StringRedisSerializer。如下:

其中RedisSerializer.string()追踪进去就是

除此之外,还支持很多序列化方式。所有的序列化方式必须实现RedisSerializer<T>接口。如下所示。其中,支持我们自定义序列化方式,还可以使用fastjson中的序列化方式。

注意二:在使用RedisTemplate<K, V>时。获取RedisTemplate的bean时,其实是根据bean的名称去找的(默认装配的是一个泛型的bean)。所以是没办法按照类型去获取bean的。

正确的的代码:

@Autowired
private RedisTemplate<String, Object> redisTemplate;

错误的代码:

@Autowired
private RedisTemplate<String, Object> redisTemplateObj;

关于使用RedisTemplate还是StringRedisTemplate。我是这么认为的,毕竟redis除了支持string还支持hash等其他数据类型。如果团队要求,在存储对象时,在代码中先将其序列化为json数据之后再进行存储,那么直接使用StringRedisTemplate即可。如果需要直接使用hash类型,且对象中带有非Stirng类型的属性,假如使用StringRedisTemplate,会出现类型转换异常ClassCastException。通过上面的分析,StringRedisTemplate就是一个将序列化方式更改为StringRedisSerializer的RedisTemplate。那么,就需要老老实实的使用RedisTemplate。综上,还是统一使用RedisTemplate比较好,操作类型比较丰富。

使用RedisTemplate时,为了规避上述问题,就需要重新装配RedisTemplate。

因为序列化使用了FastJson。所以还需要引入FastJson的依赖包。

注意:一旦设置了序列化方式,不要万不得已,不要更改。比如,存储数据用了A序列化方式,获取数据如果采用B序列化方式,会出现异常,导致获取数据失败。那么,需要更改序列化方式,则需要清除redis全部数据。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><!-- 最新版本查询:https://mvnrepository.com/artifact/com.alibaba/fastjson --><version>1.2.70</version>
</dependency>
@Configuration
public class RedisConfig {@Autowiredprivate RedisConnectionFactory redisConnectionFactory;@Bean(name = "redisTemplate")public RedisTemplate<String, Object> initRedisTemplate() {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 支持事物redisTemplate.setEnableTransactionSupport(true);// key的序列化方式采用StringRedisSerializer。相信很少用对象作为key的吧。// 如果要走非主流路线,将对象作为key,且对象含有非String属性,需要将key的序列化方式// 更改为下面的value序列化方式StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);// 设置value的序列化方式GenericFastJsonRedisSerializer(需要依赖fastjson)GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer();redisTemplate.setValueSerializer(fastJsonRedisSerializer);redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);// 如果不想使用fastJson。常用的还有jackson的序列化方式。springboot项目中,默认带了jackson。
//      Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//      ObjectMapper objectMapper = new ObjectMapper();
//      objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//      objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//      jacksonSerializer.setObjectMapper(objectMapper);
//      redisTemplate.setValueSerializer(jacksonSerializer);
//      redisTemplate.setHashValueSerializer(jacksonSerializer);// 顾名思义,在属性设置之后运行.初始化配置的作用redisTemplate.afterPropertiesSet();return redisTemplate;}
}

因为这里,我们重新装配了RedisTemplate<String, Object>,指定了泛型。所以在注入RedisTemplate<String, Object>时,就可以按类型获取了(获取bean的时候,可以任意命名)。

至此,就完成了所有配置。然后可以愉快的玩耍了。

测试用例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CacheTest {//  @Autowired
//  private StringRedisTemplate redisTemplate;@Autowiredprivate RedisTemplate<String, Object> redisTemplateObj;@Testpublic void setStringTest() {redisTemplateObj.opsForValue().set("k1", "zepal");System.out.println("done");}@Testpublic void getStringTest() {String result = (String) redisTemplateObj.opsForValue().get("k1");System.out.println(result);}@Testpublic void setHashObjTest() {Map<String, Object> map = new HashMap<>();map.put("name", "zepal");map.put("gender", "男");map.put("age", 18);redisTemplateObj.opsForHash().putAll("h1", map);System.out.println("done");}@Testpublic void getHashObjTest() {String name = (String) redisTemplateObj.opsForHash().get("h1", "name");System.out.println(name);}
}

操作封装

在开发中,如果每次操作RedisTemplate都需要调用它的api,比较麻烦,所以,可以简单进行封装一下。

@Service
public class CacheService {private RedisTemplate<String, Object> redisTemplate;/*** <p>新增缓存:不带超时策略* */public void setCache(String key, String value) {redisTemplate.opsForValue().set(key, value);}/*** <p>新增缓存:带超时策略* */public void setCache(String key, String value, long timeOut, TimeUnit timeUnit) {redisTemplate.opsForValue().set(key, value, timeOut, timeUnit);}/*** <p>获取缓存* */public String getCache(String key) {String value = (String) redisTemplate.opsForValue().get(key);return value;}/*** <p>删除缓存* */public boolean deleteCache(String key) {Boolean isSuccess = redisTemplate.delete(key);return isSuccess;}// 还可以扩展其它...}

SpringBoot配置redis相关推荐

  1. springboot配置Redis哨兵主从服务 以及 Redis 集群

    redis哨兵集群配置 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从 ...

  2. SpringBoot配置redis集群(Jedis and lettuce)

    SpringBoot2.x版本配置redis集群(Jedis and lettuce) 在SpringBoot1.x版本中,springboot默认使用集成jedis,在SpringBoot2.x版本 ...

  3. SpringBoot 配置redis集群

    导入依赖 <!--Springboot集成 Redis ,Springboot2.x默认是用Lettuce连接redis,Lettuce可伸缩,线程安全--> <dependency ...

  4. SpringBoot 配置 Redis 连接池

    前言 SpringBoot2.0默认采用 Lettuce 客户端来连接 Redis 服务 默认是不使用连接池的,只有配置 redis.lettuce.pool下的属性的时候才可以使用到redis连接池 ...

  5. Springboot配置Redis多数据源

    前言 Springboot默认支持一路redis,项目中有需求用到redis多数据源.本文仅基于Springboot进行多数据源配置,不依赖其它JAR包支持,理论可配置无限多的redis连接. 连接池 ...

  6. Spring配置redis(自定义方法)

    spring和SpringBoot配置redis方法大不一样 spring需要为redis专门配置xml, 注解的方式:参考Spring 极速集成注解 redis 实践 自定义方式: 注意序列化部分, ...

  7. spring boot连接redis配置127.0.0.1_Java技术分享——Springboot整合redis

    springboot提供了spring-data-redis的框架来整合redis的操作.下面主要介绍,springboot整合redis的配置,以及spring-data-redis是如何提供便捷的 ...

  8. 【机房报修管理系统】后端篇(九) 在SpringBoot配置非关系型数据库Redis

    原 [机房报修管理系统]后端篇(九) 在SpringBoot配置非关系型数据库Redis 2019年01月10日 14:18:48 CheungChingYin 阅读数:15 一.前情提要 在上一篇文 ...

  9. SpringBoot自动配置Redis原理

    SpringBoot自动配置Redis原理 目录 SpringBoot自动配置Redis原理 一.SpringBoot自动配置Redis原理 一.自动配置redis RedisAutoConfigur ...

  10. 跟着狂神学Redis(NoSql+环境配置+五大数据类型+三种特殊类型+Hyperloglog+Bitmap+事务+Jedis+SpringBoot整合+Redis持久化+...)

    跟着狂神学Redis 狂神聊Redis 学习方式:不是为了面试和工作学习!仅仅是为了兴趣!兴趣才是最好的老师! 基本的理论先学习,然后将知识融汇贯通! 狂神的Redis课程安排: nosql 讲解 阿 ...

最新文章

  1. angular $observe() 和$watch的区别
  2. python3 日志模块
  3. Vue中foreach数组与js中遍历数组的写法
  4. go ...打散切片
  5. CentOS常用环境配置(MySQL、jdk、Redis、Nginx)
  6. 软件构造学习笔记-第九周、第十周
  7. ES6学习笔记(五):轻松了解ES6的内置扩展对象
  8. flow control
  9. 反编译,修改jar文件
  10. 主动轮廓模型:Snake模型的python实现
  11. git创建本地版本仓库
  12. MybatisPlus多表关联查询
  13. 金盾高级视频加密系统使用教程与经验分享 (金盾视频加密系统跨平台版)
  14. python另存为excel_为什么不能从python代码中“另存为”Excel文件?
  15. Java实现Excel下载,excel文件流输出到浏览器
  16. (插件)程序员摸鱼神器,上班也可以在VSCode看股票 基金实时数据
  17. 紫光云全面进军公有云的底气何在?
  18. 词袋模型BoW和词集模型SoW比较
  19. uniapp中 onReady, onLoad, onShow区别
  20. [SV]合并数组和非合并数组

热门文章

  1. mysql提权马免杀_webshell/牛逼免杀提权隐藏大马.asp at master · tennc/webshell · GitHub...
  2. Unity VideoPlayer 播放视频
  3. Macfee 迈克菲尔CPU占用高解决办法,Macfee配置,优化和暂时关闭保护方法
  4. ElasticSearch系列之什么是ElasticSearch?
  5. 云计算与大数据技术应用
  6. 本人psp2000和psp3000都亲自试验过,没问题,刷完可以关机,能读取ISO文件,具体某些游戏可能不能运行还需要自己实践。
  7. css实现数字钟表字体实现 fonts
  8. 传染病SIR模型及蒙特卡洛方法
  9. 韦东山嵌入式学习视频完整目录
  10. h5网页小游戏php源码,H5 组词小游戏源代码