spring-data-redis 使用过程中踩过的坑
2019-06-04 14:30
1671 查看
spring-data-redis简介
Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。
spring-data-redis针对jedis提供了如下功能:
- 连接池自动管理,提供了一个高度封装的“RedisTemplate”类
- 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
踩坑1:序列化问题
SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
就是因为序列化策略的不同,即使是同一个key用不同的Template去序列化,结果是不同的。所以根据key去操作数据的时候就出现了操作失败的问题。
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" /> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="keySerializer" ref="stringRedisSerializer" /> <property name="hashKeySerializer" ref="stringRedisSerializer" /> <property name="valueSerializer" ref="stringRedisSerializer"/> </bean>
建议:
redis 序列化策略 ,建议采用String序列化策略
踩坑2:设置一个键值及其过期时间
错误的设置方式:
/** * Overwrite parts of {@code key} starting at the specified {@code offset} with given {@code value}. * * @param key must not be {@literal null}. * @param value * @param offset * @see <a href="http://redis.io/commands/setrange">Redis Documentation: SETRANGE</a> */ void set(K key, V value, long offset);
正确的设置方式:
/** * Set the {@code value} and expiration {@code timeout} for {@code key}. * * @param key must not be {@literal null}. * @param value * @param timeout * @param unit must not be {@literal null}. * @see <a href="http://redis.io/commands/setex">Redis Documentation: SETEX</a> */ void set(K key, V value, long timeout, TimeUnit unit);
踩坑3:模糊删除
错误的方式1:
Set<String> keys=redisTemplate.keys(prex+"*"); for test Iterator<String> it=keys.iterator(); while(it.hasNext()){ redisTemplate.delete((String)it.next()); }
错误的方式2:
Set<String> keys=redisTemplate.keys(prex+"*"); redisTemplate.delete(keys);
在键值较多的时候,keys查询会block住。
建议
在键值较多的时候,通常指百万以上级别,可以使用scan命令进行分页删除。
相关文章推荐
- spring-data-redis 使用过程中需要注意的一点
- spring-data-redis 使用过程中需要注意的地方
- spring-data-redis 使用过程中需要注意的一点(序列化选择)
- 【Redis基础】SSH 中Spring-data-redis使用体验
- spring data redis 集群(sentinel实现)和simple spring memcached分布式初使用
- (spring-data-redis)SSM框架下使用redis作为mybatis的二级缓存
- spring-data-redis 使用
- 关于spring data redis使用javaConfig的基本配置
- 使用spring-data-redis实现incr自增
- spring-data-redis与Jedis整合使用
- 使用Spring-data-redis操作Redis的Sentinel
- 使用Spring-data-redis操作Redis的Sentinel
- 使用Spring Data Redis 实现订阅/发布
- 在Linux上(我的服务器是Ubuntu) 用redis-trib.rb搭建redis集群,并在客户端使用spring-data-redis连接(亲测)
- 使用Spring Data Redis时,遇到的几个问题
- Spring中使用RedisTemplate操作Redis(spring-data-redis)
- Spring-Data-Redis使用文档
- 使用Spring-data-redis操作Redis的Sentinel
- 6、redis之使用spring-data-redis的Template
- 使用Spring Data Redis时,遇到的几个问题