用户: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应用相关推荐

  1. android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...

  2. java读取war3模型_GitHub - wucao/jw3gparser: Java Warcraft Ⅲ Replay Parser(Java解析《魔兽争霸3》游戏录像工具)...

    jw3gparser Java解析<魔兽争霸3>游戏录像工具,可解析w3g.nwg(网易对战平台录像)格式录像. 使用方法 public class Test { public stati ...

  3. java实现微信抢红包_GitHub - collection8899/RedPackage: java 实现仿照微信抢红包算法

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

  4. Java在Quant应用_GitHub - tigerfintech/tiger_quant: Java 实盘量化框架

    Tiger Quant 启动命令 TigerQuantBootstrap 是项目的Main方法入口,负责项目的启动. 停止命令 查出项目运行的进程 pid. ps -ef|grep TigerQuan ...

  5. java售票界面设计_GitHub - CoderGeshu/StationTicketingSystem: Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统...

    StationTicketingSystem 这是一个 Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统. 技术栈 所使用到的技术:Java Swing + Java A ...

  6. java 对数取反_GitHub - giraffegzy/ex_java: java练习题(来源各个地方and难度随机)

    java基础练习题 1.检查是否为素数(素数:该数除了1和它本身以外不再有其他的因数的数被称为素数.) 2.打印出1-100的数,每十个数为一组. 3.接收一个层数值n,打印一个有n层的直角三角形,并 ...

  7. 知乎页面的html代码,仿知乎当复制网页内容时在尾部加入版权信息代码

    在国内转载别人的原创文章属于非常普遍的现象,但是一般都不会注明出处,曾记得知乎的效果是最棒的,在网上找了很久,终于找到了可以通过技术手段,添加代码来实现复制自动加版权信息的方法,虽然不能有效的解决问题 ...

  8. 怎样下载java知乎_怎样下载JAVA?

    Java 开发环境配置 在本回答中我们将为大家介绍如何搭建Java开发环境.Windows 上安装开发环境 Linux 上安装开发环境 安装 Eclipse 运行 Java window系统安装jav ...

  9. java面试题36 已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( )

    java面试题36 已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( ) A args[0] = "MyTest a b c" B args[0] ...

最新文章

  1. 从“零”开始的存储历程到“零”外置的云存储
  2. 头条创始人:我面试了两千个年轻人,发现混的好的都有这5种特质
  3. android中进程的优先级
  4. Java序列化技术与Protobuff
  5. 算法设计与分析 贪心算法
  6. P2408 不同子串个数 SAM
  7. faster-rcnn tensorflow windows demo运行
  8. 自制简单的Tabs(Vue)
  9. .NET应用程序调试—原理、工具、方法
  10. 让你轻松入门的编程学习窍门,JAVA、Python快速学习资料+练手项目
  11. 如何使用Apple Watch启动和跟踪锻炼
  12. THUSC2018滚粗记
  13. 基于AD9854个和MSP430的波形发生器
  14. 【下载源码】在线生成网页缩略图.超越Snap.com:WebSnap Beta 1.1 发布。感谢博客园的“萧寒”重写的底层。开源。
  15. ajax谷歌浏览器提示等待超时,调用谷歌浏览器爬虫,selenium webdriver等设置等待时间和超时时间...
  16. 城市空中交通和无人系统的空中交通管制评估
  17. 玩转华为数据中心交换机系列 | 配置VLAN间通过VLANIF接口通信示例
  18. GPS卫星运动及定位matlab仿真
  19. linux下matlab2014卸载
  20. 2020年全球及中国动物模型(模式动物)行业发展现状及竞争格局分析,行业增速较快,发展前景良好「图」

热门文章

  1. 最小公倍数和最大公约数的求法——最快的:辗转相除法
  2. JavaScript es6 五种常见继承方式
  3. Java GifDecode类分解gif图片
  4. COMSOL中“模式分析”、“边界模式分析”的区别
  5. 免费的SVG在线编辑器大推荐
  6. RTF是什么文件格式
  7. 私服服务器需要多大的配置
  8. 全国计算机应用专业人才的需求,计算机应用专业人才需求调查报告
  9. 【小学信息技术教资面试】《认识鼠标》教案
  10. VTN系列多通道振弦模拟信号采集仪