当前位置: 首页 > news >正文

钢材贸易网站建设深圳竞价排名网络推广

钢材贸易网站建设,深圳竞价排名网络推广,定位器品牌,兰州疫情风险等级Set 类型 定义:类似 Java 中的 HashSet 类,key 是 set 的名字,value 是集合中的值特点 无序元素唯一查找速度快支持交集、并集、补集功能 常见命令 命令功能SADD key member …添加元素SREM key member …删除元素SCARD key获取元素个数SI…

Set 类型

  1. 定义:类似 Java 中的 HashSet 类,key 是 set 的名字,value 是集合中的值
  2. 特点
    1. 无序
    2. 元素唯一
    3. 查找速度快
    4. 支持交集、并集、补集功能

常见命令

命令功能
SADD key member …添加元素
SREM key member …删除元素
SCARD key获取元素个数
SISMEMBER key member判断一个元素是否存在于 set 中
SMEMBERS获取 set 中所有元素
SINTER key1 key2 …求 key1 和 key2 集合的交集
SDIFF key1 key2 …求 key1 和 key2 集合的差集
SUNION key1 key2 ….求 key1 和 key2 集合的并集

编码方式

  1. IntSet 编码
    1. 定义:IntSet 是一个有序的整数数组结构,相比哈希表占用更少的内存空间
    2. 使用条件:当集合中存储的所有数据都是整数,并且元素数量不超过配置项 set-max-intset-entries(默认值为512)
    3. 功能:满足使用条件时 Redis 自动使用 IntSet 编码,减少内存占用
  2. HT(Hash Table)编码
    1. 定义:key 存储集合的元素,value 统一设置为 null(因为 Set 只关心元素是否存在,不需要存储值)
    2. 使用条件:当不满足 IntSet 编码条件时,Redis 会使用哈希表来存储集合
    3. 功能:提供快速的查找性能,但需要消耗更多内存


示例

  1. 目标:用户关注与取关博主,查看用户与博主的共同关注
  2. 注意:此处代码实现涉及较多 SpringBoot 和 MybatisPlus 相关知识,已默认读者有一定基础

功能点

  1. 判断当前登录用户是否已经关注当前博主
  2. 当前用户关注 & 取关当前博主
  3. 查询当前用户与当前博主的共同关注

业务方案

Set 类型(Redis)

  1. 功能:记录当前用户关注的所有博主,并且可以查看共同关注(交集操作)

  2. 数据结构 :Set

    keyvalue (set)
    follow:userId(prefix + 做出关注行为的用户 id)被 key 用户关注的用户 id 集合

MySQL

  1. 功能

    1. 记录所有关注与被关注关系:创建一个关注表,每个条目对应一个关注关系
    2. 查询是否关注:select * from subscribe_table where user_id = userId and follow_user_id followUserId (查询结果不为空则已关注)
    3. 查询关注列表:select follow_user_id from subscribe_table where user_id = userId (查询结果是所有 userId 关注的博主的id)
  2. 数据结构

    字段名功能
    idprimary key (自增)
    user_id做出关注行为的用户的 ID
    follow_user_id被关注的用户的 ID
    create_time创建时间

最终方案

  1. 利用 Redis Set 的快速查询某个用户是否已经关注另一个用户
  2. 利用 Redis Set 的交集操作快速实现共同关注功能⁠
  3. 利用 MySQL 的 follow 表完整记录并持久化所有关注与被关注的关系⁠⁠
  4. 使用 MySQL 存储关注关系的基础数据,并使用Redis Set来提升共同关注等高频查询场景的性能⁠

代码实现

  1. 配置文件

    1. 目标:自动移除非活跃用户的关注列表,下次访问时再通过 MySQL 重建缓存
    2. 方案:使用 LRU(Least Recently Used)缓存淘汰策略。当内存超出阈值时,自动淘汰最久未使用的数据
    3. 注意:需要为 follow 缓存设置独立的 key 前缀,并结合 maxmemory-policy 配置分区缓存策略,避免误删其他缓存数据
    maxmemory-policy allkeys-lru
    
  2. 实体类 Follow:

    @Data
    @TableName("follow")
    public class Follow {@TableId(type = IdType.AUTO)private Long id;private Long userId;private Long followUserId;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;
    }
    
  3. Controller

    @RestController
    @RequestMapping("/follow")
    public class FollowController {@Resourceprivate IFollowService followService;@GetMapping("/isFollow/{followUserId}")public Result isFollow(@PathVariable Long followUserId) {boolean isFollow = followService.isFollow(followUserId);return Result.ok(isFollow);}@PostMapping("/follow/{followUserId}")public Result follow(@PathVariable Long followUserId) {boolean followExecuted = followService.follow(followUserId, isFollow);return Result.ok(followExecuted);}@GetMapping("/commons/{targetUserId}")public Result followCommons(@PathVariable Long targetUserId) {List<UserDTO> commons = followService.followCommons(targetUserId);return Result.ok(commons);}
    }
    
  4. Service接口:

    public interface IFollowService extends IService<Follow> {Boolean isFollow(Long followUserId);Boolean follow(Long followUserId);List<UserDTO> followCommons(Long id);
    }
    
  5. ServiceImpl 类:

    @Service
    public class FollowServiceImpl extends ServiceImpl<FollowMapper, Follow> implements IFollowService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate IUserService userService;@Overridepublic Boolean isFollow(Long followUserId) {// 获取当前用户idLong userId = UserHolder.getUser().getId();String key = "follow:" + userId;// 缓存不为空,则直接查询用户关注列表if (stringRedisTemplate.hasKey(key)) {return stringRedisTemplate.opsForSet().isMember(key, followUserId.toString());}// 缓存为空时,从数据库加载用户关注列表List<Long> followIds = baseMapper.selectFollowedIds(userId);// 没有关注的博主,则缓存空对象(防止缓存穿透)if (followIds.isEmpty()) {stringRedisTemplate.opsForSet().add(key, "null");        // 缓存空对象stringRedisTemplate.expire(key, 10, TimeUnit.MINUTES);   // 设置失效时间return false;}// followIds.forEach(id -> stringRedisTemplate.opsForSet().add(key, id.toString()));stringRedisTemplate.opsForSet().add(key, followIds.stream().map(String::valueOf).toArray(String[]::new));stringRedisTemplate.expire(key, 60, TimeUnit.MINUTES);        // 设置失效时间return stringRedisTemplate.opsForSet().isMember(key, followUserId.toString());}@Overridepublic Boolean follow(Long followUserId) {Long userId = UserHolder.getUser().getId();Boolean isFollowed = isFollow(followUserId);Boolean success = false;if (!isFollowed) {// 未关注 => 关注操作Follow follow = new Follow();follow.setUserId(userId);follow.setFollowUserId(followUserId);success = save(follow);if (success) {stringRedisTemplate.opsForSet().add(key, followUserId.toString());}} else {// 已关注 => 取关操作success = remove(new QueryWrapper<Follow>().eq("user_id", userId).eq("follow_user_id", followUserId));if (success) {stringRedisTemplate.opsForSet().remove(key, followUserId.toString());}}return success;}@Overridepublic List<UserDTO> followCommons(Long targetUserId) {Long userId = UserHolder.getUser().getId();String key1 = "follow:" + userId;String key2 = "follow:" + targetUserId;// 求交集Set<String> intersect = stringRedisTemplate.opsForSet().intersect(key1, key2);if (intersect == null || intersect.isEmpty()) {return Collections.emptyList();}// 解析idList<Long> ids = intersect.stream().map(Long::valueOf).collect(Collectors.toList());// 查询用户List<UserDTO> users = userService.listByIds(ids).stream().map(user -> BeanUtil.copyProperties(user, UserDTO.class)).collect(Collectors.toList());return users;}
    }
    
  6. FollowMapper

    @Mapper
    public interface FollowMapper extends BaseMapper<Follow> {// 注解方式@Select("select follow_user_id from follow where user_id = #{userId}")List<Long> selectFollowedIds(Long userId);}
    

http://www.hkea.cn/news/349861/

相关文章:

  • 网站总是跳转dede58seo对网络推广的作用是
  • seo排名怎么提高seo排名优化软件有用
  • 江门论坛建站模板黑帽seo联系方式
  • 政府网站信息内容建设专项检查搜索引擎排名优化seo课后题
  • 个人做的好的淘宝客网站软文营销推广
  • 城乡建设委员会网站河北seo推广公司
  • 某网站栏目策划2022十大热点事件及评析
  • 德清网站建设中心优化大师官方免费下载
  • 生日网页制作免费网站制作代做网页设计平台
  • 学校类网站特点游戏优化大师官网
  • 手机电视网站大全河南网站建设定制
  • zblog做的商城网站上海有实力的seo推广咨询
  • 免费网站模板psd网络营销的整体概念
  • 网站模板下载破解版环球军事新闻最新消息
  • 徐汇苏州网站建设东莞免费建站公司
  • 厦门网站建设哪家强深圳网站维护
  • 政府网站新媒体平台建设关键词权重查询
  • 重庆网站建设制作公司百度客服人工在线咨询电话
  • 微信公众号平台入口官网奶盘seo伪原创工具
  • 泉州网站建设公司推荐宁德市地图
  • 大厂县住房和城乡建设局网站刷百度指数
  • 低代码开发平台优缺点昆山seo网站优化软件
  • 网站开发年终总结网络营销战略的内容
  • 建立门户网站的意义营销推广网
  • 网站建设网站软件有哪些百度推广开户费用标准
  • 找家装修公司家装吉林seo外包
  • 保定医疗网站建设公司会计培训班初级费用
  • 最好的销售管理系统seo发帖网站
  • 德州乐陵德州seo公司seo批量建站
  • 贵州省建设监理协会官方网站seo代运营