文安网站建设宝应网站开发
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:17
当前位置: 首页 > news >正文
文安网站建设,宝应网站开发,中国国内网站建设哪家强,太原网站制作哪里便宜Redis#xff08;1#xff09;简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务#xff0c;即原子性#xff0c;通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中#xff0c;性能高。#xff08;2#…Redis1简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务即原子性通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中性能高。2数据类型Redis支持五种数据类型string字符串hash哈希list列表set集合及zset(sorted set有序集合)。string 是 redis 最基本的类型你可以理解成与 Memcached 一模一样的类型一个 key 对应一个 value。Redis hash 是一个键值(keyvalue)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表hash 特别适合用于存储对象。Redis 列表是简单的字符串列表按照插入顺序排序。你可以添加一个元素到列表的头部左边或者尾部右边。Redis 的 Set 是 string 类型的无序集合集合是通过hash实现的Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。3基本操作Test public void testStrings() {String redisKey test:count;redisTemplate.opsForValue().set(redisKey, 1);System.out.println(redisTemplate.opsForValue().get(redisKey));System.out.println(redisTemplate.opsForValue().increment(redisKey));System.out.println(redisTemplate.opsForValue().decrement(redisKey)); }Test public void testHashes() {String redisKey test:user;redisTemplate.opsForHash().put(redisKey, id, 1);redisTemplate.opsForHash().put(redisKey, username, zhangsan);System.out.println(redisTemplate.opsForHash().get(redisKey, id));System.out.println(redisTemplate.opsForHash().get(redisKey, username)); }Test public void testLists() {String redisKey test:ids;redisTemplate.opsForList().leftPush(redisKey, 101);redisTemplate.opsForList().leftPush(redisKey, 102);redisTemplate.opsForList().leftPush(redisKey, 103);System.out.println(redisTemplate.opsForList().size(redisKey));System.out.println(redisTemplate.opsForList().index(redisKey, 0));System.out.println(redisTemplate.opsForList().range(redisKey, 0, 2));System.out.println(redisTemplate.opsForList().leftPop(redisKey));System.out.println(redisTemplate.opsForList().leftPop(redisKey));System.out.println(redisTemplate.opsForList().leftPop(redisKey)); }Test public void testSets() {String redisKey test:teachers;redisTemplate.opsForSet().add(redisKey, 刘备, 关羽, 张飞, 赵云, 诸葛亮);System.out.println(redisTemplate.opsForSet().size(redisKey));System.out.println(redisTemplate.opsForSet().pop(redisKey));System.out.println(redisTemplate.opsForSet().members(redisKey)); }Test public void testSortedSets() {String redisKey test:students;redisTemplate.opsForZSet().add(redisKey, 唐僧, 80);redisTemplate.opsForZSet().add(redisKey, 悟空, 90);redisTemplate.opsForZSet().add(redisKey, 八戒, 50);redisTemplate.opsForZSet().add(redisKey, 沙僧, 70);redisTemplate.opsForZSet().add(redisKey, 白龙马, 60);System.out.println(redisTemplate.opsForZSet().zCard(redisKey));System.out.println(redisTemplate.opsForZSet().score(redisKey, 八戒));System.out.println(redisTemplate.opsForZSet().reverseRank(redisKey, 八戒));System.out.println(redisTemplate.opsForZSet().reverseRange(redisKey, 0, 2)); }多次访问同一个key Test public void testBoundOperations() {String redisKey test:count;BoundValueOperations operations redisTemplate.boundValueOps(redisKey);operations.increment();operations.increment();operations.increment();operations.increment();operations.increment();System.out.println(operations.get()); } 4spring 配置 redis引入依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId /dependency在 application.properties 中声明访问哪个库host地址端口号# RedisProperties spring.redis.database11 spring.redis.hostlocalhost spring.redis.port6379在 config 下实现 RedisConfig 类注入连接工厂才能访问数据库 RedisConnectionFactory factory实例化 bean new RedisTemplate();设置工厂后有访问数据库能力 template.setConnectionFactory(factory);指定序列化方式数据转化方式//定义自定义的redis对象Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory){RedisTemplateString,Object redisTemplate new RedisTemplate();redisTemplate.setConnectionFactory(factory);//主要配置 序列化的方式//设置key 的 序列化方式redisTemplate.setKeySerializer(RedisSerializer.string());//设置value的序列化方式redisTemplate.setValueSerializer(RedisSerializer.json());//设置hash 的 key序列化redisTemplate.setHashKeySerializer(RedisSerializer.string());//设置 hash 的 value 序列化redisTemplate.setHashValueSerializer(RedisSerializer.json());//出发 使其生效redisTemplate.afterPropertiesSet();return redisTemplate;}5Redis 事务 管理事务内命令不会立即执行提交后统一执行使用编程式事务进行管理声明式事务用的少调用 redisTemplate 方法内部做匿名实现SessionCallback() 里方法execute重写内部实现事务逻辑启用事务 operations.multi();提交事务 operations.exec();// 编程式事务 Test public void testTransactional() {Object obj redisTemplate.execute(new SessionCallback() {Overridepublic Object execute(RedisOperations operations) throws DataAccessException {String redisKey test:tx;operations.multi();operations.opsForSet().add(redisKey, zhangsan);operations.opsForSet().add(redisKey, lisi);operations.opsForSet().add(redisKey, wangwu);System.out.println(operations.opsForSet().members(redisKey));return operations.exec();}});System.out.println(obj); }2.点赞1业务层生成redis key的工具 在 util 下实现 RedisKeyUtil集合set存储谁给某个实体点的赞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;// 某个实体的赞// like:entity:entityType:entityId - set(userId)public static String getEntityLikeKey(int entityType, int entityId) { //实体类型 实体IDreturn PREFIX_ENTITY_LIKE SPLIT entityType SPLIT entityId;}}Service 下实现 LikeServiceService public class LikeService {Autowiredprivate RedisTemplate redisTemplate;// 点赞public void like(int userId, int entityType, int entityId) {//获取keyString entityLikeKey RedisKeyUtil.getEntityLikeKey(entityType,entityId);//判断当前用户是否点过赞 即userid 是否在set中if(redisTemplate.opsForSet().isMember(entityLikeKey,userId)){redisTemplate.opsForSet().remove(entityLikeKey,userId);}else {redisTemplate.opsForSet().add(entityLikeKey,userId);}}// 查询某实体点赞的数量public long findEntityLikeCount(int entityType, int entityId){String entityLikeKey RedisKeyUtil.getEntityLikeKey(entityType,entityId);return redisTemplate.opsForSet().size(entityLikeKey);}// 查询某人对某实体的点赞状态public int findEntityLikeStatus(int userId, int entityType, int entityId) {String entityLikeKey RedisKeyUtil.getEntityLikeKey(entityType,entityId);return redisTemplate.opsForSet().isMember(entityLikeKey,userId)? 1:0 ;} }2表现层Controller 下实现 LikeController获取当前用户调用service点赞方法获取数量和状态放入map返回json格式数据Controller public class LikeController {Autowiredprivate LikeService likeService;Autowiredprivate HostHolder hostHolder;RequestMapping(path /like, method RequestMethod.POST)ResponseBodypublic String like(int entityType, int entityId){User user hostHolder.getUser();//点赞likeService.like(user.getId(), entityType,entityId);//更新点赞数量long likeCount likeService.findEntityLikeCount(entityType,entityId);//查询状态int likeStatus likeService.findEntityLikeStatus(user.getId(),entityType,entityId);MapString,Object map new HashMap();map.put(likeCount, likeCount);map.put(likeStatus, likeStatus);return CommunityUtil.getJSONString(0, null, map);} }帖子详情页面赞的数量的显示修改 DiscussPostController 下的 getDiscussPost//根据 帖子id 查询帖子内容 评论 评论的回复RequestMapping(path /detail/{discussPostId},method RequestMethod.GET)public String getDiscussPost(PathVariable(discussPostId) int discussPostId, Model model, Page page){//根据帖子id查询帖子DiscussPost post discussPostService.findDiscussPostById(discussPostId);model.addAttribute(post,post);//根据userid查询userUser user userService.findUserById(post.getUserId());model.addAttribute(user,user);// 点赞数量long likeCount likeService.findEntityLikeCount(ENTITY_TYPE_POST, discussPostId);model.addAttribute(likeCount, likeCount);// 点赞状态int likeStatus hostHolder.getUser() null ? 0 :likeService.findEntityLikeStatus(hostHolder.getUser().getId(), ENTITY_TYPE_POST, discussPostId);model.addAttribute(likeStatus, likeStatus);//查评论的分页信息page.setLimit(5);page.setPath(/discuss/detail/ discussPostId);page.setRows(post.getCommentCount());//评论给帖子的评论//回复给评论的评论//获取所有评论ListComment commentList commentService.findCommentsByEntity(ENTITY_TYPE_POST,post.getId(), page.getOffset(),page.getLimit());//用于封装 每条评论及每条评论的回复。。。ListMapString,Object commentVoList new ArrayList();//每一条评论 找到评论的作者。找到该评论的回复回复的作者回复的用户for (Comment comment:commentList) {MapString,Object commentVo new HashMap();//存入评论内容commentVo.put(comment,comment);//放入 作者commentVo.put(user,userService.findUserById(comment.getUserId()));// 点赞数量likeCount likeService.findEntityLikeCount(ENTITY_TYPE_COMMENT, comment.getId());commentVo.put(likeCount, likeCount);// 点赞状态likeStatus hostHolder.getUser() null ? 0 :likeService.findEntityLikeStatus(hostHolder.getUser().getId(), ENTITY_TYPE_COMMENT, comment.getId());commentVo.put(likeStatus, likeStatus);//获取该评论的所有回复ListComment replyList commentService.findCommentsByEntity(ENTITY_TYPE_COMMENT, comment.getId(), 0, Integer.MAX_VALUE);//用于封装 每一条回复的 作者 回复咪表ListMapString, Object replyVoList new ArrayList();if(replyVoList ! null){for (Comment reply: replyList) {MapString,Object replyVo new HashMap();//回复replyVo.put(reply, reply);// 放入 回复的作者replyVo.put(user, userService.findUserById(reply.getUserId()));//回复目标User target reply.getTargetId() 0 ? null : userService.findUserById(reply.getTargetId());replyVo.put(target, target);// 点赞数量likeCount likeService.findEntityLikeCount(ENTITY_TYPE_COMMENT, reply.getId());replyVo.put(likeCount, likeCount);// 点赞状态likeStatus hostHolder.getUser() null ? 0 :likeService.findEntityLikeStatus(hostHolder.getUser().getId(), ENTITY_TYPE_COMMENT, reply.getId());replyVo.put(likeStatus, likeStatus);//将 单条回复放入 此 评论 总的 回复表replyVoList.add(replyVo);}}//将回复总表 嵌入 单条评论commentVo.put(replys, replyVoList);//回复数量int replyCount commentService.findCommentCount(ENTITY_TYPE_COMMENT, comment.getId());commentVo.put(replyCount, replyCount);commentVoList.add(commentVo);}model.addAttribute(comments, commentVoList);return /site/discuss-detail;}3.使用Redis存储验证码LoginController.getKaptcha // 老方法 验证码 存入session//session.setAttribute(kaptcha, text);// 验证码的归属 一个验证码 绑定 一个 kaptchaOwnerString kaptchaOwner CommunityUtil.generateUUID();Cookie cookie new Cookie(kaptchaOwner, kaptchaOwner);cookie.setMaxAge(60);cookie.setPath(contextPath);response.addCookie(cookie);//存入redisString redisKey RedisKeyUtil.getKaptchaKey(kaptchaOwner);redisTemplate.opsForValue().set(redisKey, text, 60, TimeUnit.SECONDS);LoginController.login// 检查验证码 String kaptcha (String) session.getAttribute(kaptcha);//获取验证码String kaptcha null;if(StringUtils.isNotBlank(kaptchaOwner)){//是否存在String redisKey RedisKeyUtil.getKaptchaKey(kaptchaOwner);kaptcha (String) redisTemplate.opsForValue().get(redisKey);}//比对验证码if(StringUtils.isBlank(kaptcha) || StringUtils.isBlank(code) || !kaptcha.equals(code)){model.addAttribute(codeMsg, 验证码不正确!);return /site/login;}4. 使用Redis存储登录凭证UserServicelogin 生成登录凭证// 生成登录凭证LoginTicket loginTicket new LoginTicket();loginTicket.setUserId(user.getId());loginTicket.setTicket(CommunityUtil.generateUUID());loginTicket.setStatus(0);loginTicket.setExpired(new Date(System.currentTimeMillis() expiredSeconds * 1000));//loginTicketMapper.insertLoginTicket(loginTicket);String redisKey RedisKeyUtil.getTicketKey(loginTicket.getTicket());redisTemplate.opsForValue().set(redisKey, loginTicket);logout 退出登录ticket取出来再存进去public void logout(String ticket) {//loginTicketMapper.updateStatus(ticket, 1);String redisKey RedisKeyUtil.getTicketKey(ticket);LoginTicket loginTicket (LoginTicket) redisTemplate.opsForValue().get(redisKey);loginTicket.setStatus(1);redisTemplate.opsForValue().set(redisKey,loginTicket);}LoginTicket 查询凭证public LoginTicket findLoginTicket(String ticket) {// return loginTicketMapper.selectByTicket(ticket);String redisKey RedisKeyUtil.getTicketKey(ticket);LoginTicket loginTicket (LoginTicket) redisTemplate.opsForValue().get(redisKey);return loginTicket;}5.使用Redis缓存用户数据查用户时 先查缓存 在查mysqlUserService// 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); }public User findUserById(int id) { // return userMapper.selectById(id);User user getCache(id);if (user null) {user initCache(id);}return user; }public int activation(int userId, String code) {User user userMapper.selectById(userId);if (user.getStatus() 1) {return ACTIVATION_REPEAT;} else if (user.getActivationCode().equals(code)) {userMapper.updateStatus(userId, 1);clearCache(userId);return ACTIVATION_SUCCESS;} else {return ACTIVATION_FAILURE;} }public int updateHeader(int userId, String headerUrl) { // return userMapper.updateHeader(userId, headerUrl);int rows userMapper.updateHeader(userId, headerUrl);clearCache(userId);return rows; }
- 上一篇: 温州做网站哪里好建网站容易吗
- 下一篇: 文本中设置网站超链接怎么做领英如何创建公司主页
相关文章
-
温州做网站哪里好建网站容易吗
温州做网站哪里好建网站容易吗
- 技术栈
- 2026年04月20日
-
温州做网站哪里好购物网站的首页是静态
温州做网站哪里好购物网站的首页是静态
- 技术栈
- 2026年04月20日
-
温州做网站哪家好桂林论坛天涯社区
温州做网站哪家好桂林论坛天涯社区
- 技术栈
- 2026年04月20日
-
文本中设置网站超链接怎么做领英如何创建公司主页
文本中设置网站超链接怎么做领英如何创建公司主页
- 技术栈
- 2026年04月20日
-
文昌网站建设 myvodowordpress高级搜索
文昌网站建设 myvodowordpress高级搜索
- 技术栈
- 2026年04月20日
-
文档共享网站建设鸿顺里网站建设
文档共享网站建设鸿顺里网站建设
- 技术栈
- 2026年04月20日
