目录
Bitmap:按位存储只能存储0和1 eg:统计用户的签到
一、redis
-
RedisTemplate和StringRedisTemplate的区别
当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候, 那么你就使用StringRedisTemplate即可。
二、使用步骤
Ⅰ.RedisTemplate
1.引入库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置RedisConfig
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置key的序列化方式
template.setKeySerializer(RedisSerializer.string());
// 设置value的序列化方式
template.setValueSerializer(RedisSerializer.json());
// 设置hash的key的序列化方式
template.setHashKeySerializer(RedisSerializer.string());
// 设置hash的value的序列化方式
template.setHashValueSerializer(RedisSerializer.json());
template.afterPropertiesSet();
return template;
}
}
Ⅱ StringRedisTemplate
- 在redis中以Json字符串的格式存储,需要解析
String cateJSON = redisTemplate.opsForValue().get("cateJSON"); if (!StringUtils.isEmpty(cateJSON)) { Map<String, List<Catelog2Vo>> result = JSON.parseObject(cateJSON, new TypeReference<Map<String, List<Catelog2Vo>>>() { }); return result; }
三、项目:
Ⅰ 点赞统计Set
-
redis key的生成工具类
根据帖子的类型和Id进行key的保存 private static final String SPLIT = ":"; private static final String PREFIX_ENTITY_LIKE = "like:entity"; // 某个实体的赞 // like:entity:entityType:entityId -> set(userId) public static String getEntityLikeKey(int entityType, int entityId) { return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId; }
-
点赞和收到的总赞逻辑(两次不同的redis操作,开启事务)
//将点赞的用户Id以set的集合进行存储,点赞或者取消 public void like(int userId, int entityType, int entityId, int entityUserId) { redisTemplate.execute(new SessionCallback() { @Override public Object execute(RedisOperations operations) throws DataAccessException { String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId); String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId); boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId); //开启事务,查询放到事务之前 operations.multi(); if (isMember) { operations.opsForSet().remove(entityLikeKey, userId); //收到的总赞,减1 operations.opsForValue().decrement(userLikeKey); } else { operations.opsForSet().add(entityLikeKey, userId); //收到的总赞,加1 operations.opsForValue().increment(userLikeKey); } return operations.exec(); } }); }