1 对redis进行配置并封装一个redis工具类

@Configuration //编写redis的配置类
public class RedisConfig {@Bean //参数声明了连接工厂public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 设置key的序列化方式template.setKeySerializer(RedisSerializer.string());// 设置value的序列化方式template.setValueSerializer(RedisSerializer.json());// 设置hash的key的序列化方式template.setHashKeySerializer(RedisSerializer.string());// 设置hash的value的序列化方式template.setHashValueSerializer(RedisSerializer.json());//让设置生效template.afterPropertiesSet();return template;}}public class RedisKeyUtil {private static final String SPLIT = ":";private static final String PREFIX_ENTITY_LIKE = "like:entity";// 某个实体的赞// like:entity:entityType:entityId -> set(userId)public static String getEntityLikeKey(int entityType, int entityId) {return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;}}

2 reids操作起来比较简单,所以一般不需要写dao层,直接在service里面对数据进行操作

@Service
public class LikeService {@Autowiredprivate RedisTemplate redisTemplate;// 点赞  谁点的赞 点赞的实体 实体的id 实体的用户public void like(int userId, int entityType, int entityId, ) {redisTemplate.execute(new SessionCallback() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId);//是否已经点过赞if (isMember) { //移除useridoperations.opsForSet().remove(entityLikeKey, userId);operations.opsForValue().decrement(userLikeKey);} else { //添加useridoperations.opsForSet().add(entityLikeKey, userId);operations.opsForValue().increment(userLikeKey);}}});}// 查询某实体点赞的数量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);//1表示点赞 0表示没有return redisTemplate.opsForSet().isMember(entityLikeKey, userId) ? 1 : 0;}

3controller层接受post请求带来的参数,将查询到的数据放进map里,传给前端回调函数,处理前端页面

@Controller
public class LikeController {@Autowiredprivate LikeService likeService;@Autowiredprivate HostHolder hostHolder;@RequestMapping(path = "/like", method = RequestMethod.POST)@ResponseBodypublic String like(int entityType, int entityId, int entityUserId) {User user = hostHolder.getUser();// 点赞likeService.like(user.getId(), entityType, entityId, entityUserId);// 数量long likeCount = likeService.findEntityLikeCount(entityType, entityId);// 状态int likeStatus = likeService.findEntityLikeStatus(user.getId(), entityType, entityId);// 返回的结果Map<String, Object> map = new HashMap<>();map.put("likeCount", likeCount);map.put("likeStatus", likeStatus);return CommunityUtil.getJSONString(0, null, map);}}//回调函数
function like(btn, entityType, entityId, entityUserId) {$.post(CONTEXT_PATH + "/like",{"entityType":entityType,"entityId":entityId,"entityUserId":entityUserId},function(data) {data = $.parseJSON(data);if(data.code == 0) {$(btn).children("i").text(data.likeCount);$(btn).children("b").text(data.likeStatus==1?'已赞':"赞");} else {alert(data.msg);}});
}

redis实现存储帖子的点赞状态和数量相关推荐

  1. 快手推荐系统及 Redis 升级存储

    快手推荐系统及 Redis 升级存储 借傲腾™ 补上 DRAM 短板 内容简介: · 作为短视频领域的领先企业,快手需要不断导入更先进的技术手段来调整和优化其系统架构,以应对用户量和短视频作品数量的爆 ...

  2. 阿里云Redis混合存储典型场景:如何轻松搭建视频直播间系统

    摘要: 本文主要介绍视频直播间系统,以及如何使用阿里云Redis混合存储实例方便快捷的构建大数据量,低延迟的视频直播间服务. 背景 视频直播间作为直播系统对外的表现形式,在整个系统中处于核心地位.通常 ...

  3. Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景

    Redis源码-String:Redis String命令.Redis String存储原理.Redis String三种编码类型.Redis字符串SDS源码解析.Redis String应用场景 R ...

  4. Redis源码-Set:Redis Set存储原理、Redis Set集合操作命令、Redis Set两种存储底层编码intset+hashtable、Redis Set应用场景

    Redis源码-Set:Redis Set存储原理.Redis Set集合操作命令.Redis Set两种存储底层编码intset+hashtable.Redis Set应用场景 Redis数据类型 ...

  5. Flask项目实战——7—(Redis数据库存储验证码信息、验证登录界面的表单信息、注册功能实现、登录实现)

    推荐一个API平台:聚合数据 1.Redis数据库存储验证码信息 保存手机验证码到Redis数据库 公有视图文件:apps/common/views.py # -*- encoding: utf-8 ...

  6. 用java在redis中存储对象

    最近需要封装一个操作redis的工具类,不知道怎么向redis中存储对象,想到过用java反射去做.在网上搜索了一下,发现可以用序列化对象的方式去存储.再此我整理了一下 感谢,残剑_提供的方法:htt ...

  7. redis java 存储图片_Redis 存储图片 [base64/url/path]vs[object]

    一.base64图片编解码 基本流程:从网络获取下载一张图片.然后base64编码,再base64解码,存到本地E盘根文件夹下. import java.awt.image.BufferedImage ...

  8. flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...

    flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入vie ...

  9. Redis 混合存储最佳实践指南

    Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品,混合存储实例突破 Redis 数据必须全部存储到内存的限制,使用磁盘存储全量数据,并将热数据缓存到内存,实现访问性能与 ...

最新文章

  1. 【cogs 309】香甜的黄油
  2. winform 线程监听两个目录下的文件_vb.net 利用.net自带的GZipStream压缩或者解压文件的代码,不需要任何第三方控件...
  3. cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务
  4. Mego(05) - Mego Tools使用教程
  5. linq的字段自增长属性设置_云途晨报9月9日前,这5类ebay物品属性必须完成更新;Wish体积重计算方式即将更新...
  6. 学习记录 php,php 学习记录
  7. oracle 终止imp,终止imp/exp和expdp/impdp进程运行的方法
  8. 2048游戏的核心运算
  9. UNITY3D MMO开发指南(Lua)
  10. 重启docker时:Error starting userland proxy: listen tcp 0.0.0.0:9000: listen: address already in use
  11. 用Verilog编写“数显LED的亮度控制电路”
  12. Unity3D 模型描边插件Outline Effect详细使用说明、C#功能扩展
  13. 如何编辑扫描的PDF文件?
  14. NetBIOS、WINS、DNS的联系和区别
  15. 查看文章 mysql:表注释和字段注释
  16. matlab使用自带的拟合工具cftool对数据进行拟合并生成拟合函数代码
  17. 论人工智能真空感应悬浮熔炼航母特种钢
  18. 【转租】【淞虹路独立厨卫一室户2700/月】【与房东直接签合同】
  19. 如何利用微信登陆自己的网站
  20. 英语语法总结--状语从句

热门文章

  1. 吃鸡显示该服务器不可使用是啥意思,绝地求生客户机服务器版本不匹配是啥意思 | 手游网游页游攻略大全...
  2. ftp服务器显示503,NET FTP Response error:(503) 的解决方法
  3. i3 10105f怎么样 i310105f相当于i5什么档次 i310105f属于什么档次
  4. python手机远程控制电脑访问网页_Python 实战系列-微信或网页远程控制电脑
  5. 产业分析:服务机器人行业研究
  6. Java编写的超市进销存管理系统 功能非常齐全,代码可直接运行
  7. 微信指数:微信官方提供的基于微信大数据分析的移动端指数
  8. 一键获取qq历史头像 php源码,LICENSE · 平兄/PHP 版获取任意QQ历史头像 - Gitee.com
  9. MacBook Pro 15Inch 2017 右上雷电3接口失灵
  10. 音频的播放、简单音乐播放器