• SpringBoot集成redis依赖包及步骤


    redis作为nosql数据库,通常用于缓存,加锁和分布式缓存等,特地学习了如何融入SpringBoot

    1、在maven中引入spring-boot-starter-data-redis包

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-data-redis</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.apache.commons</groupId>
    7. <artifactId>commons-pool2</artifactId>
    8. </dependency>
    9. <dependency>
    10. <groupId>com.alibaba</groupId>
    11. <artifactId>fastjson</artifactId>
    12. <version>1.2.47</version>
    13. </dependency>
    14. <!--huTool工具-->
    15. <dependency>
    16. <groupId>cn.hutool</groupId>
    17. <artifactId>hutool-all</artifactId>
    18. <version>5.8.5</version>
    19. </dependency>

    2、配置文件中的redis连接设置 

    映射的是org.springframework.boot.autoconfigure.data.redis.RedisProperties

    中的属性

    集群:

    1. spring.redis.password=123456
    2. spring.redis.cluster.nodes=10.193.240.170:7000,10.193.241.0:7001 
    3. spring.redis.cluster.max-redirects=3

    单个实例:

    1. spring.redis.host=localhost # Redis服务器地址
    2. spring.redis.database=0 # Redis数据库索引(默认为0
    3. spring.redis.port=6379 # Redis服务器连接端口
    4. spring.redis.password=123456 # Redis服务器连接密码(默认为空)
    5. spring.redis.timeout=300ms # 连接超时时间(毫秒)

    3、redisTemplate配置类Config

    1. @Configuration
    2. @Slf4j
    3. public class RedisTemplateConfig {
    4. @Autowired
    5. private RedisProperties redisProperties;
    6. @Bean
    7. @ConditionalOnMissingBean
    8. public StringRedisTemplate stringRedisTemplate1(RedisConnectionFactory redisConnectionFactory) {
    9. String prefix = StrUtil.isBlank(redisProperties.getBizPrefix()) ? ""
    10. : redisProperties.getBizPrefix() + RedisConstants.BIZ_PREFIX_SPLIT;
    11. log.info("biz-prefix > {}", prefix);
    12. StringRedisTemplate template = new StringRedisTemplate();
    13. template.setConnectionFactory(redisConnectionFactory);
    14. RedisSerializer<Object> redisSerializer = redisSerializer();
    15. // 值采用json序列化
    16. template.setValueSerializer(redisSerializer);
    17. template.setKeySerializer(new StringRedisSerializer(prefix));
    18. // 设置hash keyvalue序列化模式
    19. template.setHashKeySerializer(new StringRedisSerializer(prefix));
    20. template.setHashValueSerializer(redisSerializer);
    21. template.afterPropertiesSet();
    22. return template;
    23. }
    24. @Bean
    25. public RedisSerializer<Object> redisSerializer() {
    26. //创建JSON序列化器
    27. Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
    28. ObjectMapper objectMapper = new ObjectMapper();
    29. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    30. //必须设置,否则无法将JSON转化为对象,会转化成Map类型
    31. objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);
    32. serializer.setObjectMapper(objectMapper);
    33. return serializer;
    34. }
    35. }

    4、RedisProperties属性类

    1. package com.example.data.redis.config.property;
    2. import lombok.Data;
    3. import org.springframework.boot.context.properties.ConfigurationProperties;
    4. import org.springframework.stereotype.Component;
    5. @Data
    6. @Component
    7. @ConfigurationProperties(prefix = "demo.redis")
    8. public class RedisProperties {
    9. /**
    10. * 是否开启 true/false
    11. */
    12. private boolean enabled = true;
    13. /**
    14. * 业务标识前缀
    15. */
    16. private String bizPrefix;
    17. }

    5、在service注入

    要注意这里RedisTemplate配置类config的返回泛型和注入的泛型要一致,不然会提示

     The following candidates were found but could not be injected:
        - Bean method 'stringRedisTemplate' in 'RedisAutoConfiguration' not loaded because @ConditionalOnMissingBean (types: org.springframework.data.redis.core.StringRedisTemplate; SearchStrategy: all) found beans of type 'org.springframework.data.redis.core.StringRedisTemplate' stringRedisTemplate

    注入代码如下:

    1. /**
    2. * redis操作service实现类
    3. */
    4. @Service
    5. public class RedisServiceImpl implements RedisService {
    6. @Autowired
    7. private RedisTemplate redisTemplate;
    8. /**
    9. * 设置缓存
    10. * Params:
    11. * key – 缓存键 value – 缓存value expSec – 失效时间(秒)
    12. */
    13. @Override
    14. public void set(String key, Object value, long time) {
    15. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
    16. }
    17. /**
    18. * 设置缓存
    19. * @param key
    20. * @param value
    21. */
    22. @Override
    23. public void set(String key, Object value) {
    24. redisTemplate.opsForValue().set(key,value);
    25. }
    26. /**
    27. * 获取缓存对象,返回string
    28. * Params:
    29. * key – 缓存键
    30. * Returns:
    31. * 返回缓存实体
    32. */
    33. @Override
    34. public Object get(String key) {
    35. return redisTemplate.opsForValue().get(key);
    36. }
    37. /**
    38. * 删除缓存数据
    39. * Params:
    40. * @param key – 缓存键
    41. * @return
    42. */
    43. @Override
    44. public Boolean del(String key) {
    45. return redisTemplate.delete(key);
    46. }
    47. @Override
    48. public Long del(List<String> keys) {
    49. return redisTemplate.delete(keys);
    50. }
    51. /**
    52. * 指定缓存失效时间
    53. * Params:
    54. * key – 键 time – 时间(秒)
    55. * Returns:
    56. * true成功 false失败
    57. */
    58. @Override
    59. public Boolean expire(String key, long time) {
    60. return redisTemplate.expire(key,time,TimeUnit.SECONDS);
    61. }
    62. /**
    63. * 根据key 获取过期时间
    64. * @param key
    65. * @return
    66. */
    67. @Override
    68. public Long getExpire(String key) {
    69. return redisTemplate.getExpire(key);
    70. }
    71. /**
    72. * 判断key是否存在
    73. * Params:
    74. * key – 键
    75. * Returns:
    76. * true 存在 false不存
    77. * @param key
    78. * @return
    79. */
    80. @Override
    81. public Boolean hasKey(String key) {
    82. return redisTemplate.hasKey(key);
    83. }
    84. /**
    85. * 将键对应的值按指定步长增加
    86. * @param key
    87. * @param delta
    88. * @return
    89. */
    90. @Override
    91. public Long incr(String key, long delta) {
    92. return redisTemplate.opsForValue().increment(key, delta);
    93. }
    94. /**
    95. * 将键对应的值按指定步长减少
    96. * @param key
    97. * @param delta
    98. * @return
    99. */
    100. @Override
    101. public Long decr(String key, long delta) {
    102. return redisTemplate.opsForValue().decrement(key, delta);
    103. }
    104. /**
    105. * 获取指定变量中的hashMap值
    106. * @param key
    107. * @param hashKey
    108. * @return
    109. */
    110. @Override
    111. public Object hGet(String key, String hashKey) {
    112. return redisTemplate.opsForHash().get(key, hashKey);
    113. }
    114. /**
    115. * 设置指定变量中的hashMap值,并设置过期时间
    116. * @param key
    117. * @param hashKey
    118. * @return
    119. */
    120. @Override
    121. public Boolean hSet(String key, String hashKey, Object value, long time) {
    122. redisTemplate.opsForHash().put(key, hashKey, value);
    123. return expire(key, time);
    124. }
    125. /**
    126. * 新增hashMap值
    127. * @param key
    128. * @param hashKey
    129. * @param value
    130. */
    131. @Override
    132. public void hSet(String key, String hashKey, Object value) {
    133. redisTemplate.opsForHash().put(key, hashKey, value);
    134. }
    135. @Override
    136. public Map<Object, Object> hGetAll(String key) {
    137. return redisTemplate.opsForHash().entries(key);
    138. }
    139. @Override
    140. public Boolean hSetAll(String key, Map<String, Object> map, long time) {
    141. redisTemplate.opsForHash().putAll(key, map);
    142. return expire(key, time);
    143. }
    144. @Override
    145. public void hSetAll(String key, Map<String, ?> map) {
    146. redisTemplate.opsForHash().putAll(key, map);
    147. }
    148. @Override
    149. public void hDel(String key, Object... hashKey) {
    150. redisTemplate.opsForHash().delete(key, hashKey);
    151. }
    152. @Override
    153. public Boolean hHasKey(String key, String hashKey) {
    154. return redisTemplate.opsForHash().hasKey(key, hashKey);
    155. }
    156. @Override
    157. public Long hIncr(String key, String hashKey, Long delta) {
    158. return redisTemplate.opsForHash().increment(key,hashKey,delta);
    159. }
    160. @Override
    161. public Long hDecr(String key, String hashKey, Long delta) {
    162. return redisTemplate.opsForHash().increment(key, hashKey, -delta);
    163. }
    164. /**
    165. * 根据key获取set集合
    166. * @param key
    167. * @return
    168. */
    169. @Override
    170. public Set<Object> sMembers(String key) {
    171. return redisTemplate.opsForSet().members(key);
    172. }
    173. /**
    174. * 添加key
    175. * @param key
    176. * @param values
    177. * @return
    178. */
    179. @Override
    180. public Long sAdd(String key, Object... values) {
    181. return redisTemplate.opsForSet().add(key, values);
    182. }
    183. @Override
    184. public Long sAdd(String key, long time, Object... values) {
    185. Long count = redisTemplate.opsForSet().add(key, values);
    186. expire(key, time);
    187. return count;
    188. }
    189. @Override
    190. public Boolean sIsMember(String key, Object value) {
    191. return redisTemplate.opsForSet().isMember(key,value);
    192. }
    193. @Override
    194. public Long sSize(String key) {
    195. return redisTemplate.opsForSet().size(key);
    196. }
    197. @Override
    198. public Long sRemove(String key, Object... values) {
    199. return redisTemplate.opsForSet().remove(key,values);
    200. }
    201. @Override
    202. public List<Object> lRange(String key, long start, long end) {
    203. return redisTemplate.opsForList().range(key, start, end);
    204. }
    205. @Override
    206. public Long lSize(String key) {
    207. return redisTemplate.opsForList().size(key);
    208. }
    209. @Override
    210. public Object lIndex(String key, long index) {
    211. return redisTemplate.opsForList().index(key, index);
    212. }
    213. @Override
    214. public Long lPush(String key, Object value) {
    215. return redisTemplate.opsForList().rightPush(key, value);
    216. }
    217. @Override
    218. public Long lPush(String key, Object value, long time) {
    219. Long index = redisTemplate.opsForList().rightPush(key, value);
    220. expire(key, time);
    221. return index;
    222. }
    223. @Override
    224. public Long lPushAll(String key, Object... values) {
    225. return redisTemplate.opsForList().rightPushAll(key, values);
    226. }
    227. @Override
    228. public Long lPushAll(String key, Long time, Object... values) {
    229. Long count = redisTemplate.opsForList().rightPushAll(key, values);
    230. expire(key, time);
    231. return count;
    232. }
    233. @Override
    234. public Long lRemove(String key, long count, Object value) {
    235. return redisTemplate.opsForList().remove(key, count, value);
    236. }
    237. }

    配置好后就重启启动OK

  • 相关阅读:
    牛客多校2 - Link with Game Glitch(spfa求正环,套汇,二分答案)
    Rust for循环语法糖背后的API
    linux之定时任务
    DIN模型和SIM模型原理与实践
    学习pytorch15 优化器
    1.django简介及安装
    ElementUI浅尝辄止37:Select 选择器
    数字化时代,中小企业如何落地数字化转型
    关于jupyter notebook的使用经验
    【杂谈】快来看看如何使用LGMT这样的蜜汁缩写来进行CodeReview吧!
  • 原文地址:https://blog.csdn.net/qq_31450641/article/details/133877798