menu

redis排行榜同分数排序问题

date_range 29/10/2020 02:00

在使用redis开发一个排行榜的时候,我们通常使用redis的有序集合(sorted set),时间复杂度为O(M*log(N)),但是在某些分差较小,需要先到达这个分数的用户排在前面,但是如果同分数情况下,可能会出现后到达分数的排在前。网上有很多解决方案,这里介绍一个最优解决方案(以下均为伪代码)。
使用毫秒时间排序 ``` userA = 10 //假如A获得10分 userB = 10 //假如B也获得10分 userA = 10+”.”.time.Now().UnixNano() //使用毫秒时间戳拼接 得到结果 10.1257894000000 userB = 10+”.”.time.Now().UnixNano() //使用毫秒时间戳拼接 得到结果 10.1257895000000

golang使用Context实现简单的超时机制

date_range 20/09/2020 00:00

Golang可以使用很多方案实现超时机制,比如ChannelTimeAfterContext,下文使用官方提供的Context包来实现一个简单的超时机制。

golang实现简单的woker工作池

date_range 17/09/2020 03:00

使用golang实现简单的worker工作池。 指定worker数量,避免创建过多的Goroutine
    var workerChan chan int = make(chan int ,4) //指定worker数量
    var wg = sync.WaitGroup{}
    func main() {
        //模拟10个任务
        for i:=1;i<=10;i++{
            wg.Add(1)
            workerChan<-i
            go exec(i)
        }
        wg.Wait()
        log.Println(`end`)
    }

    //执行任务
    func exec(i int){
        defer func() {
            <-workerChan
            wg.Done()
        }()
        time.Sleep(1*time.Second)
        log.Println(i)
    }

golang截取中文字符串

date_range 29/07/2020 09:00

直接使用切片方式会使得中文字符串乱码,必须先将字符串转成rune类型。

API的RSA+AES秘钥交换

date_range 01/07/2020 07:00

后端各自生成自己的RSA秘钥对(公钥、私钥),然后交换公钥(后端给前端的是正常的明文公钥,前端给后端的是用后端公钥加密后的密文公钥;PS:其实我觉得直接交换两个明文公钥就行了),后端生成AES的明文key,用明文key进行AES加密得到密文数据,用前端的公钥进行RSA加密得到密文key,API交互时并将密文数据与密文key进行传输,前端用自己的私钥进行RAS解密的到明文key,用明文key进行AES解密得到明文数据;前端给后端发送数据时同理,这样一来,传输的数据都是密文,且只有秘钥才能解密