翼度科技»论坛 编程开发 .net 查看内容

Redis-篇

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
实战篇 实现秒杀下单

全局唯一ID

在一般业务中秒杀功能,存在并发问题如果两个线程同时执行插入操作导致数据库id 自增 同时为一个数 就会导致写入数据失败
全局Id生成器

点击查看代码[code]public static class RedisIdWork{    private readonly static long BEGIN_TIMSTAMP = 1678966413L;    private readonly static int COUNT_BITS = 32;    public static long nextId(string keyPrefix)    {        //1、生成时间戳        long nowTimeSeconds = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();        long timesamp = nowTimeSeconds - BEGIN_TIMSTAMP;        //2、生成序列号        string date = DateTime.Now.ToString("yyyyMMdd");        var redis = new RedisHelper();        long count = redis.database().StringIncrement("icr:" + keyPrefix + ":" + date, 1);        //3、拼接返回        return timesamp  0
为什么版本要大于0 而不是等于 (因为只要是在这个区间就可以 不小于0 即可)</p></blockquote>一人一单秒杀

分布式锁



redis 分布式锁

场景:目的是为了解决多台相同服务之间同时工作产生的并发问题,(例如订单系统,假设订单系统部署在两台机器上,但是库存是固定的,接着每个订单系统实例都去数据库里查了一下,由于并发问题导致超卖,这肯定是不允许的)(当然并发特别大的话是需要进行分段数据,数据分段会导致整体业务流程更加复杂,如果没有这方面的需求建议不要使用)
SETNX LOCK Thread1
为了保证原子性 (带上过期时间) 如果不设置过期时间会出现死锁问题
Set lock thread1 EX 10 NX
redis 分布式锁如何解决原子性

场景,如果在获取锁后执行的一些操作,但是此时遇到阻塞,导致锁超时释放了,(比如我们获取了一个自己的锁,然后去执行减库存操作,但是在减库存操作中遇到了阻塞,导致锁超时释放了,此时我们的减库存操作因为阻塞了还没有完成,但是redis锁已经释放了,后面假设此时减库存操作完成了,去调用释放锁,此时会导致当前下释放的锁可能是别人的锁,(因为我们的锁已经超时释放了))

解决这个问题 就是把多条命令 获取锁和释放锁保证原子性
高级篇

数据持久化

RDB模式

RDB (redis Database Backup file)数据备份文件
save # redis主进程执行备份,会阻塞所有命令
bgsave #开启子线程执行备份,避免主线程受到影响
save 5 1 (表示五秒内有一次修改就执行备份操作) 可以在redis.conf中修改

bgsave fork主进程开启一个子进程,共享内存空间,(这时候物理内存是只读模式)
如果会有写入操作会拷贝一份数据

AOF模式

AOF全称为 Append only file(追加文件),redis会处理每一个写入命令都会记录在aof文件中
AOf默认是关闭的
appendonly yes  appendfilename "appendonly.aof"

AOF和RDB两者区别


分布式主从集群

搭建主从集群

单节点Redis并发能力邮上线,要提升并发能力需要搭建主从集群,实现读写分离(大部分业务都是读的业务)
一般写入到master 节点,同步到子节点
需要三台redis 服务器

修改redis.conf文件


来源:https://www.cnblogs.com/Bo-H/archive/2023/03/16/17220877.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具