springmvc集成使用redis过程
Redis安装
首先安装redis。这个就不重点介绍了。windos下载redis就行。
我用的是mac
用命令行安装的。
安装命令
yum install redis
运行命令
sudo redis-server
这样就安装运行成功了。
spring集成redis
首先你需要下载驱动包,下载 jedis.jar,确保下载最新驱动包。然后导包。
在spring配置文件里我这是ApplicationContext .xml文件添加
<!-- 引入同文件夹下的redis属性配置文件 --> <import resource="spring-redis.xml" />
然后用创建spring-redis.xml文件
写入
<?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" ><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" ><constructor-arg index="0"><set><bean ><constructor-arg index="0" value="${redis.ip1}" /><constructor-arg index="1" value="${redis.port1}" type="int" /></bean><bean ><constructor-arg index="0" value="${redis.ip2}" /><constructor-arg index="1" value="${redis.port2}" type="int" /></bean><bean ><constructor-arg index="0" value="${redis.ip3}" /><constructor-arg index="1" value="${redis.port3}" type="int" /></bean><bean ><constructor-arg index="0" value="${redis.ip4}" /><constructor-arg index="1" value="${redis.port4}" type="int" /></bean><bean ><constructor-arg index="0" value="${redis.ip5}" /><constructor-arg index="1" value="${redis.port5}" type="int" /></bean><bean ><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" ><property name="master"><bean ><property name="name" value="master-1"></property></bean></property><property name="sentinels"><set><bean ><constructor-arg name="host" value="${sentinel1.ip}"></constructor-arg><constructor-arg name="port" value="${sentinel1.port}"></constructor-arg></bean><bean ><constructor-arg name="host" value="${sentinel2.ip}"></constructor-arg><constructor-arg name="port" value="${sentinel2.port}"></constructor-arg></bean><bean ><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" ><property name="password" value="${redis.pass}" /><property name="poolConfig"><ref bean="jedisPoolConfig" /></property><constructor-arg name="sentinelConfig" ref="sentinelConfiguration" /></bean> --> <!-- redis单节点数据库连接配置 --><bean id="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" ><property name="connectionFactory" ref="jedisConnectionFactory" /></bean></beans>
public class RedisCache { public final static String CAHCENAME = "niitcache";// 缓存名public final static int CAHCETIME = 60;// 默认缓存时间 60Spublic final static int CAHCEHOUR = 60 * 60;// 默认缓存时间 1hrpublic final static int CAHCEDAY = 60 * 60 * 24;// 默认缓存时间 1Daypublic final static int CAHCEWEEK = 60 * 60 * 24 * 7;// 默认缓存时间 1weekpublic final static int CAHCEMONTH = 60 * 60 * 24 * 7 * 30;// 默认缓存时间 1month @Autowiredprivate 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>() {@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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[]>() {@Overridepublic 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[]>() {@Overridepublic 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。
写入
#redis configredis.pass=redis.pool.maxTotal=105redis.pool.maxIdle=10redis.pool.maxWaitMillis=5000redis.pool.testOnBorrow=true redis.ip=127.0.0.1redis.port=6379
这些根据自己的需求自定义配置就好了
这样redis就继承好了
SpringMVC中使用redis
创建一个redisCache类
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 * */@Componentpublic class RedisCache { public final static String CAHCENAME = "niitcache";// 缓存名public final static int CAHCETIME = 60;// 默认缓存时间 60Spublic final static int CAHCEHOUR = 60 * 60;// 默认缓存时间 1hrpublic final static int CAHCEDAY = 60 * 60 * 24;// 默认缓存时间 1Daypublic final static int CAHCEWEEK = 60 * 60 * 24 * 7;// 默认缓存时间 1weekpublic final static int CAHCEMONTH = 60 * 60 * 24 * 7 * 30;// 默认缓存时间 1month @Autowiredprivate 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>() {@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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[]>() {@Overridepublic 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[]>() {@Overridepublic 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
<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的缓存策略等等。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。