中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

網站代碼怎么改/個人在線做網站免費

網站代碼怎么改,個人在線做網站免費,西寧吧 百度貼吧,企業(yè)官方網站制作推廣軟件學習目標: 提示:學習如何利用Redisson實現(xiàn)點贊排行榜功能,按照時間順序 當用戶給某一篇文章點贊后,會再數(shù)據(jù)庫中存儲一條數(shù)據(jù),并且在Redis中存儲一條數(shù)據(jù)為當前博客的點贊用戶標識,來區(qū)分哪個用戶對文章進…

學習目標:

提示:學習如何利用Redisson實現(xiàn)點贊排行榜功能,按照時間順序
當用戶給某一篇文章點贊后,會再數(shù)據(jù)庫中存儲一條數(shù)據(jù),并且在Redis中存儲一條數(shù)據(jù)為當前博客的點贊用戶標識,來區(qū)分哪個用戶對文章進行了點贊,使用ZSet數(shù)據(jù)結構對點贊用戶進行排序來實現(xiàn)排行榜功能


學習產出:

解決方案:

  1. 點贊后的用戶記錄在Redis的set數(shù)據(jù)類型中

1. 準備pom環(huán)境

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>5.1.47</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.23.1</version></dependency>

2. 配置ThreadLocal和過濾器

public class UserHolder {private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();}
}
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate StringRedisTemplate redis;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/user/code","/user/login","/blog/hot","/shop/**","/shop-type/**","/voucher/**").order(2);registry.addInterceptor(new RefreshTokenInterceptor(redis)).addPathPatterns("/**").order(1);}
}
---------------------------------------------
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {//controller執(zhí)行之前@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.判斷是否需要攔截ThreadLocalif (UserHolder.getUser()==null) {response.setStatus(401);return false;}//7.放行return true;}//渲染后返回給前臺數(shù)據(jù)前@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//移除用戶,避免內存泄露UserHolder.removeUser();}
}
---------------------------------------------------
@Slf4j
public class RefreshTokenInterceptor implements HandlerInterceptor {//這個對象不是由spring管理的所以不能用注解自動注入private StringRedisTemplate redis;public RefreshTokenInterceptor(StringRedisTemplate redis) {this.redis = redis;}//controller執(zhí)行之前@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.獲取請求頭中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {return true;}//2.基于token獲取redis中的用戶//通過key取到hash中的map集合數(shù)據(jù)Map<Object, Object> userMap = redis.opsForHash().entries("login:token:" + token);//3.判斷用戶是否存在if (userMap.isEmpty()) {return true;}//5.將查詢到的hash數(shù)據(jù)轉為userDto對象UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//6.存在,保存用戶信息到ThreadLocal中UserHolder.saveUser(userDTO);//7.刷新token有效期redis.expire(LOGIN_USER_KEY + token, 30, TimeUnit.MINUTES);log.info("我是第一個攔截器當前攔截所有請求的用戶為,線程為{},{}",UserHolder.getUser(),Thread.currentThread());//8.放行return true;}

3. Controller層:負責接收請求和向下分配

@RestController
@RequestMapping("/blog")
public class BlogController{@Resourceprivate IBlogService blogService;@PutMapping("/like/{id}")public Result likeBlog(@PathVariable("id") Long id) {return blogService.likeBlog(id);}
}

4. Service層:負責業(yè)務的處理邏輯點贊功能,將文章的點贊用戶以時間戳為分數(shù)存入Redis

@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {@Autowiredprivate IUserService userService;@Resourceprivate StringRedisTemplate redis;@Overridepublic Result likeBlog(Long id) {//1.獲取登錄用戶Long userId = UserHolder.getUser().getId();//2.判斷當前用戶是否已經點贊String key = "blog:liked:" + id;//獲取當前登錄用戶的分數(shù),若文章中的用戶id分數(shù)為null說明未點贊Double score = redis.opsForZSet().score(key, userId.toString());if (score == null) {//3.如果未點贊,可以點贊//3.1 點贊+1boolean isSuccess = update().setSql("liked= liked +1").eq("id", id).update();//3.2保存當前點贊用戶到Redis的文章set集合中,文章set集合中記錄的是點贊用戶的id,//分數(shù)是時間戳,可以進行排序if (isSuccess) {//存入Redis的分數(shù)值以當前時間戳存入redis.opsForZSet().add(key, userId.toString(), System.currentTimeMillis());}} else {//4.如果已點贊,取消點贊//4.1點贊-1boolean isSuccess = update().setSql("liked = liked -1").eq("id", id).update();//4.2把用戶從Redis的set集合移除if (isSuccess) {redis.opsForZSet().remove(key, userId.toString());}}return null;}
}

5. 上述為下面的排行榜做鋪墊
查詢當前文章的點贊排行榜,id是文章id號

	@PutMapping("/likes/{id}")public Result likesBlog(@PathVariable("id") Long id) {return blogService.queryBlogLikes(id);}
@Overridepublic Result queryBlogLikes(Long id) {String key="blog:liked:" + id;//取出前五條數(shù)據(jù)Set<String> rangeData = redis.opsForZSet().range(key, 0, 4);if (rangeData==null) {return Result.ok(Collections.emptyList());}//將文章點贊的前五條用戶id轉換為Long類型List<Long> ids = rangeData.stream().map(Long::valueOf).collect(Collectors.toList());String idStr = StrUtil.join(",", ids);//去數(shù)據(jù)庫把這些用戶查詢出來,并且數(shù)據(jù)脫敏返回給前端List<User> users = userService.query().in("id",ids).last("order by field(id,"+idStr+")").list();UserDTO userData = BeanUtil.copyProperties(users, UserDTO.class);return Result.ok(userData);}
http://www.risenshineclean.com/news/78.html

相關文章:

  • 網站首頁html/怎樣打百度人工客服熱線
  • 深圳市企業(yè)網站建設價格/整合營銷理論主要是指
  • 個人主頁頁面/seo優(yōu)化招商
  • 工信部網站備案查詢步驟詳解/公司網站
  • 做航模的網站/網銷怎么做
  • 網站pv統(tǒng)計方法/推廣策劃方案
  • tornado 做網站/seo刷詞工具在線
  • 網站建設和維護合同/湖南seo優(yōu)化首選
  • 淘寶網站建設哪個類目/seo公司
  • 做網站怎么偷源碼做網站/阿里seo排名優(yōu)化軟件
  • 電商網站建設與運營/網站管理
  • 文學投稿網站平臺建設/好f123網站
  • 做網站策劃需要用什么軟件/bt磁力搜索引擎在線
  • 沈陽網站建設制作公司/友情鏈接怎么設置
  • 學校資源網站的建設方案/東莞seo推廣機構帖子
  • 建設部資質上報系統(tǒng)網站/重慶百度推廣優(yōu)化
  • 南昌網站建設哪家好/什么軟件可以推廣自己的產品
  • 個人網站 作品/站長之家工具
  • 吳謹含廠家不愿做網站/平臺網站開發(fā)公司
  • 網站項目策劃書實例/網絡推廣深圳有效渠道
  • wordpress 支持html5/網站標題算關鍵詞優(yōu)化嗎
  • 在京東上怎樣做網站/免費平臺推廣
  • 阿里自助建站平臺/網站優(yōu)化公司收費
  • 如何建立一個網站分享教程/推廣賺傭金的軟件排名
  • 網站設計寬屏/品牌策略有哪些
  • 網站建設系統(tǒng)哪個好/seo點擊排名軟件營銷工具
  • 建設文明網 聯(lián)盟網站的/學seo推廣
  • 武漢網站建設 loongnet/百度云官網
  • 如何建設一個屬于自己的網站/引擎優(yōu)化seo
  • 南寧做網站外包/品牌宣傳策略有哪些