C语言的不规则数组的用法,mysql、redis分布式锁的性能对比,skynet中multicast模块的完善,lua中table的误用

     《深入理解C指针》对指针进行了深入分析,总体而言,内容偏浅。其中对C语言不规则数组进行了详细的讲解,这里也是我之前没有深刻理解的部分。如下示例:
#include <stdlib.h>
#include <stdio.h>
void out(int (*(a[])),int* cols, int row)
{
    for(int i=0;i<row;++i)
    {
        for(int j=0;j<cols[i];++j)
        {
            printf("[%d][%d](%d)\n",i,j,a[i][j]);
        }
    }
}
int main()
{
    int (*(a[]))={
        (int[]){1,2,3},
        (int[]){4,5},
        (int[]){6}
    };
    int b[]={3,2,1};
    out(a,b,3);
    return 0;
}
虽然这种用法,在开发过程中用不到,但是一旦掌握,对C语言的内存布局和指针的理解,就会更加深刻。对指向不规则数组的指针的定义,我之前也没有充分理解,现在也理解了。
      最近开发了玩家数据迁移的基础模块,考虑到玩家一个账号在多个服务器有角色,并且可能多个设备同时在不同的服务器游戏的情况,使用了分布式锁,开始使用了mysql的unique key做为方案,当插入不成功时,证明迁移没有结束,但是我对用mysql来做分布式锁的效率没有信心,做了个测试,先将数据缓存不重复的100000份,逐个向mysql写入,在我的虚拟机上测试下来,117次/秒,很不理想,后面,我用redis的set nx来作为分布式锁,也是事先将数据缓存不重复的100000份,逐个向redis写入,在我的虚拟机上测试下来,5623次/秒,mysql和redis的差距太大了,由此,我对redis作为高性能的分布式锁有了更多的敬畏。
      前面记录过,在skynet中发送multicast协议时,二级指针指向的内存在发送指针地址之前会用jemalloc释放(并没有调用free释放,有jemalloc来管理),也是不安全的,应该和数据部分一起释放(在引用计数减为0的时候)。
      lua中table的误用,默认了lua的table里的第一行记录,在pairs迭代时是第一个被迭代到。
      这么多年的开发经历,得出了一个真理,程序中的一切问题,用自己能理解的语言,清晰、准确的表达出来,就已经解决了70%。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis分布式锁可以用于多个进程或者多台机器之间的互斥访问,保证同一时间只有一个进程或者机器能够对某个共享资源进行操作,从而避免数据的冲突和错误。 以下是一个使用Redis分布式锁的示例: 1.首先,在项目引入Redis相关依赖,例如使用Spring Boot可以在pom.xml文件加入以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2.创建一个RedisLock类,用于封装Redis分布式锁的相关操作: ```java @Component public class RedisLock { @Autowired private RedisTemplate redisTemplate; /** * 获取锁 * @param key 锁的名称 * @param value 锁的值 * @param expireTime 锁的过期时间 * @return */ public boolean lock(String key, String value, long expireTime) { // 尝试加锁 if (redisTemplate.opsForValue().setIfAbsent(key, value)) { // 设置锁的过期时间 redisTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS); return true; } return false; } /** * 释放锁 * @param key 锁的名称 * @param value 锁的值 */ public void unlock(String key, String value) { // 判断当前锁是否属于当前线程持有 if (value.equals(redisTemplate.opsForValue().get(key))) { // 删除锁 redisTemplate.delete(key); } } } ``` 3.在需要使用分布式锁的地方,注入RedisLock类,并调用lock方法进行加锁操作,在操作完成后调用unlock方法释放锁: ```java @Service public class MyService { @Autowired private RedisLock redisLock; public void myMethod(String key) { // 尝试加锁 boolean locked = redisLock.lock(key, "value", 5000); if (locked) { try { // 操作共享资源 // ... } finally { // 释放锁 redisLock.unlock(key, "value"); } } else { // 获取锁失败 // ... } } } ``` 以上就是一个简单的Redis分布式锁的使用示例。需要注意的是,在设置锁的过期时间时,需要根据具体业务场景进行调整。同时,为了避免锁持有时间过长导致的问题,建议在finally块释放锁,以确保锁的释放能够得到保证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值