论坛项目进展04
第4章 Redis,一站式高性能存储方案
4.1 redis入门
像排行榜,点赞,等功能访问的太频繁,就把它放到内存中的redis去存。
4.2spring整合redis
其实springboot也对redis做了一些配置,配好了redisTemplate,我们知道redis是key-value存储的,但是它配的redis中的key是是object类型,这样做的好处是更通用,但是我们在项目中一般都是用string类型,它配成object我们用起来不方便,所以我们还是重新配一下。这是springboot配的redistemplate,key是object类型:
在config包下写一个RedisConfig:
4.3点赞
可能会有很多人同时要给某个帖子点赞,所以要考虑性能问题,所以像点赞这样的数据最好把它存到redis里,写代码时,因为把数据存到redis中,而操作redis就像操作一个map一样,非常简单,所以就不用写dao层了,直接写业务层。在redis中是面向key去操作的,为了能让key反复的复用,容易记,就写一个工具类用来生成key。
在util包下建RedisKeyUtil:
public class RedisKeyUtil {
private static final String SPLIT = ":";
private static final String PREFIX_ENTITY_LIKE = "like:entity";
private static final String PREFIX_USER_LIKE = "like:user";
private static final String PREFIX_FOLLOWEE = "followee";
private static final String PREFIX_FOLLOWER = "follower";
private static final String PREFIX_KAPTCHA = "kaptcha";
private static final String PREFIX_TICKET = "ticket";
private static final String PREFIX_USER = "user";
private static final String PREFIX_UV = "uv";
private static final String PREFIX_DAU = "dau";
private static final String PREFIX_POST = "post";
// 某个实体的赞的key
// like:entity:entityType:entityId -> set(userId)
public static String getEntityLikeKey(int entityType, int entityId) {
return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
}
// 某个用户的赞
// like:user:userId -> int
public static String getUserLikeKey(int userId) {
return PREFIX_USER_LIKE + SPLIT + userId;
}
// 某个用户关注的实体
// followee:userId:entityType -> zset(entityId,now)
public static String getFolloweeKey(int userId, int entityType) {
return PREFIX_FOLLOWEE + SPLIT + userId + SPLIT + entityType;
}
// 某个实体拥有的粉丝
// follower:entityType:entityId -> zset(userId,now)
public static String getFollowerKey(int entityType, int entityId) {
return PREFIX_FOLLOWER + SPLIT + entityType + SPLIT + entityId;
}
// 登录验证码
public static String getKaptchaKey(String owner) {
return PREFIX_KAPTCHA + SPLIT + owner;
}
// 登录的凭证
public static String getTicketKey(String ticket) {
return PREFIX_TICKET + SPLIT + ticket;
}
// 用户
public static String getUserKey(int userId) {
return PREFIX_USER + SPLIT + userId;
}
// 单日UV
public static String getUVKey(String