Redis高级数据类型

编程入门 行业动态 更新时间:2024-10-27 02:24:12

Redis高级<a href=https://www.elefans.com/category/jswz/34/1768302.html style=数据类型"/>

Redis高级数据类型

网站数据统计

定义相关的Redis Key

    /*** 单日UV*/public static String getUVKey(String date) {return PREFIX_UV+SPLIT+date;}/*** 记录区间UV* @param startData 开始日期* @param endDate 结束日期* @return*/public static String getUVkey(String startData,String endDate){return PREFIX_UV+SPLIT+startData+SPLIT+endDate;}/*** 单日活跃用户* @param date* @return*/public static String getDAUkey(String date){return PREFIX_DAU+SPLIT+date;}/*** 区间活跃用户* @param startDate 开始日期* @param endDate 结束日期* @return*/public static String getDAUKey(String startDate,String endDate){return PREFIX_DAU+SPLIT+startDate+SPLIT+endDate;}

定义DataService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStringCommands;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;@Service
public class DataService {@Autowiredprivate RedisTemplate redisTemplate;//定义日期格式private SimpleDateFormat df=new SimpleDateFormat("yyyyMMdd");//将指定的IP计入UVpublic void recordUV(String ip){//获取redisKeyString redisKey = RedisKeyUtil.getUVKey(df.format(new Date()));//存入ipredisTemplate.opsForHyperLogLog().add(redisKey,ip);}//统计指定日期范围内的UVpublic long calculateUV(Date start,Date end){//参数判空if(start ==null || end == null){throw new IllegalArgumentException("参数不能为空");}/*** 整理改时间范围内的key*/List<String> keyList =new ArrayList<>();//可以进行日期计算Calendar calendar = Calendar.getInstance();calendar.setTime(start);//当前日期小于结束日期while (!calendar.getTime().after(end)){String key=RedisKeyUtil.getUVKey(df.format(calendar.getTime()));keyList.add(key);calendar.add(Calendar.DATE,1);//对日期进行递加}/*** 合并数据*/String redisKey =RedisKeyUtil.getUVkey(df.format(start),df.format(end));redisTemplate.opsForHyperLogLog().union(redisKey,keyList.toArray());//返回统计结果 访问数量return redisTemplate.opsForHyperLogLog().size(redisKey);}//将指定用户计入DAUpublic void recordDAU(int userId){String redisKey =RedisKeyUtil.getDAUkey(df.format(new Date()));redisTemplate.opsForValue().setBit(redisKey,userId,true);}//统计指定日期范围内的DAU//每一天的统计结果做一个或运算public long calculateDAU(Date start,Date end){//参数判空if(start ==null || end == null){throw new IllegalArgumentException("参数不能为空");}/*** 整理改时间范围内的key*/List<byte[]> keyList =new ArrayList<>();//可以进行日期计算Calendar calendar = Calendar.getInstance();calendar.setTime(start);//当前日期小于结束日期while (!calendar.getTime().after(end)){String key=RedisKeyUtil.getDAUkey(df.format(calendar.getTime()));keyList.add(key.getBytes());calendar.add(Calendar.DATE,1);//对日期进行递加}/*** 整合进行or运算* 使用redis底层的链接调用or运算*/return (long) redisTemplate.execute(new RedisCallback() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {String redisKey = RedisKeyUtil.getDAUKey(df.format(start),df.format(end));//解释connection.bitOp(RedisStringCommands.BitOperation.OR,redisKey.getBytes(),keyList.toArray(new byte[0][0]));return connection.bitCount(redisKey.getBytes());}});}
}

定义拦截器


@Component
public class DataInterceptor implements HandlerInterceptor {@Autowiredprivate DataService dataService;@Autowiredprivate HostHolder hostHolder;//在请求之初统计数据@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{//统计UVString ip= request.getRemoteHost();dataService.recordUV(ip);//统计DAUUser user = hostHolder.getUser();if(user!=null){dataService.recordDAU(user.getId());}return true;}
}

定义Controller

@Controller
public class DataController {@Autowiredprivate DataService dataService;/*** 统计页面的函数* @return*/@RequestMapping(path = "/data",method = {RequestMethod.GET,RequestMethod.POST})public String getDataPage(){return "/site/admin/data";}/*** 统计网站UV* @param start* @param end* @param model* @return*/@RequestMapping(path = "/data/uv",method = RequestMethod.POST)public String getUV(@DateTimeFormat(pattern = "yyyy-MM-dd") Date start , @DateTimeFormat(pattern = "yyyy-MM-dd") Date end, Model model){long uv =dataService.calculateUV(start,end);model.addAttribute("uvResult",uv);model.addAttribute("uvStartDate",start);model.addAttribute("uvEndDate",end);//将处理结果发给/data进行另一半的处理return "forward:/data";
//        return "/site/admin/data";}@RequestMapping(path = "/data/dau",method = RequestMethod.POST)public String getDAU(@DateTimeFormat(pattern = "yyyy-MM-dd") Date start , @DateTimeFormat(pattern = "yyyy-MM-dd") Date end, Model model){long dau =dataService.calculateDAU(start,end);model.addAttribute("dauResult",dau);model.addAttribute("dauStartDate",start);model.addAttribute("dauEndDate",end);//将处理结果发给/data进行另一半的处理return "forward:/data";
//        return "/site/admin/data";}
}

添加权限

.antMatchers("/discuss/delete","/data/**")

页面示例

<div class="main"><!-- 网站UV --><div class="container pl-5 pr-5 pt-3 pb-3 mt-3"><h6 class="mt-3"><b class="square"></b> 网站 UV</h6><form class="form-inline mt-3" method="post" th:action="@{/data/uv}"><input type="date" class="form-control" required name="start" th:value="${#dates.format(uvStartDate,'yyyy-MM-dd')}"/><input type="date" class="form-control ml-3" required name="end" th:value="${#dates.format(uvEndDate,'yyyy-MM-dd')}"/><button type="submit" class="btn btn-primary ml-3">开始统计</button></form><ul class="list-group mt-3 mb-3"><li class="list-group-item d-flex justify-content-between align-items-center">统计结果<span class="badge badge-primary badge-danger font-size-14" th:text="${uvResult}">0</span></li></ul></div><!-- 活跃用户 --><div class="container pl-5 pr-5 pt-3 pb-3 mt-4"><h6 class="mt-3"><b class="square"></b> 活跃用户</h6><form class="form-inline mt-3"method="post" th:action="@{/data/dau}"><input type="date" class="form-control" required name="start" th:value="${#dates.format(dauStartDate,'yyyy-MM-dd')}"/><input type="date" class="form-control ml-3" required name="end" th:value="${#dates.format(dauEndDate,'yyyy-MM-dd')}"/><button type="submit" class="btn btn-primary ml-3">开始统计</button></form><ul class="list-group mt-3 mb-3"><li class="list-group-item d-flex justify-content-between align-items-center">统计结果<span class="badge badge-primary badge-danger font-size-14" th:text="${dauResult}">0</span></li></ul></div>				</div>

更多推荐

Redis高级数据类型

本文发布于:2023-11-16 14:19:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1624643.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据类型   高级   Redis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!