Windows环境下springboot集成redis的安装与使用
Posted 队长给我球。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows环境下springboot集成redis的安装与使用相关的知识,希望对你有一定的参考价值。
一,redis安装
首先我们需要下载Windows版本的redis压缩包地址如下:
https://github.com/MicrosoftArchive/redis/releases
连接打开后如下图所示
我们选择64位的压缩包,下载后需要解压,我们解压至D盘,如下图所示:
接下来我们需要执行一些安装命令
1,在如上图的目录中,直接键入“cmd“
2,在打开的cmd命令窗口中输入 “redis-server.exe redis.windows.conf” 用于启动redis服务
(注意采用这个命令相当于启动一个临时服务,如果当前窗口被关闭,则服务也会被关闭)
3,我们再打开一个同样的cmd命令窗口,在其中键入 “redis-cli” ,这个命令的作用是启动一个redis客户端。客户端默认的端口号是6379 如果我们要修改端口号,需要打开我们前面执行的命令中的conf文件redis.windows.conf 找到port 修改其后的端口号
4,在启动的客户端中检查redis服务是否正常,我们可以进行数据的设置和读取等操作,比如我们可以执行一个命令 “set redis jj”,然后我们再执行一个命令“get redis” 就可以将前面设置的123 查询出来 ,如下图所示
5,将redis服务注册到我们的Windows,我们继续新打开一个cmd窗口,执行命令 “redis-server --service-install redis.windows.conf” 这个时候呢,提示:Redis successfully installed as a service. 表示加入服务成功!
6,启动注册到Windows的redis服务。键入命令“redis-server.exe --service-start” 可能会报错,如下图。原因是我们已经在这个端口绑定了一个服务,就是我们前面启动的那个所谓的临时服务,这个时候我们需要关闭刚才启动的临时服务的窗口。
7,再启动如果还是报上面的错误,那可能需要我们调整注册到Windows的服务为本地系统服务,而不是网络服务,如下图所示。除此之外可能还会有防火墙等问题导致redis服务启动失败。
8,如下图所示,服务启动ok,这个时候我们在继续操作redis客户端是没有问题的。
二,springboot 集成redis
1,新建springboot工程,如果有不清楚如何新建的,请移步 https://www.cnblogs.com/JJJ1990/p/8384386.html
2,在pom文件中加入redis jar包的引用
我的整个工程的pom文件如下,注意第34-38行,即为引入的redis jar包
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com</groupId> 6 <artifactId>redis</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>redis</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 </properties> 16 17 <parent> 18 <groupId>org.springframework.boot</groupId> 19 <artifactId>spring-boot-starter-parent</artifactId> 20 <version>1.5.8.RELEASE</version> 21 </parent> 22 23 <dependencies> 24 <dependency> 25 <groupId>junit</groupId> 26 <artifactId>junit</artifactId> 27 <version>3.8.1</version> 28 <scope>test</scope> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-web</artifactId> 33 </dependency> 34 <dependency> 35 <groupId>org.springframework.boot</groupId> 36 <artifactId>spring-boot-starter-data-redis</artifactId> 37 </dependency> 38 </dependencies> 39 </project>
3,编写RedisConfig 类代码
1 package com.redis; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.context.annotation.PropertySource; 7 import org.springframework.data.redis.connection.RedisConnectionFactory; 8 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; 9 import org.springframework.data.redis.core.RedisTemplate; 10 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; 11 import org.springframework.data.redis.serializer.StringRedisSerializer; 12 13 import redis.clients.jedis.JedisPoolConfig; 14 15 @Configuration 16 @PropertySource("classpath:config/redis.properties") 17 public class RedisConfig { 18 19 @Value("${redis.maxIdle}") 20 private Integer maxIdle; 21 22 @Value("${redis.maxTotal}") 23 private Integer maxTotal; 24 25 @Value("${redis.maxWaitMillis}") 26 private Integer maxWaitMillis; 27 28 @Value("${redis.minEvictableIdleTimeMillis}") 29 private Integer minEvictableIdleTimeMillis; 30 31 @Value("${redis.numTestsPerEvictionRun}") 32 private Integer numTestsPerEvictionRun; 33 34 @Value("${redis.timeBetweenEvictionRunsMillis}") 35 private long timeBetweenEvictionRunsMillis; 36 37 @Value("${redis.testOnBorrow}") 38 private boolean testOnBorrow; 39 40 @Value("${redis.testWhileIdle}") 41 private boolean testWhileIdle; 42 43 44 @Value("${spring.redis.cluster.nodes}") 45 private String clusterNodes; 46 47 @Value("${spring.redis.cluster.max-redirects}") 48 private Integer mmaxRedirectsac; 49 50 /** 51 * JedisPoolConfig 连接池 52 * @return 53 */ 54 @Bean 55 public JedisPoolConfig jedisPoolConfig() { 56 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 57 // 最大空闲数 58 jedisPoolConfig.setMaxIdle(maxIdle); 59 // 连接池的最大数据库连接数 60 jedisPoolConfig.setMaxTotal(maxTotal); 61 // 最大建立连接等待时间 62 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); 63 // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟) 64 jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); 65 // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3 66 jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun); 67 // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 68 jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); 69 // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 70 jedisPoolConfig.setTestOnBorrow(testOnBorrow); 71 // 在空闲时检查有效性, 默认false 72 jedisPoolConfig.setTestWhileIdle(testWhileIdle); 73 System.out.println("redis 连接池配置完成!"); 74 return jedisPoolConfig; 75 } 76 /** 77 * 单机版配置 78 * @throws 79 */ 80 @Bean 81 public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig){ 82 JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig); 83 //连接池 84 JedisConnectionFactory.setPoolConfig(jedisPoolConfig); 85 //IP地址 86 JedisConnectionFactory.setHostName("127.0.0.1"); 87 //端口号 88 JedisConnectionFactory.setPort(6379); 89 //如果Redis设置有密码 90 //JedisConnectionFactory.setPassword(password); 91 //客户端超时时间单位是毫秒 92 JedisConnectionFactory.setTimeout(5000); 93 System.out.println("jedis 连接工厂配置完成!"); 94 return JedisConnectionFactory; 95 } 96 97 /** 98 * 实例化 RedisTemplate 对象 99 * @return 100 */ 101 @Bean 102 public RedisTemplate<String, Object> functionDomainRedisTemplate(JedisConnectionFactory redisConnectionFactory) { 103 RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); 104 initDomainRedisTemplate(redisTemplate, redisConnectionFactory); 105 System.out.println("functionDomainRedisTemplates 配置完成!"); 106 return redisTemplate; 107 } 108 /** 109 * 设置数据存入 redis 的序列化方式,并开启事务 110 * @param redisTemplate 111 * @param factory 112 */ 113 private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) { 114 //如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can\'t cast to String! 115 redisTemplate.setKeySerializer(new StringRedisSerializer()); 116 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); 117 redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); 118 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); 119 // 开启事务 120 redisTemplate.setEnableTransactionSupport(true); 121 redisTemplate.setConnectionFactory(factory); 122 } 123 /** 124 * 注入封装RedisTemplate 125 * @Title: redisUtil 126 * @return RedisUtil 127 * @throws 128 */ 129 @Bean(name = "redisUtil") 130 public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) { 131 RedisUtil redisUtil = new RedisUtil(); 132 redisUtil.setRedisTemplate(redisTemplate); 133 System.out.println("redisUtil 配置完成!"); 134 return redisUtil; 135 } 136 }
4,编写RedisUtil类,用于操作redis数据库
1 package com.redis; 2 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Set; 6 import java.util.concurrent.TimeUnit; 7 8 import org.springframework.data.redis.core.RedisTemplate; 9 import org.springframework.util.CollectionUtils; 10 11 public class RedisUtil { 12 13 private RedisTemplate<String, Object> redisTemplate; 14 15 public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { 16 this.redisTemplate = redisTemplate; 17 } 18 19 /** 20 * 指定缓存失效时间 21 * @param key 键 22 * @param time 时间(秒) 23 * @return 24 */ 25 public boolean expire(String key,long time){ 26 try { 27 if(time>0){ 28 redisTemplate.expire(key, time, TimeUnit.SECONDS); 29 } 30 return true; 31 } catch (Exception e) { 32 e.printStackTrace(); 33 return false; 34 } 35 } 36 37 /** 38 * 根据key 获取过期时间 39 * @param key 键 不能为null 40 * @return 时间(秒) 返回0代表为永久有效 41 */ 42 public long getExpire(String key){ 43 return redisTemplate.getExpire(key,TimeUnit.SECONDS); 44 } 45 46 /** 47 * 判断key是否存在 48 * @param key 键 49 * @return true 存在 false不存在 50 */ 51 public boolean hasKey(String key){ 52 try { 53 return redisTemplate.hasKey(key); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 return false; 57 } 58 } 59 60 /** 61 * 删除缓存 62 * @param key 可以传一个值 或多个 63 */ 64 @SuppressWarnings("unchecked") 65 public void del(String ... key){ 66 if(key!=null&&key.length>0){ 67 if(key.length==1){ 68 redisTemplate.delete(key[0]); 69 }else{ 70 redisTemplate.delete(CollectionUtils.arrayToList(key)); 71 } 72 } 73 } 74 75 //============================String============================= 76 /** 77 * 普通缓存获取 78 * @param key 键 79 * @return 值 80 */ 81 public Object get(String key){ 82 return key==null?null:redisTemplate.opsForValue().get(key); 83 } 84 85 /** 86 * 普通缓存放入 87 * @param key 键 88 * @param value 值 89 * @return true成功 false失败 90 */ 91 public boolean set(String key,Object value) { 92 try { 93 redisTemplate.opsForValue().set(key, value); 94 return true; 95 } catch (Exception e) { 96 e.printStackTrace(); 97 return false; 98 } 99 100 } 101 102 /** 103 * 普通缓存放入并设置时间 104 * @param key 键 105 * @param value 值 106 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 107 * @return true成功 false 失败 108 */ 109 public boolean set(String key,Object value,long time){ 110 try { 111 if(time>0){ 112 redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); 113 }else{ 114 set(key, value); 115 } 116 return true; 117 } catch (Exception e) { 118 e.printStackTrace(); 119 return false; 120 } 121 } 122 123 /** 124 * 递增 125 * @param key 键 126 * @param by 要增加几(大于0) 127 * @return 128 */ 129 public long incr(String key, long delta){ 130 if(delta<0){ 131 throw new RuntimeException("递增因子必须大于0"); 132 } 133 return redisTemplate.opsForValue().increment(key, delta); 134 } 135 136 /** 137 * 递减 138 * @param key 键 139 * @param by 要减少几(小于0) 140 * @return 141 */ 142 public long decr(String key, long delta){ 143 if(delta<0){ 144 throw new RuntimeException("递减因子必须大于0"); 145 } 146 return redisTemplate.opsForValue().increment(key, -delta); 147 } 148 149 //================================Map================================= 150 /** 151 * HashGet 152 * @param key 键 不能为null 153 * @param item 项 不能为null 154 * @return 值 155 */ 156 public Object hget(String key,String item){ 157 return redisTemplate.opsForHash().get(key, item); 158 } 159 160 /** 161 * 获取hashKey对应的所有键值 162 * @param key 键 163 * @return 对应的多个键值 164 */ 165 public Map<Object,Object> hmget(String key){ 166 return redisTemplate.opsForHash().entries(key); 167 } 168 169 /** 170 * HashSet 171 * @param key 键 172 * @param map 对应多个键值 173 * @return true 成功 false 失败 174 */ 175 public boolean hmset(String key, Map<String,Object> map){ 176 try { 177 redisTemplate.opsForHash().putAll(key, map); 178 return true; 179 } catch (Exception e) { 180 e.printStackTrace(); 181 return false; 182 } 183 } 184 185 /** 186 * HashSet 并设置时间 187 * @param key 键 188 * @param map 对应多个键值 189 * @param time 时间(秒) 190 * @return true成功 false失败 191 */ 192 public boolean hmset(String key, Map<String,Object> map, long time){ 193 try { 194 redisTemplate.opsForHash().putAll(key, map); 195 if(time>0){ 196 expire(key, time); 197 } 198 return true; 199 } catch (Exception e) { 200 e.printStackTrace(); 201 return false; 202 } 203 } 204 205 /** 206 * 向一张hash表中放入数据,如果不存在将创建 207 * @param key 键 208 * @param item 项 209 * @param value 值 210 * @return true 成功 false失败 211 */ 212 public boolean hset(String key,String item,Object value) { 213 try { 214 redisTemplate.opsForHash().put(key, item, value); 215 return true; 216 } catch (Exception e) { 217 e.printStackTrace(); 218 return false; 219 } 220 } 221 222 /** 223 * 向一张hash表中放入数据,如果不存在将创建 224 * @param key 键 22以上是关于Windows环境下springboot集成redis的安装与使用的主要内容,如果未能解决你的问题,请参考以下文章