Spring整合Redis
Oracle: 存储数据, 使用SQL操作数据库
Java 程序作为客户端, 发送sql, 操作数据库: jdbc
Redis: key/value 内存式数据库, 存储数据, redis: 存储热点数据
Java程序作为客户端, jedis
使用Spring-data-redis+jedis操作redis
与Spring整合, spring-data-redis, 底层使用的jedis 注意:测试前必须得先开启redis服务器,如果配置主从复制需要全部开启,配置哨兵也需要全部开启 ****
1、导入依赖
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency>
2、添加redis的配置文件:redis.properties
#访问地址
redis.host=127.0.0.1
#访问端口
redis.port=6379
#注意,如果没有password,此处不设置值,但这一项要保留
redis.password=
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis.maxIdle=300
#最小空闲数,数据库连接的最小空闲时间。
redis.minIdle=10
#连接池的最大数据库连接数。设为0表示无限制
redis.maxActive=600
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWait=5000
#在borrow获取一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
redis.testOnBorrow=true
3、在spring配置文件中,配置redis:
applicationContext-redis.xml:
①如果添加了哨兵机制则需要配置,或开启几台配几台,可以不配置
<!--redis哨兵 --> <bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration"> <property name="master"> <bean class="org.springframework.data.redis.connection.RedisNode"> <property name="name" value="mymaster" /> --name的意思 </bean> </property> <!-- 哨兵 --> <property name="sentinels"> <set> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="127.0.0.1" /> <constructor-arg name="port" value="10001" /> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="127.0.0.1" /> <constructor-arg name="port" value="10002" /> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="127.0.0.1" /> <constructor-arg name="port" value="10003" /> </bean> </set> </property> </bean>
name就是哨兵的名字
配置几台哨兵就添加几个bean,ip、端口需要一致
②jedis连接对象
底层:JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration);
...jedisConnectionFactory.setPoolConfig(); ....sethostName...
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="poolConfig" ref="jedisPoolConfig"></property> <property name="hostName" value="${redis.host}"></property> <property name="port" value="${redis.port}"></property> <property name="password" value="${redis.password}" /> <!-- 哨兵 --> <constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration" /> </bean> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxActive}" /><!-- 最大连接数 --> <property name="maxIdle" value="${redis.maxIdle}" /><!-- 最大闲置 --> <property name="minIdle" value="${redis.minIdle}" /><!-- 最小闲置 --> <property name="maxWaitMillis" value="${redis.maxWait}" /><!-- 最大等待 --> <property name="testOnBorrow" value="${redis.testOnBorrow}" /><!-- 可以获取 --> </bean>
③RedisTemplate的bean
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory" /> <!-- 序列化方式 建议key/hashKey采用StringRedisSerializer --> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> </property> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> </property> <!-- 开启REIDS事务支持 --> <property name="enableTransactionSupport" value="false" /> </bean> <!-- 对string操作的封装 --> <!-- <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <constructor-arg ref="jedisConnectionFactory" /> 开启REIDS事务支持 <property name="enableTransactionSupport" value="false" /> </bean> -->
配置RedisTemplate这个bean,类似Mybatis的SqlSession, 使用RedisTemplate操作redis, 封装好了操作redis的方法 , 他有一个子类, StringRedisTemplate,开发中, 使用RedisTemplate
注意:一般只使用RedisTemplate,实体类习惯性实现序列化接口
public class House implements Serializable{ private static final long serialVersionUID = -4392862698633582732L;
使用RedisTemplate来操作Redis
RedisTemplate / StringRedisTemplate中定义了对redis的5种数据结构的操作:
- opsForValue() 操作字符串
- opsForHash() 操作hash
- opsForList() 操作list
- opsForSet() 操作set
- opsForZSet() 操作ZSet
1、两者数据各自存,各自取,数据不互通。
RedisTemplate不能取StringRedisTemplate存入的数据。
StringRedisTemplate不能取RedisTemplate存入的数据
2、序列化策略不同。
RedisTemplate采用JDK的序列化策略
StringRedisTemplate采用String的序列化策略
如果你需要缓存的是字符串,那么你就使用StringRedisTemplate即可。
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,
那么使用RedisTemplate是更好的选择
测试方法(5种数据类型的简单使用):
1、opsForValue : String
// 存入数据 redisTemplate.opsForValue().set("aaa", "111", 100, TimeUnit.SECONDS); redisTemplate.opsForValue().set("bbb", "2222"); // 获取数据 String k1 = (String) redisTemplate.opsForValue().get("bbb"); System.out.println(k1);
2、opsForHash() : hash
// 一对key/value添加 redisTemplate.opsForHash().put("h1", "name", "张三"); redisTemplate.opsForHash().put("h1", "age", "21"); redisTemplate.opsForHash().put("h1", "sex", "男"); //批量添加 Map map = new HashMap(); map.put("name", "李四"); map.put("age", "21"); map.put("sex", "男"); redisTemplate.opsForHash().putAll("h2", map); //取值 System.out.println(redisTemplate.opsForHash().get("h1", "name")); //redisTemplate.opsForHash().hasKey("h1", "age"); Map reMap = redisTemplate.opsForHash().entries("h2"); System.out.println(reMap);
3、rightPushAll :list
redisTemplate.opsForList().rightPushAll("l1", "1","2","3","4","5","1");
4、opsForSet : set
redisTemplate.opsForSet().add("s1", "1","2","3","1","4");
5、opsForZSet : ZSet
//存数据 Set<TypedTuple<String>> set = new HashSet<>(); set.add(new DefaultTypedTuple("张三", 80.0)); set.add(new DefaultTypedTuple("李四", 85.0)); set.add(new DefaultTypedTuple("王五", 68.0)); set.add(new DefaultTypedTuple("赵六", 90.0)); redisTemplate.opsForZSet().add("zset", set); //取数据 Set<String> values = redisTemplate.opsForZSet().reverseRange("zset", 0, -1); System.out.println(values);