Redis(二)Redis6新数据类型与Spring Boot的整合
新数据类型
Redis6之后增加了三种新的数据类型,Bitmaps、HyperLogLog、Geographic。
Bitmaps
bitmaps(位图)严格上讲并不是新的一种数据类型,而是定义了字符串类型面向位的一组操作。通过在不同位上设置0或者1来存储不同的状态。
- 创建位图对象的命令
localhost:6379>setbit key offset value
offset为偏移量,表示要将哪一位设置成0/1。
- 获取某一位的状态命令
localhost:6379>getbit key offset
offset为偏移量。返回值为0或者1。对没有设置的位都会返回0。
- 统计为1的个数
localhost:6379>bitcount key
或者是
localhost:6379>bitcount key 0, 1
这样可以获取字节
0和1中位为1的个数。
- 两个key之间进行逻辑运算
localhost:6379>bitop operate destkey key1 key2
operate可选类型为:and,or,xor等逻辑运算。
- 找到第一指定为0或者1的位
localhost:6379>bitpos key 0/1 [start] [end]
应用场景
- 可以用在统计网站的日活跃用户。
- 各种实时分析,例如和对象ID相关的,可以将对象的ID的大小表示为第几位,进而统计相关的信息。
HyperLogLog
是一种概率数据结构,用来统计一个集合中的基数。当数据的量特别大的时候,使用HyperLogLog就可以节省大量的内存,HyperLogLog使用的是固定的大小存储基数,为12KB,可以统计2^64个数据。Redis中统计出来的结果可能与实际的有1%的偏差。
- 创建:
localhost:6379>pfadd key value
基数增加成功会返回1,否则返回0.
- 统计基数数量:
localhost:6379>pfcount key
集合{1,2,3, 4, 1, 1, 1, 1} 统计出来的基数就是4。
- 合并两个HyperLogLog类型
localhost:6379>pfmerge key key1 key2
应用场景
- 统计网站的页面访问量。
- 统计独立访客的数量。
Geographic
地图的坐标类型,可以设置经纬度,查询,范围查询的等操作。
- 创建
geoadd key 经度 纬度 地点
- 获取:
geopos key 地点
- 获取两个地点的直线距离
geodist key 地点1 地点2 显示单位
显示单位的可取值为:
km,m,mi(英里),ft(英尺)
。
- 获取一定范围内的数据:
georadius key 经度 纬度 半径长度 显示单位
与Spring Boot的整合
- 引入依赖
<!-- 整合redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring2.x版本集成redis所需common-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
- application.yml中配置属性
spring:
# redis配置
redis:
host: localhost
port: 6379
database: 0 # 数据库索引,默认为0
timeout: 1800000 # 连接超时时间
lettuce:
pool:
max-active: 20 # 连接池中的最大连接数,负值表示没有限制
max-wait: 1 # 连接池中的最大等待数
max-idle: 5 # 连接池中的最大空闲数
min-idle: 0 # 连接池中的最小空闲数
- 书写Redis配置类
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置key的序列化方式
redisTemplate.setKeySerializer(redisSerializer);
// 设置值的序列化方式
redisTemplate.setValueSerializer(redisSerializer);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// 解决查询缓存转换异常的问题
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 配置序列化,解决乱码问题,过期时间设置为10分钟
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.disableCachingNullValues();
RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(configuration)
.build();
return redisCacheManager;
}
}
配置类的内容都差不多。
- 注入RedisTemplate对象
@Autowried
private RedisTemplate redisTemplate;