redis分布式锁

本文涉及的产品
云数据库 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
相关文章
|
7天前
|
NoSQL Java 大数据
介绍redis分布式锁
分布式锁是解决多进程在分布式环境中争夺资源的问题,与本地锁相似但适用于不同进程。以Redis为例,通过`setIfAbsent`实现占锁,加锁同时设置过期时间避免死锁。然而,获取锁与设置过期时间非原子性可能导致并发问题,解决方案是使用`setIfAbsent`的超时参数。此外,释放锁前需验证归属,防止误删他人锁,可借助Lua脚本确保原子性。实际应用中还有锁续期、重试机制等复杂问题,现成解决方案如RedisLockRegistry和Redisson。
|
9天前
|
NoSQL Redis 微服务
分布式锁_redis实现
分布式锁_redis实现
|
7月前
|
NoSQL Java 关系型数据库
Redis-分布式锁
分布式锁的基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路 在分布式情况下有多个JVM,所以就有多个锁监视器,所以就存在有多个线程拿到锁,他们就会产生不互斥的情况,这也是我们为什么要使用分布式锁的原因。而从图中我们也可以看到分布式锁的原理:让多个微服务共用一个锁监视器,这样就不会有多把锁同时存在的情况。 那么分布式锁他应该满足一些什么样的条件呢? 可见性:多个线程都能看到相同的结果,注意:这个地方说的
37 1
|
7月前
|
NoSQL Java 程序员
Redis实现分布式锁(2)
Redis实现分布式锁(2)
|
10月前
|
NoSQL Java 关系型数据库
|
10月前
|
缓存 NoSQL 算法
分布式锁的实现之Redis
前面我们有聊过乐观锁和悲观锁的实现,均是对于单体架构的场景下的实现。那么现在我们来总结看下分布式情况下如何实现锁机制。
73 0
分布式锁的实现之Redis
|
11月前
|
存储 NoSQL 算法
Redis的分布式锁详解
Redis的分布式锁详解
Redis的分布式锁详解
|
NoSQL 安全 JavaScript
被问烂的Redis分布式锁,你真的懂了? 上
被问烂的Redis分布式锁,你真的懂了?上
被问烂的Redis分布式锁,你真的懂了? 上
|
缓存 NoSQL Java
redis分布式锁(1)
随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!
redis分布式锁(1)
|
NoSQL Redis
Redis 分布式锁的实现
Redis 分布式锁的实现
1558 6

热门文章

最新文章