redis(七)之springboot整合redis

缺乏、安全感 2022-03-01 05:30 449阅读 0赞

1.使用redisTemplate的方式

1.pom.xml

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

2.application.properties里面添加

  1. # Redis数据库索引(默认为0)
  2. spring.redis.database=0
  3. # Redis服务器地址
  4. spring.redis.host=127.0.0.1
  5. # Redis服务器连接端口
  6. spring.redis.port=6379
  7. # Redis服务器连接密码(默认为空)
  8. spring.redis.password=
  9. # 连接超时时间(毫秒)
  10. spring.redis.timeout=3000
  11. #最大空闲数
  12. redis.maxIdle=300
  13. #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
  14. #redis.maxActive=600
  15. #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
  16. redis.maxTotal=1000
  17. #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
  18. redis.maxWaitMillis=1000
  19. #连接的最小空闲时间 默认1800000毫秒(30分钟)
  20. redis.minEvictableIdleTimeMillis=300000
  21. #每次释放连接的最大数目,默认3
  22. redis.numTestsPerEvictionRun=1024
  23. #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  24. redis.timeBetweenEvictionRunsMillis=30000
  25. #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  26. redis.testOnBorrow=true
  27. #在空闲时检查有效性, 默认false
  28. redis.testWhileIdle=true

3.创建RedisUtil类

  1. package cn.itcast.ssm.util;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.*;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.util.CollectionUtils;
  6. import java.io.Serializable;
  7. import java.util.*;
  8. import java.util.concurrent.TimeUnit;
  9. /** * @author wsw * @Package cn.itcast.ssm.util * @Description: * @date 19-3-21 上午11:30 */
  10. @Service
  11. public class RedisUtil {
  12. @Autowired
  13. private RedisTemplate redisTemplate;
  14. private static double size = Math.pow(2, 32);
  15. /** * 写入缓存 * * @param key * @param offset 位 8Bit=1Byte * @return */
  16. public boolean setBit(String key, long offset, boolean isShow) {
  17. boolean result = false;
  18. try {
  19. ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  20. operations.setBit(key, offset, isShow);
  21. result = true;
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. }
  25. return result;
  26. }
  27. /** * 写入缓存 * * @param key * @param offset * @return */
  28. public boolean getBit(String key, long offset) {
  29. boolean result = false;
  30. try {
  31. ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  32. result = operations.getBit(key, offset);
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. return result;
  37. }
  38. /** * 写入缓存 * * @param key * @param value * @return */
  39. public boolean set(final String key, Object value) {
  40. boolean result = false;
  41. try {
  42. ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  43. operations.set(key, value);
  44. result = true;
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. }
  48. return result;
  49. }
  50. /** * 写入缓存并设置有效时间 * * @param key * @param value * @return */
  51. public boolean settime(final String key, Object value,long time) {
  52. boolean result = false;
  53. try {
  54. ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  55. operations.set(key, value,time,TimeUnit.SECONDS);
  56. result = true;
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. }
  60. return result;
  61. }
  62. /** * 写入缓存设置时效时间 * * @param key * @param value * @return */
  63. public boolean set(final String key, Object value, Long expireTime) {
  64. boolean result = false;
  65. try {
  66. ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  67. operations.set(key, value);
  68. redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
  69. result = true;
  70. } catch (Exception e) {
  71. e.printStackTrace();
  72. }
  73. return result;
  74. }
  75. /** * 批量删除对应的value * * @param keys */
  76. public void remove(final String... keys) {
  77. for (String key : keys) {
  78. remove(key);
  79. }
  80. }
  81. /** * 删除对应的value * * @param key */
  82. public void remove(final String key) {
  83. if (exists(key)) {
  84. redisTemplate.delete(key);
  85. }
  86. }
  87. /** * 判断缓存中是否有对应的value * * @param key * @return */
  88. public boolean exists(final String key) {
  89. return redisTemplate.hasKey(key);
  90. }
  91. /** * 读取缓存 * * @param key * @return */
  92. public Object get(final String key) {
  93. Object result = null;
  94. ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  95. result = operations.get(key);
  96. return result;
  97. }
  98. /** * 哈希 添加 * * @param key * @param hashKey * @param value */
  99. public void hmSet(String key, Object hashKey, Object value) {
  100. HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
  101. hash.put(key, hashKey, value);
  102. }
  103. /** * 哈希获取数据 * * @param key * @param hashKey * @return */
  104. public Object hmGet(String key, Object hashKey) {
  105. HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
  106. return hash.get(key, hashKey);
  107. }
  108. /** * 列表添加 * * @param k * @param v */
  109. public void lPush(String k, Object v) {
  110. ListOperations<String, Object> list = redisTemplate.opsForList();
  111. list.rightPush(k, v);
  112. }
  113. /** * 列表添加 * * @param k * @param v */
  114. public void lPushtime(String k, Object v,long time) {
  115. ListOperations<String, Object> list = redisTemplate.opsForList();
  116. list.rightPush(k, v,time);
  117. }
  118. /* *//** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */
  119. public boolean lSetlist(String key, Object value, long time) {
  120. try {
  121. redisTemplate.opsForList().rightPush(key, value);
  122. if (time > 0) redisTemplate.expire(key, time, TimeUnit.SECONDS);
  123. return true;
  124. } catch (Exception e) {
  125. e.printStackTrace();
  126. return false;
  127. }
  128. }
  129. /** * 列表获取 * * @param k * @param l * @param l1 * @return */
  130. public List<Object> lRange(String k, long l, long l1) {
  131. ListOperations<String, Object> list = redisTemplate.opsForList();
  132. return list.range(k, l, l1);
  133. }
  134. /** * 集合添加 * * @param key * @param value */
  135. public void add(String key, Object value) {
  136. SetOperations<String, Object> set = redisTemplate.opsForSet();
  137. set.add(key, value);
  138. }
  139. /** * 集合获取 * * @param key * @return */
  140. public Set<Object> setMembers(String key) {
  141. SetOperations<String, Object> set = redisTemplate.opsForSet();
  142. return set.members(key);
  143. }
  144. /** * 有序集合添加 * * @param key * @param value * @param scoure */
  145. public void zAdd(String key, Object value, double scoure) {
  146. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  147. zset.add(key, value, scoure);
  148. }
  149. /** * 有序集合获取 * * @param key * @param scoure * @param scoure1 * @return */
  150. public Set<Object> rangeByScore(String key, double scoure, double scoure1) {
  151. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  152. redisTemplate.opsForValue();
  153. return zset.rangeByScore(key, scoure, scoure1);
  154. }
  155. //第一次加载的时候将数据加载到redis中
  156. public void saveDataToRedis(String name) {
  157. double index = Math.abs(name.hashCode() % size);
  158. long indexLong = new Double(index).longValue();
  159. boolean availableUsers = setBit("availableUsers", indexLong, true);
  160. }
  161. //第一次加载的时候将数据加载到redis中
  162. public boolean getDataToRedis(String name) {
  163. double index = Math.abs(name.hashCode() % size);
  164. long indexLong = new Double(index).longValue();
  165. return getBit("availableUsers", indexLong);
  166. }
  167. /** * 有序集合获取排名 * * @param key 集合名称 * @param value 值 */
  168. public Long zRank(String key, Object value) {
  169. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  170. return zset.rank(key,value);
  171. }
  172. /** * 有序集合获取排名 * * @param key */
  173. public Set<ZSetOperations.TypedTuple<Object>> zRankWithScore(String key, long start,long end) {
  174. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  175. Set<ZSetOperations.TypedTuple<Object>> ret = zset.rangeWithScores(key,start,end);
  176. return ret;
  177. }
  178. /** * 有序集合添加 * * @param key * @param value */
  179. public Double zSetScore(String key, Object value) {
  180. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  181. return zset.score(key,value);
  182. }
  183. /** * 有序集合添加分数 * * @param key * @param value * @param scoure */
  184. public void incrementScore(String key, Object value, double scoure) {
  185. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  186. zset.incrementScore(key, value, scoure);
  187. }
  188. /** * 有序集合获取排名 * * @param key */
  189. public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithScore(String key, long start, long end) {
  190. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  191. Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeByScoreWithScores(key,start,end);
  192. return ret;
  193. }
  194. /** * 有序集合获取排名 * * @param key */
  195. public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithRank(String key, long start, long end) {
  196. ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
  197. Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeWithScores(key, start, end);
  198. return ret;
  199. }
  200. }

4.在service中使用

  1. @Autowired
  2. CropMapper cropMapper;
  3. @Autowired
  4. RedisUtil redisUtil;
  5. @Override
  6. public List<Crop> selectAllCropName() {
  7. //从缓存中获取
  8. List namelist= redisUtil.lRange("namelist",0,-1);
  9. //如果缓存中没有,则从mysql中获取
  10. if(namelist.size()==0){
  11. List list=cropMapper.selectByExample(null);
  12. for(Object crop:list){
  13. Crop crop1=(Crop)crop;
  14. namelist.add(crop1.getName());
  15. }
  16. }
  17. //加入缓存中并设置过期时间120s
  18. redisUtil.lSetlist("namelist",namelist,120);
  19. return namelist;
  20. }

2.springboot整合redis缓存注解@Cacheable、@CacheEvict、@CachePut

@Cacheable:

主要用来配置方法,能够根据方法的请求参数对其结果进行缓存。即当重复使用相同参数调用方法的时候,方法本身不会被调用执行,即方法本身被略过了,取而代之的是方法的结果直接从缓存中找到并返回了。
参数:
value:缓存的名字,必须指定至少一个。
key:缓存的key,可以为空,如果指定要按照SpEL表达式编写;如果不指定,则缺省按照方法的所有参数进行组合。
condition:缓存的条件,可以为空,使用SpEL编写,返回true或者false,只有为true才能缓存。

@CachePut:

这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,用于更新缓存与数据库。
参数同上。

@CacheEvict

删除缓存。参数:allEntries:true表示清除value中的全部缓存,默认为false。其余参数同上
1.pom.xml依赖

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

2.RedisConfig

  1. @Configuration
  2. @EnableCaching
  3. public class RedisConfig {
  4. @Bean
  5. public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisConnectionFactory){
  6. RedisTemplate<String,String> redisTemplate = new RedisTemplate<>();
  7. redisTemplate.setConnectionFactory(redisConnectionFactory);
  8. return redisTemplate;
  9. }
  10. //自定义key
  11. @Bean
  12. public KeyGenerator simpleKeyGenerator() {
  13. return (o, method, objects) -> {
  14. StringBuilder stringBuilder = new StringBuilder();
  15. stringBuilder.append(o.getClass().getSimpleName());
  16. stringBuilder.append(".");
  17. stringBuilder.append(method.getName());
  18. stringBuilder.append("[");
  19. for (Object obj : objects) {
  20. stringBuilder.append(obj.toString());
  21. }
  22. stringBuilder.append("]");
  23. return stringBuilder.toString();
  24. };
  25. }
  26. //默认缓存时间
  27. @Bean
  28. public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  29. return new RedisCacheManager(
  30. RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
  31. this.getRedisCacheConfigurationWithTtl(60), // 默认策略,未配置的 key 会使用这个
  32. this.getRedisCacheConfigurationMap() // 指定 key 策略
  33. );
  34. }
  35. //自定义缓存时间
  36. private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
  37. Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
  38. /* redisCacheConfigurationMap.put("SelectMax_T", this.getRedisCacheConfigurationWithTtl(30));*/
  39. return redisCacheConfigurationMap;
  40. }
  41. private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {
  42. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
  43. ObjectMapper om = new ObjectMapper();
  44. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  45. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  46. jackson2JsonRedisSerializer.setObjectMapper(om);
  47. RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
  48. redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(
  49. RedisSerializationContext
  50. .SerializationPair
  51. .fromSerializer(jackson2JsonRedisSerializer)
  52. ).entryTtl(Duration.ofSeconds(seconds));
  53. return redisCacheConfiguration;
  54. }
  55. }

3.使用

  1. @Override
  2. @CachePut(value = "Max_T",key="'CropId:'+#p0")
  3. public double UpdateMax_T(int CropId,double Max_T) {
  4. List list=parameterMapper.selectByExample(null);
  5. for(Object parameter_:list){
  6. Parameter parameter=(Parameter) parameter_;
  7. if(parameter.getCropId()==CropId){
  8. parameter.setMaxT(Max_T);
  9. parameterMapper.updateByExample(parameter, new ParameterExample());
  10. }
  11. }
  12. return Max_T;
  13. }
  14. @Override
  15. @Cacheable(value = "Max_T",key="'CropId:'+#p0")
  16. public double SelectMax_T(int CropId) {
  17. Double Max_T=0.0;
  18. List list=parameterMapper.selectByExample(null);
  19. for(Object parameter_:list){
  20. Parameter parameter=(Parameter) parameter_;
  21. if(parameter.getCropId()==CropId){
  22. Max_T=parameter.getMaxT();
  23. }
  24. }
  25. return Max_T;
  26. }

发表评论

表情:
评论列表 (有 0 条评论,449人围观)

还没有评论,来说两句吧...

相关阅读