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

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

網(wǎng)站代碼怎么改/個人在線做網(wǎng)站免費

網(wǎng)站代碼怎么改,個人在線做網(wǎng)站免費,西寧吧 百度貼吧,企業(yè)官方網(wǎng)站制作推廣軟件學習目標: 提示:學習如何利用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ù)結(jié)構(gòu)對點贊用戶進行排序來實現(xiàn)排行榜功能


學習產(chǎ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 {//移除用戶,避免內(nèi)存泄露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ù)轉(zhuǎn)為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è)務(wù)的處理邏輯點贊功能,將文章的點贊用戶以時間戳為分數(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.判斷當前用戶是否已經(jīng)點贊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轉(zhuǎn)換為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

相關(guān)文章:

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