java 应用 知乎_GitHub - liangsonghua/zhihu: JAVA仿知乎与redis应用
用户:admin/admin liangsonghua/liangsonghua
注册登陆:
拦截器:
@Component
public class PassportInterceptor implements HandlerInterceptor {
@Autowired
private LoginTicketDAO loginTicketDAO;
@Autowired
private UserDAO userDAO;
@Autowired
private HostHolder hostHolder;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String ticket = null;
if (httpServletRequest.getCookies() != null) {
for (Cookie cookie : httpServletRequest.getCookies()) {
if (cookie.getName().equals("ticket")) {
ticket = cookie.getValue();
break;
}
}
}
if (ticket != null) {
LoginTicket loginTicket = loginTicketDAO.selectByTicket(ticket);
if (loginTicket == null || loginTicket.getExpired().before(new Date()) || loginTicket.getStatus() != 0) {
return true;
}
User user = userDAO.selectById(loginTicket.getUserId());
hostHolder.setUser(user);
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
if (modelAndView != null && hostHolder.getUser() != null) {
modelAndView.addObject("user", hostHolder.getUser());
}
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
hostHolder.clear();
}
}
其中/Model/HostHolder负责管理user信息
访问跳转
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
if (hostHolder.getUser() == null) {
httpServletResponse.sendRedirect("/reglogin?next=" + httpServletRequest.getRequestURI());
}
return true;
}
评论中心部内信
评论表:
统一的评论服务,覆盖所有的实体评论
DROP TABLE IF EXISTS `comment`;
CREATE TABLE `comment` (
`id` INT NOT NULL AUTO_INCREMENT,
`content` TEXT NOT NULL,
`user_id` INT NOT NULL,
`entity_id` INT NOT NULL,
`entity_type` INT NOT NULL,
`created_date` DATETIME NOT NULL,
`status` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
INDEX `entity_index` (`entity_id` ASC, `entity_type` ASC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
entity_id可以是questionId/commentId
entity_type可以是question/comment
redis
List(双向列表,适用于最新列表关注列表):lpush/lpop/blpop/lindex/lrange/lrem/linsert/lset/rpush
set(适用于无顺序的集合,点赞点踩抽奖已读共同好友) sdiff/smembers/sinter/scard
SortedSet(排行榜优先队列) zadd/zscore/zrange/zcount/zrank/zrevrank
Hash(对象属性不定长属性数)hset/hget/hgetAll/hexists/hkeys/hvals
KV(单一数据验证码PV缓存)set/setex/incr
关注服务
特点:多对多服务 ID与ID的关联,有序
存储结构:redis:zset/list
Service:通用关注接口
Controller:首页问题关注数,详情问题关注列表,粉丝关注人列表,关注异步事件
队列实现异步
/async/EventProducer.java
public boolean fireEvent(EventModel eventModel) {
try {
String json = JSONObject.toJSONString(eventModel);
String key = RedisKeyUtil.getEventQueueKey();
jedisAdapter.lpush(key, json);
return true;
} catch (Exception e) {
return false;
}
}
/async/EventConsumer.java
Map beans = applicationContext.getBeansOfType(EventHandler.class);
if(beans!=null) {
for(Map.Entry entry:beans.entrySet()) {
List eventTypes = entry.getValue().getSupportEventType();
for(EventType type:eventTypes) {
if(!config.containsKey(type)) {
config.put(type,new ArrayList());
}
config.get(type).add(entry.getValue());
}
}
}
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
String key = RedisKeyUtil.getEventQueueKey();
List events = jedisAdapter.brpop(0, key);
for(String message:events) {
if(message.equals(key)) {
continue;
}
EventModel eventModel = JSON.parseObject(message, EventModel.class);
if(!config.containsKey(eventModel.getType())) {
logger.error("内部错误");
continue;
}
for(EventHandler handler:config.get(eventModel.getType())) {
handler.doHandle(eventModel);
}
}
}
}
});thread.start();
}
在具体的事件中只要 implements EventHandler实现doHandle方法发送站内信即可
java 应用 知乎_GitHub - liangsonghua/zhihu: JAVA仿知乎与redis应用相关推荐
- android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...
先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...
- java读取war3模型_GitHub - wucao/jw3gparser: Java Warcraft Ⅲ Replay Parser(Java解析《魔兽争霸3》游戏录像工具)...
jw3gparser Java解析<魔兽争霸3>游戏录像工具,可解析w3g.nwg(网易对战平台录像)格式录像. 使用方法 public class Test { public stati ...
- java实现微信抢红包_GitHub - collection8899/RedPackage: java 实现仿照微信抢红包算法
实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...
- Java在Quant应用_GitHub - tigerfintech/tiger_quant: Java 实盘量化框架
Tiger Quant 启动命令 TigerQuantBootstrap 是项目的Main方法入口,负责项目的启动. 停止命令 查出项目运行的进程 pid. ps -ef|grep TigerQuan ...
- java售票界面设计_GitHub - CoderGeshu/StationTicketingSystem: Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统...
StationTicketingSystem 这是一个 Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统. 技术栈 所使用到的技术:Java Swing + Java A ...
- java 对数取反_GitHub - giraffegzy/ex_java: java练习题(来源各个地方and难度随机)
java基础练习题 1.检查是否为素数(素数:该数除了1和它本身以外不再有其他的因数的数被称为素数.) 2.打印出1-100的数,每十个数为一组. 3.接收一个层数值n,打印一个有n层的直角三角形,并 ...
- 知乎页面的html代码,仿知乎当复制网页内容时在尾部加入版权信息代码
在国内转载别人的原创文章属于非常普遍的现象,但是一般都不会注明出处,曾记得知乎的效果是最棒的,在网上找了很久,终于找到了可以通过技术手段,添加代码来实现复制自动加版权信息的方法,虽然不能有效的解决问题 ...
- 怎样下载java知乎_怎样下载JAVA?
Java 开发环境配置 在本回答中我们将为大家介绍如何搭建Java开发环境.Windows 上安装开发环境 Linux 上安装开发环境 安装 Eclipse 运行 Java window系统安装jav ...
- java面试题36 已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( )
java面试题36 已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( ) A args[0] = "MyTest a b c" B args[0] ...
最新文章
- 从“零”开始的存储历程到“零”外置的云存储
- 头条创始人:我面试了两千个年轻人,发现混的好的都有这5种特质
- android中进程的优先级
- Java序列化技术与Protobuff
- 算法设计与分析 贪心算法
- P2408 不同子串个数 SAM
- faster-rcnn tensorflow windows demo运行
- 自制简单的Tabs(Vue)
- .NET应用程序调试—原理、工具、方法
- 让你轻松入门的编程学习窍门,JAVA、Python快速学习资料+练手项目
- 如何使用Apple Watch启动和跟踪锻炼
- THUSC2018滚粗记
- 基于AD9854个和MSP430的波形发生器
- 【下载源码】在线生成网页缩略图.超越Snap.com:WebSnap Beta 1.1 发布。感谢博客园的“萧寒”重写的底层。开源。
- ajax谷歌浏览器提示等待超时,调用谷歌浏览器爬虫,selenium webdriver等设置等待时间和超时时间...
- 城市空中交通和无人系统的空中交通管制评估
- 玩转华为数据中心交换机系列 | 配置VLAN间通过VLANIF接口通信示例
- GPS卫星运动及定位matlab仿真
- linux下matlab2014卸载
- 2020年全球及中国动物模型(模式动物)行业发展现状及竞争格局分析,行业增速较快,发展前景良好「图」