Springboot如何使用Redis

转载地址:https://blog.csdn.net/supersub000/article/details/80099990

现在公司项目使用的是SpringBoot框架,因为最近需要使用redis缓存,所以就需要写一个公共的redis工具类,发现其实SpringBoot对redis已经进行了封装,只需要加入redis的相关依赖就可以了。首先在pom.xml加入依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot </groupId>
  3. <artifactId>spring-boot-starter-data-redis </artifactId>
  4. </dependency>

     然后写redis配置类RedisConfiguration,需要注意的是在配置中一般需要配置redisTemplate的序列化方式,因为Spring redis的默认序列化方式是JDK序列化,所以缓存对象一般都要实现java.io.Serializable接口,不然在使用时会报错,而且在redis中读取内容时,除了属性信息外还会有很多其他信息,可读性较差。我这里使用的是GenericJackson2JsonRedisSerializer接口,相比Jackson2JsonRedisSerializer接口多了@class属性,类的全路径包名,方便反系列化。

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.cache.CacheManager;
  4. import org.springframework.cache.annotation.CachingConfigurerSupport;
  5. import org.springframework.cache.annotation.EnableCaching;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.data.redis.cache.RedisCacheManager;
  9. import org.springframework.data.redis.connection.RedisConnectionFactory;
  10. import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
  11. import org.springframework.data.redis.core.HashOperations;
  12. import org.springframework.data.redis.core.RedisTemplate;
  13. import org.springframework.data.redis.core.ValueOperations;
  14. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  15. import org.springframework.data.redis.serializer.StringRedisSerializer;
  16. import redis.clients.jedis.JedisPoolConfig;
  17. /**
  18. * redis配置
  19. *
  20. * @create 2018-04-24 下午9:38
  21. **/
  22. @Configuration
  23. @EnableCaching
  24. public class RedisConfiguration extends CachingConfigurerSupport {
  25. @Value( "${redis.host}")
  26. private String host;
  27. @Value( "${redis.port}")
  28. private Integer port;
  29. @Value( "${redis.timeout}")
  30. private Integer timeout;
  31. @Value( "${redis.maxTotal}")
  32. private Integer maxTotal;
  33. @Value( "${redis.maxIdle}")
  34. private Integer maxIdle;
  35. @Value( "${redis.maxWaitMillis}")
  36. private Long maxWaitMillis;
  37. @Value( "${redis.testOnBorrow}")
  38. private Boolean testOnBorrow;
  39. @Value( "${redis.database}")
  40. private Integer database;
  41. /**
  42. * 注入 RedisConnectionFactory
  43. */
  44. @Autowired
  45. RedisConnectionFactory redisConnectionFactory;
  46. /**
  47. * 缓存管理器.
  48. *
  49. * @param redisTemplate
  50. * @return
  51. */
  52. @Bean
  53. public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
  54. CacheManager cacheManager = new RedisCacheManager(redisTemplate);
  55. return cacheManager;
  56. }
  57. /**
  58. * 配置redisTemplate
  59. * <p>
  60. * 通过redisConnectionFactory引入redis在配置文件中的连接配置
  61. */
  62. @Bean
  63. public RedisTemplate<String, Object> redisTemplate() {
  64. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  65. initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
  66. redisTemplate.afterPropertiesSet();
  67. return redisTemplate;
  68. }
  69. @Bean
  70. public RedisConnectionFactory redisConnectionFactory() {
  71. JedisPoolConfig jedisPoolConfig = getJedisPoolConfig();
  72. JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
  73. jedisConnectionFactory.setHostName(host);
  74. jedisConnectionFactory.setPort(port);
  75. jedisConnectionFactory.setDatabase(database);
  76. jedisConnectionFactory.setUsePool( true);
  77. jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
  78. return jedisConnectionFactory;
  79. }
  80. private JedisPoolConfig getJedisPoolConfig() {
  81. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  82. //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
  83. //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
  84. jedisPoolConfig.setMaxTotal(maxTotal);
  85. //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
  86. jedisPoolConfig.setMaxIdle(maxIdle);
  87. //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
  88. jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
  89. //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
  90. jedisPoolConfig.setTestOnBorrow(testOnBorrow);
  91. return jedisPoolConfig;
  92. }
  93. /**
  94. * 设置数据存入 redis 的序列化方式
  95. *
  96. * @param redisTemplate
  97. * @param factory
  98. */
  99. private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
  100. redisTemplate.setKeySerializer( new StringRedisSerializer());
  101. redisTemplate.setHashKeySerializer( new StringRedisSerializer());
  102. redisTemplate.setHashValueSerializer( new GenericJackson2JsonRedisSerializer());
  103. redisTemplate.setValueSerializer( new GenericJackson2JsonRedisSerializer());
  104. redisTemplate.setConnectionFactory(factory);
  105. }
  106. }

      其中redisTemplate是Spring对Redis的相关操作的封装类,支持Redis的原生api,一般在定义RedisTemplate<K,V>,K的类型一般使用String,V的类型根据自己的业务需求进行定义,一般定义类型为Object,避免定义为RedisTemplate<Object,Object>。在RedisTemplate已经定义了对五种数据类型的操作:

  1. redisTemplate.opsForValue(); //字符串操作
  2. redisTemplate.opsForHash(); //hash操作
  3. redisTemplate.opsForList(); //list操作
  4. redisTemplate.opsForSet(); //set操作
  5. redisTemplate.opsForZSet(); //有序set操作

        每种操作都应对了的操作类,一般是Default开头,具体的源码还没有进行研究,本篇文章主要讲如何进行配置,更深的研究后续有时间会和小伙伴们进行分享。

        Redis的相关配置后,就可以编写Redis的相关的工具类,一般命名RedisUtils或者RedisDao,下面是代码:

  1. import org.springframework.data.redis.core.RedisTemplate;
  2. import org.springframework.stereotype.Repository;
  3. import javax.annotation.Resource;
  4. import java.util.Date;
  5. import java.util.HashMap;
  6. import java.util.Set;
  7. import java.util.concurrent.TimeUnit;
  8. /**
  9. * redis工具类
  10. *
  11. * @create 2018-04-24 下午9:41
  12. **/
  13. @Repository( "redisDao")
  14. public class RedisDaoImpl implements RedisDao{
  15. @Resource
  16. protected RedisTemplate<String,Object> redisTemplate;
  17. /**
  18. * 查询key,支持模糊查询
  19. *
  20. * @param key 传过来时key的前后端已经加入了*,或者根据具体处理
  21. * */
  22. @Override
  23. public Set<String> keys(String key){
  24. return redisTemplate.keys(key);
  25. }
  26. /**
  27. * 重命名key
  28. * */
  29. @Override
  30. public void renameKey(String key,String newKey){
  31. redisTemplate.rename(key,newKey);
  32. }
  33. /**
  34. *字符串添加信息
  35. * @param key
  36. * @param obj 可以是单个的值,也可以是任意类型的对象
  37. * */
  38. @Override
  39. public void set(String key,Object obj){
  40. redisTemplate.opsForValue().set(key,obj);
  41. }
  42. /**
  43. *字符串添加信息
  44. * @param key
  45. * @param obj 可以是单个的值,也可以是任意类型的对象
  46. * @param expire 设置失效时间
  47. * */
  48. @Override
  49. public void set(String key,Object obj,long expire){
  50. redisTemplate.opsForValue().set(key,obj,expire,TimeUnit.SECONDS);
  51. }
  52. /**
  53. * 字符串获取值
  54. * @param key
  55. * */
  56. @Override
  57. public Object get(String key){
  58. return redisTemplate.opsForValue().get(key);
  59. }
  60. /**
  61. * 删出key
  62. * 这里跟下边deleteKey()最底层实现都是一样的,应该可以通用
  63. * @param key
  64. * */
  65. @Override
  66. public void delete(String key){
  67. redisTemplate.opsForValue().getOperations().delete(key);
  68. }
  69. /**
  70. * 添加单个
  71. *
  72. * @param key key
  73. * @param filed filed
  74. * @param domain 对象
  75. */
  76. @Override
  77. public void hset(String key,String filed,Object domain){
  78. redisTemplate.opsForHash().put(key, filed, domain);
  79. }
  80. /**
  81. * 添加HashMap
  82. *
  83. * @param key key
  84. * @param hm 要存入的hash表
  85. */
  86. @Override
  87. public void hmset(String key, HashMap<String,Object> hm){
  88. redisTemplate.opsForHash().putAll(key,hm);
  89. }
  90. /**
  91. * 查询key和field所确定的值
  92. *
  93. * @param key 查询的key
  94. * @param field 查询的field
  95. * @return HV
  96. */
  97. @Override
  98. public Object hget(String key,String field) {
  99. return redisTemplate.opsForHash().get(key, field);
  100. }
  101. /**
  102. * 查询该key下所有值
  103. *
  104. * @param key 查询的key
  105. * @return Map<HK, HV>
  106. */
  107. @Override
  108. public Object hget(String key) {
  109. return redisTemplate.opsForHash().entries(key);
  110. }
  111. /**
  112. * 删除key下所有值
  113. *
  114. * @param key 查询的key
  115. */
  116. @Override
  117. public void deleteKey(String key) {
  118. redisTemplate.opsForHash().getOperations().delete(key);
  119. }
  120. /**
  121. * 判断key和field下是否有值
  122. *
  123. * @param key 判断的key
  124. * @param field 判断的field
  125. */
  126. @Override
  127. public Boolean hasKey(String key,String field) {
  128. return redisTemplate.opsForHash().hasKey(key,field);
  129. }
  130. /**
  131. * 判断key下是否有值
  132. *
  133. * @param key 判断的key
  134. */
  135. @Override
  136. public Boolean hasKey(String key) {
  137. return redisTemplate.opsForHash().getOperations().hasKey(key);
  138. }
  139. @Override
  140. public Boolean expire(String key, long sec) {
  141. return redisTemplate.expire(key,sec,TimeUnit.SECONDS);
  142. }
  143. @Override
  144. public Boolean expireAt(String key, Date date) {
  145. return redisTemplate.expireAt(key,date);
  146. }
  147. }
     以上只是写了redis的一些基本操作,如果需要操作List,或者Set的话,还需要在添加一些方法。在需要使用redis存储或者数据时,只需要注入RedisDao就可以了。通过以上的操作,就已经完成了Redis的基本配置,在一些配置上还可以进行优化,因为Spring对Redis进行了良好的封装,在一般场景下使用都可以满足我们的需求。

猜你喜欢

转载自blog.csdn.net/m0_38053538/article/details/80914637
今日推荐