Redis安裝
首先安裝redis。這個就不重點介紹了。windos下載redis就行。
我用的是mac
用命令行安裝的。
安裝命令
1
|
yum install redis |
運行命令
1
|
sudo redis-server |
這樣就安裝運行成功了。
spring集成redis
首先你需要下載驅動包,下載 jedis.jar,確保下載最新驅動包。然后導包。
在spring配置文件里我這是ApplicationContext .xml文件添加
1
2
|
<!-- 引入同文件夾下的redis屬性配置文件 --> < import resource = "spring-redis.xml" /> |
然后用創建spring-redis.xml文件
寫入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
<? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 緩存的層級--> < context:component-scan base-package = "com.niit.cache" /> <!-- 引入redis配置 --> < context:property-placeholder location = "/WEB-INF/classes/redis.properties" ignore-unresolvable = "true" /> <!-- Redis 配置 --> < bean id = "jedisPoolConfig" class = "redis.clients.jedis.JedisPoolConfig" > < property name = "maxTotal" value = "${redis.pool.maxTotal}" /> < property name = "maxIdle" value = "${redis.pool.maxIdle}" /> < property name = "maxWaitMillis" value = "${redis.pool.maxWaitMillis}" /> < property name = "testOnBorrow" value = "${redis.pool.testOnBorrow}" /> </ bean > <!-- JedisCluster 集群高可用配置 --> <!--<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg index="0"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip1}" /> <constructor-arg index="1" value="${redis.port1}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip2}" /> <constructor-arg index="1" value="${redis.port2}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip3}" /> <constructor-arg index="1" value="${redis.port3}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip4}" /> <constructor-arg index="1" value="${redis.port4}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip5}" /> <constructor-arg index="1" value="${redis.port5}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip6}" /> <constructor-arg index="1" value="${redis.port6}" type="int" /> </bean> </set> </constructor-arg> <constructor-arg index="1" value="2000" type="int"></constructor-arg> <constructor-arg index="2" value="100" type="int"></constructor-arg> <constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg> </bean>--> <!--redis Sentinel主從高可用方案配置 --> <!-- <bean id="sentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration"> <property name="master"> <bean class="org.springframework.data.redis.connection.RedisNode"> <property name="name" value="master-1"></property> </bean> </property> <property name="sentinels"> <set> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="${sentinel1.ip}"></constructor-arg> <constructor-arg name="port" value="${sentinel1.port}"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="${sentinel2.ip}"></constructor-arg> <constructor-arg name="port" value="${sentinel2.port}"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="${sentinel3.ip}"></constructor-arg> <constructor-arg name="port" value="${sentinel3.port}"></constructor-arg> </bean> </set> </property> </bean> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"> <property name="password" value="${redis.pass}" /> <property name="poolConfig"> <ref bean="jedisPoolConfig" /> </property> <constructor-arg name="sentinelConfig" ref="sentinelConfiguration" /> </bean> --> <!-- redis單節點數據庫連接配置 --> < bean id = "jedisConnectionFactory" class = "org.springframework.data.redis.connection.jedis.JedisConnectionFactory" > < property name = "hostName" value = "${redis.ip}" /> < property name = "port" value = "${redis.port}" /> < property name = "password" value = "${redis.pass}" /> < property name = "poolConfig" ref = "jedisPoolConfig" /> </ bean > <!-- redisTemplate配置,redisTemplate是對Jedis的對redis操作的擴展,有更多的操作,封裝使操作更便捷 --> < bean id = "redisTemplate" class = "org.springframework.data.redis.core.StringRedisTemplate" > < property name = "connectionFactory" ref = "jedisConnectionFactory" /> </ bean > </ beans > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
public class RedisCache { public final static String CAHCENAME = "niitcache" ; // 緩存名 public final static int CAHCETIME = 60 ; // 默認緩存時間 60S public final static int CAHCEHOUR = 60 * 60 ; // 默認緩存時間 1hr public final static int CAHCEDAY = 60 * 60 * 24 ; // 默認緩存時間 1Day public final static int CAHCEWEEK = 60 * 60 * 24 * 7 ; // 默認緩存時間 1week public final static int CAHCEMONTH = 60 * 60 * 24 * 7 * 30 ; // 默認緩存時間 1month @Autowired private RedisTemplate<String, String> redisTemplate; public <T> boolean putCache(String key, T obj) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serialize(obj); boolean result = redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.setNX(bkey, bvalue); } }); return result; } public <T> void putCacheWithExpireTime(String key, T obj, final long expireTime) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serialize(obj); redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { connection.setEx(bkey, expireTime, bvalue); return true ; } }); } public <T> boolean putListCache(String key, List<T> objList) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serializeList(objList); boolean result = redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.setNX(bkey, bvalue); } }); return result; } public <T> boolean putListCacheWithExpireTime(String key, List<T> objList, final long expireTime) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serializeList(objList); boolean result = redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { connection.setEx(bkey, expireTime, bvalue); return true ; } }); return result; } public <T> T getCache( final String key, Class<T> targetClass) { byte [] result = redisTemplate.execute( new RedisCallback< byte []>() { @Override public byte [] doInRedis(RedisConnection connection) throws DataAccessException { return connection.get(key.getBytes()); } }); if (result == null ) { return null ; } return ProtoStuffSerializerUtil.deserialize(result, targetClass); } public <T> List<T> getListCache( final String key, Class<T> targetClass) { byte [] result = redisTemplate.execute( new RedisCallback< byte []>() { @Override public byte [] doInRedis(RedisConnection connection) throws DataAccessException { return connection.get(key.getBytes()); } }); if (result == null ) { return null ; } return ProtoStuffSerializerUtil.deserializeList(result, targetClass); } /** * 精確刪除key * * @param key */ public void deleteCache(String key) { redisTemplate.delete(key); } /** * 模糊刪除key * * @param pattern */ public void deleteCacheWithPattern(String pattern) { Set<String> keys = redisTemplate.keys(pattern); redisTemplate.delete(keys); } /** * 清空所有緩存 */ public void clearCache() { deleteCacheWithPattern(RedisCache.CAHCENAME + "|*" ); } } |
創建redis的配置文件 redis.properties。
寫入
1
2
3
4
5
6
7
8
9
|
#redis config redis.pass= redis.pool.maxTotal= 105 redis.pool.maxIdle= 10 redis.pool.maxWaitMillis= 5000 redis.pool.testOnBorrow= true redis.ip= 127.0 . 0.1 redis.port= 6379 |
這些根據自己的需求自定義配置就好了
這樣redis就繼承好了
SpringMVC中使用redis
創建一個redisCache類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import com.niit.util.ProtoStuffSerializerUtil; import java.util.List; import java.util.Set; /** * redis緩存 * * @author James * */ @Component public class RedisCache { public final static String CAHCENAME = "niitcache" ; // 緩存名 public final static int CAHCETIME = 60 ; // 默認緩存時間 60S public final static int CAHCEHOUR = 60 * 60 ; // 默認緩存時間 1hr public final static int CAHCEDAY = 60 * 60 * 24 ; // 默認緩存時間 1Day public final static int CAHCEWEEK = 60 * 60 * 24 * 7 ; // 默認緩存時間 1week public final static int CAHCEMONTH = 60 * 60 * 24 * 7 * 30 ; // 默認緩存時間 1month @Autowired private RedisTemplate<String, String> redisTemplate; public <T> boolean putCache(String key, T obj) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serialize(obj); boolean result = redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.setNX(bkey, bvalue); } }); return result; } public <T> void putCacheWithExpireTime(String key, T obj, final long expireTime) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serialize(obj); redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { connection.setEx(bkey, expireTime, bvalue); return true ; } }); } public <T> boolean putListCache(String key, List<T> objList) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serializeList(objList); boolean result = redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.setNX(bkey, bvalue); } }); return result; } public <T> boolean putListCacheWithExpireTime(String key, List<T> objList, final long expireTime) { final byte [] bkey = key.getBytes(); final byte [] bvalue = ProtoStuffSerializerUtil.serializeList(objList); boolean result = redisTemplate.execute( new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { connection.setEx(bkey, expireTime, bvalue); return true ; } }); return result; } public <T> T getCache( final String key, Class<T> targetClass) { byte [] result = redisTemplate.execute( new RedisCallback< byte []>() { @Override public byte [] doInRedis(RedisConnection connection) throws DataAccessException { return connection.get(key.getBytes()); } }); if (result == null ) { return null ; } return ProtoStuffSerializerUtil.deserialize(result, targetClass); } public <T> List<T> getListCache( final String key, Class<T> targetClass) { byte [] result = redisTemplate.execute( new RedisCallback< byte []>() { @Override public byte [] doInRedis(RedisConnection connection) throws DataAccessException { return connection.get(key.getBytes()); } }); if (result == null ) { return null ; } return ProtoStuffSerializerUtil.deserializeList(result, targetClass); } /** * 精確刪除key * * @param key */ public void deleteCache(String key) { redisTemplate.delete(key); } /** * 模糊刪除key * * @param pattern */ public void deleteCacheWithPattern(String pattern) { Set<String> keys = redisTemplate.keys(pattern); redisTemplate.delete(keys); } /** * 清空所有緩存 */ public void clearCache() { deleteCacheWithPattern(RedisCache.CAHCENAME + "|*" ); } } |
寫進和讀取redis
1
2
3
4
|
<span style= "white-space:pre" > </span>String v = "test" ; cache.putCacheWithExpireTime( "key" , v, cache.CAHCEHOUR); String value = cache.getCache( "key" , String. class ); System.out.println(value); |
然后集成成功。redis是將數據放進內存里。所以需要考慮做redis服務器時候的內存性能,還有redis的緩存策略等等。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_24046745/article/details/52702261