仿牛客论坛项目day6|redis

一、redis入门

1、NoSQL数据库。支持多种类型的数据结构,如字符串(String),哈希(Hashes),列表(Lists),集合(Sets),有序集合(Sorted sets)等。

2、数据存在内存里,所以读写性能很惊人。同时将内存中的数据以快照或日志的形式保存在硬盘上,以保证数据安全性。

3、典型应用场景:缓存、排行榜、计数器、社交网络、消息队列等。

二、spring整合redis

引入依赖

配置redis

访问redis

三、点赞

功能拆解:

点赞:支持对帖子、评论点赞;第一次点赞,第二次取消点赞

首页点赞数量:统计帖子的点赞数量

详情页点赞数量:统计点赞数量;显示点赞状态

具体实现:

1、数据层:在util里增加RedisKeyUtil类,里面设计点赞数据的存储方式。在redis里,点赞实体的存储格式是:

like:entity:entityType:entityId -> set(userId)

2、服务层:在service里增加LikeService类,里面定义:

点赞(like)的方法(将得到的userid插入value的set里)

查询点赞数量(findEntityLikeCount)的方法(value的set里有多少个userid)

查询某人有没有对某个帖子或详情点赞(findEntityLikeStatus)(查询某userid有没有在value的set里)

3、视图层:在controller里增加LikeController类,里面定义方法,来使用LikeService里的方法。

like:首先从hostholder里获取当前用户,然后调用LikeService里的like方法,调用LikeService里的findEntityLikeCount方法,调用LikeService里的findEntityLikeStatus方法,最后将获取的数量和状态使用map封装后传给页面

4、页面:帖子详情页面(discuss-detail)里修改点赞按钮(帖子、评论)

5、修改首页帖子点赞数量:在首页home controller里的现实帖子的方法里,增加查询帖子点赞数量(findEntityLikeCount)的代码。然后在index.html里修改对应代码。

6、修改首页帖子详情点赞数量:在帖子详情discussPostController里增加显示帖子点赞数量(findEntityLikeCount)和状态(findEntityLikeStatus)的逻辑(注意:这里没有登陆状态为0)。然后在discuss-detail.html里修改对应代码。

四、我收到的赞

功能拆解:

重构点赞功能:以用户为key,记录点赞数量;increment(key),decrement(key)

开发个人主页:以用户为key,查询点赞数量。

具体实现:

重构点赞功能:

1、数据层:在util的RedisKeyUtil类里面增加点赞实体的存储方式(以用户为key存储)。在redis里,某个用户的赞的存储格式是:

like:user:userId -> int

2、服务层:在service的LikeService类里面

重构点赞(like)方法。使得点赞后,以用户为key的value要增或减。

增加查询某个用户获得的赞的数量的方法。

3、视图层:在controller的LikeController类里还是调用LikeService里的方法。

4、页面:帖子详情页面(discuss-detail)里修改点赞按钮(帖子、评论)

开发个人主页:

1、控制层:在usercontroller里增加查看个人主页的方法

2、页面:主页index和个人主页profile

五、关注、取消关注

功能拆解:

需求:开发关注、取消关注功能;统计用户关注数、粉丝数。

关键:如果a关注了b,则a是b的粉丝(follower),b是a的目标(followee);关注的目标可以是用户、帖子、题目等,在实现时将这些目标抽象为实体。

具体实现:

1、数据层:在util的RedisKeyUtil类里设计关注数据的存储方式。在redis里有follower和followee两份数据。

follower:

// 某个实体拥有的粉丝
// follower:entityType:entityId -> zset(userId,now)

followee:

// 某个用户关注的实体
// followee:userId:entityType -> zset(entityId,now)以当前时间排序

2、服务层:在service里增加FollowService类,里面定义:

关注(follow)的方法:插入键值对

注意:在 Spring Data Redis 中,redisTemplate.execute(new SessionCallback()) 允许你在一个 Redis 会话(session)中执行多个命令,而不是为每个命令创建一个新的会话。这在多个命令需要在同一个事务中执行时是很有用的。通常,执行单个 Redis 命令不需要使用 SessionCallback。然而,当你有多个命令需要在同一个事务中执行时,使用 SessionCallback 可以提高效率和保证数据一致性。

取消关注的方法:删除键值对

查询关注的实体的数量:以user为key查询

查询实体的粉丝的数量:以实体为key查询

查询当前用户是否已关注该实体:以user为key,看看能不能查询到这个实体的某个属性

3、视图层:

在controller里增加FollowController类,里面定义如何使用FollowService里的方法。

follow:首先从hostholder里获取当前用户,然后调用FollowService里的follow方法,然后给页面返回消息

unfollow:同上

usercontrolle里,查询关注数量、粉丝数量、是否已关注

4、页面:

修改个人主页(profile)

六、关注列表、粉丝列表

功能拆解:

业务层:

查询某个用户关注的人和粉丝,并分页

表现层:

处理“查询关注的人”、“查询粉丝"请求

编写“查询关注的人”、“查询粉丝"模版

具体实现:

业务层:

FollowService类,里面定义:

查询某用户关注的人:

查询某用户的粉丝:

表现层:

FollowController类,里面定义:

查询某用户关注的人:

查询某用户的粉丝:

是否关注:

页面:profile、follower、followee

七、优化登陆模块

功能拆解:

使用redis存储验证码:验证码需要频繁的访问与刷新,对性能要求很高;验证码不需要永久保存,通常在很短时间后失效;分布式部署时,存在session共享的问题

使用redis存储登陆凭证:处理每次请求时,都需要查询用户的登录凭证,访问的频率很高

使用redis缓存用户信息:处理每次请求时,都要根据凭证查询用户信息,访问的频率非常高。

具体实现:

1、验证码:

数据层:RedisKeyUtil类里设计验证码数据的存储方式。

验证码只用redis存

// 获取验证码的时候,要将验证码和用户对应起来,但这时用户还没登陆
// 所以在用户访问登陆页面时给他发个凭证,将凭证存在cookie里,以凭证标识用户
// kaptcha:owner -> string

表现层:

logincontroller里重构getKaptcha方法:首先生成验证码的图片;然后生成cookie,在cookie里添加验证码的owner;然后将验证码的键值对(owner -> kaptchatext)插入数据库(设置过期时间为60秒

logincontroller里重构login方法:首先从cookie里取出owner并且检查是不是空;然后从redis里以owner为key取出验证码;最后检查数据库和页面输入的验证码是否一致。

2、登陆凭证

数据层:RedisKeyUtil类里设计凭证数据的存储方式。

凭证:只用redis存

// 登录的凭证
// 这里的key是loginticket的ticket值(随机string)
// 本来value应该是loginticket对象,但是存的时候会自动把对象序列化为字符串(里面不仅包括ticket值,还包括userid等信息
// ticket:ticket -> string

业务层:

存凭证:重构userService的login方法:账号密码都验证通过后,生成登陆凭证后,将键值对插入数据库,并将ticket值用map封装(在表现层,会将封装好的ticket用cookie传给服务器,服务器的请求会带着cookie,需要验证登陆凭证的时候就将ticket值从cookie里取,然后服务器会查redis,看登陆凭证是什么状态)

改凭证:重构userService的logout方法:根据ticket值获取loginticket对象;然后将它的status改为1(删除状态);最后再将键值对存回去。(在页面点击了logout,表现层就会调用logout方法,里面调用业务层的logout方法)

取凭证:重构userService的findLoginTicket方法:根据ticket值获取loginticket对象(在表现层,需要验证登陆凭证时,将ticket值从cookie里取,然后服务器会调用findLoginTicket,查redis,看登陆凭证是什么状态)

3、用户:

数据层:RedisKeyUtil类里设计用户数据的存储方式。用redis和mysql存

先定义三种方法:

// 1.优先从缓存中取值
// 2.取不到时初始化缓存数据(从mysql数据库取,然后存入redis)
// 3.数据变更时清除缓存数据

重构findUserById方法:1、优先从缓存中取值,2、取不到时初始化缓存数据

重构activation方法:如果激活成功,就3、数据变更时清除缓存数据

重构updateHeader方法:3、数据变更时清除缓存数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化系统如何让企业增收?数字化转型如何做到“业务为先”?

很多时候企业往往觉得自己一定要用更高端、更先进的系统才算是完成了数字化转型,但事实是这样的数字化转型往往伴随着大量时间、精力甚至是财力的投入,还一点收益都见不到。对于大部分企业来说,数字化转型是一个持久战,因此&#…

HTTPS

HTTPS是什么 HTTPS 属于应用层协议,其原理是通过SSL/TLS协议在HTTP和TCP之间插入一层安全机制。通过SSL/TLS握手过程,客户端和服务器协商出一个对称密钥,用于后续的数据加密和解密,从而保证数据的机密性和完整性。 为什么会需要…

4.5 C++ Boost 文件目录操作库

Boost 库是一个由C/C语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。…

DNS域名解析服务器

一、DNS简介 1、因特网的域名结构 2、域名服务器的类型划分 二、DNS域名解析的过程 三、DNS服务器配置 两个都定义,ttl的优先: 能解析,不能拼通(没有13这个主机) 别名: 测试: 主(192…

jmap(Memory Map for Java)Java内存映像工具

jmap(Memory Map for Java)Java内存映像工具 jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件) 如果不使用jmap命令,要想获取Java堆转储快照也还有一些比较“暴…

【内网监控】通过cpolar实现远程监控

【内网监控】通过cpolar实现远程监控 文章目录 【内网监控】通过cpolar实现远程监控前言1. 在cpolar官网预留一个空白隧道2. 完成空白数据隧道,生成地址3. 设置空白隧道的出口4. 空白数据隧道的出口设置5. 获取公网地址6. 打开本地电脑“远程桌面”7. 打开Windows自…

浅谈无线测温系统在煤矿高压电气设备上的应用-安科瑞黄安南

摘要:随着社会经济的不断发展,电力系统向着高电压、高容量的方向前进着,电力系统全新的技术与设备层出不穷,电力的输送能力不断提升。然而,高压电气设备承载的高压电力负荷也让其自身的温升问题成为了威胁电网稳定的元…

Redis 数据库 NoSQL

目录 一、NoSQL 二、为什么会出现NoSQL技术 三、NoSQL的类别 键值(Key-Value)存储数据库 列存储数据库 文档型数据库 图形(Graph)数据库 四、NoSQL适应场景 五、在分布式数据库中CAP原理 1、CAP 2、BASE 一、NoSQL NoS…

DEV-C++学习笔记

1.DEV-C永久完美解决中文乱码问题 工具-编译选项-编译时加入以下命令(-fexec-charsetGBK -finput-charsetUTF-8);

国标混凝土结构设计规范的混凝土本构关系——基于python代码生成

文章目录 0. 背景1. 代码2. 结果测试 0. 背景 最近在梳理混凝土塔筒的计算指南,在求解弯矩曲率关系以及MN相关曲线时,需要混凝土的本构关系作为输入条件。 1. 代码 这段代码还是比较简单的。不过需要注意的是,我把受拉和受压两种状态统一了…

每日一学——Windows命令

Windows提供了一些命令行工具来配置和管理网络。以下是一些常用的命令: ipconfig:显示当前系统的IP配置信息,包括IP地址、子网掩码、默认网关等。 ipconfig /release:释放当前系统的IP地址。 ipconfig /renew:从DHCP…

Java锁功能的底层原理与实践-chaggtp3.5版本

有趣的: 哇哦,Java锁功能的底层原理与实践,听起来就像是一个超级无敌厉害的话题!我要马上拿起我的咖啡和键盘,准备好好探索一下这个神奇的世界。 首先,让我们来说说Java锁的底层原理。你知道吗,Java锁实际上是通过一种叫做“互斥量”的机制来实现的。这个互斥量就像是…

静态代码扫描工具 Sonar 配置及使用

概览 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代…

无公网IP,公网SSH远程访问家中的树莓派教程

文章目录 前言 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar内网穿透4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地…

【探索Linux】—— 强大的命令行工具 P.3(Linux开发工具 vim)

阅读导航 前言vim简介概念特点 vim的相关指令vim命令模式(Normal mode)相关指令插入模式(Insert mode)相关指令末行模式(last line mode)相关指令 简单vim配置(附配置链接)温馨提示 前言 前面我们讲了C语言的基础知识,也了解了一些数据结构&…

docker 基础知识

目录 1. 加载docker镜像 2. 显示所有的镜像 3. 执行镜像,生成容器, 每执行一次,便生成一个容器 4. 显示出container名称 5. 进入容器 6. 如何将文件传入容器内 首先要确保已经安装了docker。注意:服务器上若没有管理员权限&am…

alpine镜像时区设置

alpine镜像是一个完整的操作系统镜像,因为其小巧、功能完备的特点,非常适合作为容器的基础镜像。 如ubuntu、centos镜像动辄几百M的体积下,只有5M的alpine简直是一股清流。 当然alpine在维持体积小的情况下,必然牺牲一些东西。比…

K8s学习笔记1

一、课程介绍: 1、背景: 1)从基础设备主机化向容器化转换。 2)从人肉式运维工作模式向自动化运维模式转换。 3)从自动化运维体系向全体系智能化运维模式转换。 2、课程目标人群: 1)掌握Linux操作系统基…

SQL助你面大厂(窗口函数)

在面试过程中窗口函数的应用可谓是数不胜数,前提你要知道什么是窗口函数,最常用的窗口函数有哪些?语法是什么?分别用的场景是什么?今天会以这三个问题开始我们今天的学习 什么是窗口函数? 所谓的窗口函数就…

iOS设计规范是什么?都有哪些具体规范

iOS设计规范是苹果为移动设备操作系统iOS制定的设计指南。iOS设计规范的制定保证了苹果应用在外观和操作上的一致性和可用性,从而提高了苹果界面设计的用户体验和应用程序的成功性。本文将从七个方面全面分析iOS设计规范。 1.iOS设计规范完整版分享 由「即时设计」…