redis分布式锁

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

1.高性能(分布式锁不能成为系统的性能瓶颈)
2.避免死锁(拿到锁的结点挂掉不会导致其它结点永远无法继续)
3.支持锁重入

 

事务

复制代码
using (IRedisClient RClient = prcm.GetClient())
    {
        RClient.Add("key",1);
        using (IRedisTransaction IRT = RClient.CreateTransaction())
        {
            IRT.QueueCommand(r => r.Set("key", 20));
            IRT.QueueCommand(r => r.Increment("key",1)); 

            IRT.Commit(); // 提交事务
        }
        Response.Write(RClient.Get<string>("key"));
    }
复制代码

 

并发锁(模拟2个线程同时并发)

复制代码
   public static bool SetLock(string key, int val, TimeSpan timeOut)
        {
            using (IRedisClient rds = prcm.GetClient())
            {
                using (rds.AcquireLock("Lock" + key, timeOut))
                {
                    int v = rds.Get<int>(key);
                    return rds.Set<int>(key, v + val);
                }
            }
        }


using ServiceStack.Redis;
using ServiceStack.Redis.Generic;
using ServiceStack.Text;

using Sim.Common;
using System.Threading;
namespace ConsoleTest
{
    class Program
    {
     static void Main(string[] args)
        {
//启动2进程模拟 redis并发锁情况 Redis.Set<int>("u", 1); RedisConcurrence r1 = new RedisConcurrence("T1"); Thread thread1 = new Thread(new ThreadStart(r1.Go)); thread1.Start(); RedisConcurrence r2 = new RedisConcurrence("T2"); Thread thread2 = new Thread(new ThreadStart(r2.Go)); thread2.Start(); } } public class RedisConcurrence { private string key = "u"; /// <summary> /// 操作次数 /// </summary> private int count = 10; /// <summary> /// 锁定时间(秒) /// </summary> private int lockTime = 5; private string name; public string Name { get { return name; } set { name = value; } } public RedisConcurrence(string name) { this.name = name; } public void Go() { TimeSpan time = new TimeSpan(0, 0, 0, this.lockTime); for (var i = 0; i < this.count; i++) { Redis.SetLock(key, 1, time); Console.WriteLine(this.name + ":" + DateTime.Now.ToString() + " " + Redis.Get<int>(key).ToString()); } } } }
复制代码

运行结果(刚开始有2个一样的数据,属于正常情况,自己想吧)


本文转自快乐就好博客园博客,原文链接:http://www.cnblogs.com/happyday56/p/3956486.html,如需转载请自行联系原作者
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 算法 关系型数据库
Redis分布式锁
【10月更文挑战第1天】分布式锁用于在多进程环境中保护共享资源,防止并发冲突。通常借助外部系统如Redis或Zookeeper实现。通过`SETNX`命令加锁,并设置过期时间防止死锁。为避免误删他人锁,加锁时附带唯一标识,解锁前验证。面对锁提前过期的问题,可使用守护线程自动续期。在Redis集群中,需考虑主从同步延迟导致的锁丢失问题,Redlock算法可提高锁的可靠性。
80 4
|
6月前
|
NoSQL Java 关系型数据库
【Redis系列笔记】分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
657 2
|
2月前
|
NoSQL 安全 关系型数据库
20)用 Redis 实现分布式锁
20)用 Redis 实现分布式锁
34 0
|
4月前
|
NoSQL Redis 数据库
|
6月前
|
NoSQL Java 大数据
介绍redis分布式锁
分布式锁是解决多进程在分布式环境中争夺资源的问题,与本地锁相似但适用于不同进程。以Redis为例,通过`setIfAbsent`实现占锁,加锁同时设置过期时间避免死锁。然而,获取锁与设置过期时间非原子性可能导致并发问题,解决方案是使用`setIfAbsent`的超时参数。此外,释放锁前需验证归属,防止误删他人锁,可借助Lua脚本确保原子性。实际应用中还有锁续期、重试机制等复杂问题,现成解决方案如RedisLockRegistry和Redisson。
68 0
|
6月前
|
NoSQL Java 关系型数据库
浅谈Redis实现分布式锁
浅谈Redis实现分布式锁
61 0
|
6月前
|
缓存 NoSQL Java
【Redis】Redis 分布式锁
【Redis】Redis 分布式锁
68 0
【Redis】Redis 分布式锁
|
6月前
|
NoSQL Java 关系型数据库
Redis系列-10.Redis分布式锁(下)
Redis系列-10.Redis分布式锁
79 0
|
6月前
|
NoSQL Java 应用服务中间件
Redis系列-10.Redis分布式锁(上)
Redis系列-10.Redis分布式锁
52 0
|
NoSQL Redis
Redis实现分布式锁
本章主要讲解了如何通过Redis实现分布式锁
72 1
下一篇
无影云桌面