第四章
redis整合Spring
-
编写配置类,构造RedisTemplate
@Configuration public class RedisConfig { @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){ RedisTemplate<String,Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); //设置序列化方式 template.setKeySerializer(RedisSerializer.string()); template.setValueSerializer(RedisSerializer.json()); template.setHashKeySerializer(RedisSerializer.string()); template.setHashValueSerializer(RedisSerializer.json()); template.afterPropertiesSet(); return template; } }
-
访问Redis
-
redisTemplate.opsForValue()
-
redisTemplate.opsForHash()
-
redisTemplate.opsForList()
-
redisTemplate.opsForSet()
-
redisTemplate.opsForZSet()
-
点赞
统计点在数量,存入redis中来提升系统性能
某个实体的赞:like:entity:entityType:entityId ---> set(userId)
我收到的赞
以用户为key,记录点赞数量
like:user:userId -> int
关注和取消关注
某个用户关注的实体 followee:userId:entityType -> zset(entityId,now)
某个实体拥有的粉丝 follower:entityType:entityId -> zset(userId,now)
优化登录模块
-
使用redis存储验证码
-
验证码需要频繁访问与刷新,对性能要求高
-
验证码不需要永久保存,短时间后就失效
-
分布式部署时,存在session共享问题
-
将验证码存入redis
//验证码的归属 String kaptchaOwner = CommunityUtil.generateUUID(); Cookie cookie = new Cookie("kaptchaOwner",kaptchaOwner); cookie.setMaxAge(60); cookie.setPath(contextPath); response.addCookie(cookie); String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner); redisTemplate.opsForValue().set(redisKey, text, 60, TimeUnit.SECONDS);
从redis中取出
String kaptcha = null; if (StringUtils.isBlank(kaptchaOwner)){ String redisKey = RedisKeyUtil.getKaptchaKey(kaptchaOwner); kaptcha = (String) redisTemplate.opsForValue().get(redisKey); }
存储登录凭证
-
处理每次请求时,都要查询用户的登录凭证,访问频率高
String rediskey = RedisKeyUtil.getTicketKey(loginTicket.getTicket()); redisTemplate.opsForValue().set(rediskey, loginTicket);
缓存用户信息
-
处理每次请求时,根据凭证查询用户信息,访问也高
//1.优先从缓冲中取值 private User getCache(int userId){ String redisKey = RedisKeyUtil.getUserKey(userId); return (User) redisTemplate.opsForValue().get(redisKey); } //2.取不到时初始化缓冲数据 private User initCache(int userId){ User user = userMapper.selectById(userId); String redisKey = RedisKeyUtil.getUserKey(userId); redisTemplate.opsForValue().set(redisKey, user,3600, TimeUnit.SECONDS); return user; } //3.数据变更时清除缓冲数据 private void clearCache(int userId){ String redisKey = RedisKeyUtil.getUserKey(userId); redisTemplate.delete(redisKey); }