redis客户端与spring整合
redis配置文件##redis
#IP\u5730\u5740
redis.pool.host=localhost
#\u7AEF\u53E3\u53F7
redis.pool.port=6379
#redis.pool.pass=123456
#\u6700\u5927\u80FD\u591F\u4FDD\u6301idel\u72B6\u6001\u7684\u5BF9\u8C61\u6570
redis.pool.maxIdle=300
#\u6700\u5927\u5206\u914D\u7684\u5BF9\u8C61\u6570
redis.pool.maxTotal=600
#\u591A\u957F\u65F6\u95F4\u68C0\u67E5\u4E00\u6B21\u8FDE\u63A5\u6C60\u4E2D\u7A7A\u95F2\u7684\u8FDE\u63A5
redis.pool.timeBetweenEvictionRunsMillis=30000
#\u7A7A\u95F2\u8FDE\u63A5\u591A\u957F\u65F6\u95F4\u540E\u4F1A\u88AB\u6536\u56DE
redis.pool.minEvictableIdleTimeMillis=30000
#\u5F53\u8C03\u7528borrow Object\u65B9\u6CD5\u65F6\uFF0C\u662F\u5426\u8FDB\u884C\u6709\u6548\u6027\u68C0\u67E5
redis.pool.testOnBorrow=true
########reids\u7F16\u7801\u683C\u5F0F
redis.encode=utf-8
######\u7F13\u5B58\u8FC7\u671F\u65F6\u95F4 \u79D2 1000*60*60*24*7 \u4E03\u5929
redis.expire=604800000
####\u662F\u5426\u5F00\u542FRedis\u670D\u52A1\u5E94\u7528
redis.unlock=false
spring 配置文件
<!-- Redis缓存配置 -->
<bean id="jedisConnFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName"><value>${redis.pool.host}</value></property>
<property name="port"><value>${redis.pool.port}</value> </property>
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnFactory" />
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxActive"><value>${redis.pool.maxTotal}</value></property>
<property name="maxIdle"><value>${redis.pool.maxIdle}</value></property>
<property name="timeBetweenEvictionRunsMillis"><value>${redis.pool.timeBetweenEvictionRunsMillis}</value></property>
<property name="minEvictableIdleTimeMillis"><value>${redis.pool.minEvictableIdleTimeMillis}</value></property>
<property name="testOnBorrow" ><value>${redis.pool.testOnBorrow}</value></property>
</bean>
代码实现
1.保存——HMSET
Java代码
[*]@Override
[*]public void save(final User user) {
[*] redisTemplate.execute(new RedisCallback<Object>() {
[*] @Override
[*] public Object doInRedis(RedisConnection connection)
[*] throws DataAccessException {
[*] byte[] key = redisTemplate.getStringSerializer().serialize(
[*] "uc.user.info.uid." + user.getUid());
[*] BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate
[*] .boundHashOps(key);
[*] boundHashOperations.put(redisTemplate.getStringSerializer()
[*] .serialize("mobile"), redisTemplate
[*] .getStringSerializer().serialize(user.getMobile()));
[*] boundHashOperations.put(redisTemplate.getStringSerializer()
[*] .serialize("address"), redisTemplate
[*] .getStringSerializer().serialize(user.getAddress()));
[*] boundHashOperations.put(redisTemplate.getStringSerializer()
[*] .serialize("postCode"), redisTemplate
[*] .getStringSerializer().serialize(user.getPostCode()));
[*] connection.hMSet(key, boundHashOperations.entries());
[*] return null;
[*] }
[*] });
[*]}
这里用到:
Java代码
[*]BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
[*]boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));
看着就有点肿。。。Map封装完以后,用HMSET命令:
Java代码
[*]connection.hMSet(key, boundHashOperations.entries());
这时候就完成了哈希表的保存操作,可以在控制台看到相应的数据了。
redis 127.0.0.1:6379> hmget uc.user.info.uid.u123456 address mobile postCode
1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
2.获取——HMGET
这一刻,我彻底崩溃了!取出来的值是个List,还得根据取得顺序,逐个反序列化,得到内容。
Java代码
[*]@Override
[*]public User read(final String uid) {
[*] return redisTemplate.execute(new RedisCallback<User>() {
[*] @Override
[*] public User doInRedis(RedisConnection connection)
[*] throws DataAccessException {
[*] byte[] key = redisTemplate.getStringSerializer().serialize(
[*] "uc.user.info.uid." + uid);
[*] if (connection.exists(key)) {
[*] List<byte[]> value = connection.hMGet(
[*] key,
[*] redisTemplate.getStringSerializer().serialize(
[*] "address"),
[*] redisTemplate.getStringSerializer().serialize(
[*] "mobile"), redisTemplate
[*] .getStringSerializer()
[*] .serialize("postCode"));
[*] User user = new User();
[*] String address = redisTemplate.getStringSerializer()
[*] .deserialize(value.get(0));
[*] user.setAddress(address);
[*] String mobile = redisTemplate.getStringSerializer()
[*] .deserialize(value.get(1));
[*] user.setMobile(mobile);
[*] String postCode = redisTemplate.getStringSerializer()
[*] .deserialize(value.get(2));
[*] user.setPostCode(postCode);
[*] user.setUid(uid);
[*]
[*] return user;
[*] }
[*] return null;
[*] }
[*] });
[*]}
这个实现,跟Redis的命令几乎一模一样,指定Key,指定field,获取其值。
Java代码
[*]List<byte[]> value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
[*]redisTemplate.getStringSerializer().serialize("mobile"),
[*]redisTemplate.getStringSerializer().serialize("postCode"));
Java代码
[*]User user = new User();
[*]String address = redisTemplate.getStringSerializer().deserialize(value.get(0));
[*]user.setAddress(address);
[*]String mobile = redisTemplate.getStringSerializer().deserialize(value.get(1));
[*]user.setMobile(mobile);
[*]String postCode = redisTemplate.getStringSerializer().deserialize(value.get(2));
[*]user.setPostCode(postCode);
页:
[1]