小工具知识网

当前位置: 首页 > 行业知识 > Vue3+Ts实现缓存,用户搜索词本地排名,延迟消费或者消息队列,用户签到和锁,以及接口限流,还有全局ID

行业知识

Vue3+Ts实现缓存,用户搜索词本地排名,延迟消费或者消息队列,用户签到和锁,以及接口限流,还有全局ID

2026-11-12 14:44:09 来源:互联网转载

帮助类具体代码

import { onMounted, ref } from "vue";import emitter from '@/utils/mitt'interface Prop {    exp: number;    key: string;    data: any;    tag?: any;}export default function(){    // 缓存的仓库    let cacheStore  = ref( {} as Map);    // 用于本地排名    let ranking = ref( {} as Map );    // 延迟队列    let delayMsg = ref( {} as Map );    // 用户签到打卡    let sign = ref( {} as Map );    // 限流    let limiting = ref( {} as Map );    function limit( key : string ) {        if (limiting.value.has(key)) {            let temp = limiting.value.get(key) as number;            limiting.value.set(key,temp + 1);        }else {            limiting.value.set(key,1);        }    }    function takeLimit( key : string ) : number {        return limiting.value.get(key) as number;    }    function delLimit( key : string ) {        limiting.value.delete(key);    }    // 放入打卡的数据    function punchSetting( key : string , signInData : number[]) {        sign.value.set(key,signInData);    }    // 打卡    function startSign( key : string ,  day : number ): boolean {        let signInData = sign.value.get(key) as any[];        if (signInData) {            signInData.splice(day - 1,1,1);            return true;        }        return false;    }    // 返回连续打卡的天数    function continuousClocking( key : string ) : number {       if(sign.value.size > 0) {           let signInData = sign.value.get(key) as any[];           if (signInData) {               let day = 1;               let continuous : any[] = [];               signInData.forEach( (value, index) => {                   if(signInData[index] === signInData[index+1] && value ==1) {                       day++;                   }else {                       continuous.push(day);                       day = 1;                   }               });               return Math.max.apply(null,continuous);           }       }       return 0;    }    function putDelayMsg( prop : Prop ) {        prop.tag = getUUID();        if (delayMsg.value.has(prop.key)) {           let delayMsgs = delayMsg.value.get(prop.key) as any[];           delayMsgs.push(prop);           delayMsg.value.set(prop.key,delayMsgs);        }else {            let temp = [];            temp.push(prop);            delayMsg.value.set(prop.key,temp);        }    }    onMounted(() => {       cacheStore.value = new Map();       ranking.value = new Map();       delayMsg.value = new Map();       sign.value = new Map();       // 轮询清除过期的缓存       setInterval(() => {            if(cacheStore.value.size > 0) {                Array.from(cacheStore.value.keys()).forEach( key => {                    let data = cacheStore.value.get(key);                    if (data) {                        let nowDate = new Date().valueOf();                        if (data.exp  {  console.log(e) } )        setInterval(() => {            if(delayMsg.value.size > 0) {                Array.from(delayMsg.value.keys()).forEach( key => {                    let temp = delayMsg.value.get(key) as any[];                    temp.forEach( item => {                        let nowDate = new Date().valueOf();                        if( item.exp  dispose .tag != item.tag);                            delayMsg.value.set(item.key,temp);                        }                    });                })            }        },100);    });    function putRanking( key : string , data : any) {        if(ranking.value.has(key)) {           let rank  = ranking.value.get(key) as any[];           let temp = rank.find(item => item.data === data);           if(temp) {               let newVal =  rank.filter(item => item.data !== data );               newVal.push({ data: data.toString() , score : temp.score + 1 });               ranking.value.set(key,newVal);           }else {               rank.push({ data: data.toString() , score : 1 });               ranking.value.set(key,rank);           }        }else {           let temp = [] as any[];           temp.push({ data: data.toString() , score: 1 });           ranking.value.set(key,temp);        }    }    function takeRanking( key : string , total : number , desc : boolean): any[] {        let rank = ranking.value.get(key) as any[];        if(desc) {            rank.sort( ( a , b ) => b.score - a.score );        }else {            rank.sort( ( a , b ) => a.score - b.score );        }        return rank.slice(0, total != 1 ? total - 1 : total);    }    // 放入缓存    function putCache( prop : Prop ) {        cacheStore.value.set(prop.key,prop);    }    // 获取缓存    function takeCache( key : string ) : any {        return cacheStore.value.get(key) as T;    }    // 加锁    function lock( prop : Prop ) : boolean {        if (getLock(prop.key)) {            return false;        }        cacheStore.value.set(prop.key,prop);        return true;    }    // 获取锁    function getLock( key : string ) : boolean {        return cacheStore.value.has(key);    }    // 解锁    function unLock( key : string , id : any) {        let lock = cacheStore.value.get(key);        if( lock ) {            if( lock.data == id ) {                cacheStore.value.delete(key);            }        }    }    // 全局id    function getUUID () {        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {            const r = Math.random() * 16 | 0            const v = c === 'x' ? r : (r & 0x3 | 0x8)            return v.toString(16)        });    }    return { takeCache , putCache , unLock , lock , getLock , putRanking , takeRanking , getUUID , putDelayMsg , startSign , punchSetting , continuousClocking }}

使用代码

      获取缓存    获取前三搜索    生成订单    初始打卡数据    模拟打卡    获取练习打卡{{continuousClocking('3')}}      @import 'animate.css';    .ske {      display: flex;      justify-content: center;      align-items: center;      animation: hinge;      animation-duration: 3s;    }    import { onMounted } from 'vue';    import emitter from '@/utils/mitt'    import CacheHelp from '@/hooks/CacheHelp'    const { putCache , takeCache , putRanking , takeRanking ,  putDelayMsg , punchSetting , continuousClocking , startSign } = CacheHelp();    onMounted(() => {      putCache({ key: 'UserInfo' , data : { name: 'Jack' , age : 12 } , exp: new Date().valueOf() + 3000 });      putRanking("word","成都");      putRanking("word","北京");      putRanking("word","成都");      putRanking("word","重庆");      putRanking("word","武汉");      putRanking("word","北京");      putRanking("word","成都");      putRanking("word","上海");    });    function simulationSign() {      startSign('3',2);      startSign('3',3);      startSign('3',4);      startSign('3',12);      startSign('3',13);      startSign('3',14);      startSign('3',15);      startSign('3',16);      startSign('3',18);      startSign('3',31);    }    function getCache() {      console.log(`获取的缓存:${JSON.stringify(takeCache("UserInfo"))}`);    }    function getMonthDays( year : number, month : number ) : number {      let days = [31,28,31,30,31,30,31,31,30,31,30,31]      if ( ( year % 4 === 0 ) && ( year % 100 !== 0 || year % 400 === 0) ) {        days[1] = 29      }      return days[month - 1];    }    function initSign() {      let signData = []      for (let i = 0; i  {      console.log(`收到延迟消息:${JSON.stringify(e)}\t接收时间:${new Date().toLocaleTimeString()}`)    })

效果

上一篇:怎么关掉淘宝绿网服务器?

下一篇:服务器系统自检怎么跳过?