gpt4 book ai didi

asp.net-mvc - Microsoft.Web.RedisSessionStateProvider 不保存值

转载 作者:可可西里 更新时间:2023-11-01 11:14:33 25 4
gpt4 key购买 nike

问题

未在 Razor View 中检索 session 值并导致逻辑错误。

环境

Redis sentinel 和 web 服务器上的 sentinel 但只有一个 redis master 和一个 redis slave。 redis 连接字符串同时指向主从。

代码

在 View 之前的 Controller 中:

var fooLocal = fooMapper.Map(fooDbCall.GetFromDb(fooValue));

if (fooLocal != null)
{
Session["FooSession"] = fooLocal.fooProperty;
}
else
{
Session["FooSession"] = false;
}

在 View 中

@if (fooRazorVal == 123)
{
// show some stuff
}
else if (!((bool?)Session["FooSession"] ?? false) && (fooRazorVal2 == 456))
{
// show error message
}
else
{
// show other stuff
}

结果

即使已通过代码和数据库回溯有问题的帐户以验证它不应为假,更不用说为空,也会显示错误消息。其他 session 值的存储和检索都很好,否则您甚至不会在我的流程中做到这一点。

调查

正如我提到的,所有其他代码位和数据库都已经过验证。我添加了一个日志记录类,并且有很多这样的条目:

[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 4686063 => Can not lock, Someone else has lock and lockId is 636901606595110722
[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 26422156 => Lock taken with lockId: 636901606595110722
[Info]GetItemFromSessionStore => Session Id: ctps3urcqwm0tpezo5bbmqzj, Session provider object: 4686063 => Can not lock, Someone else has lock and lockId is 636901606595110722

但是,考虑到它们的绝对数量,我想知道这实际上是一个错误还是 RedisSessionStateProvider 按预期工作。我确实看到它使用 SETNX 来获取锁。不幸的是,我对 Redis 语义不够精通,不知道这是否会导致问题。

我在 Redis 文档上做了 see a note,关于这是一种旧方法并改用 RedLock。然而,据我了解 RedLock,单个主/单个从设置是不够的,尽管它支持重试,所以它可能无论如何都可以工作。我也很好奇我是否应该推出一个简单的自定义提供程序,让 StackExhange 的 ConnectionMultiplexer 在没有额外锁或自定义脚本的情况下工作,以及我是否确实需要锁才能使用 RedLock 的 C# 库之一。

最佳答案

根据设计,Redis 键在更新期间被锁定,您不需要锁定它们。事实上,Redis 使用单线程来处理命令,因此每个操作都是原子的。其他客户端在给定命令的处理过程中被阻塞,这就是为什么您不能执行执行时间很长的查询并且会收到此错误的原因。

要防止必须实现分布式锁。在不同进程必须以互斥方式使用共享资源的许多环境中,分布式锁是一种非常有用的原语。

这里是不同语言的不同实现。

实现

这里有一些指向已经可用的实现的链接,可供引用。

Redlock-rb ( ruby 实现)。还有一个 Redlock-rb 的分支,它添加了一个 gem 以便于分发,也许还有更多。

Redlock-py (Python 实现)。

Aioredlock (Asyncio Python 实现)。

Redlock-php (PHP implementation).

PHPRedisMutex (further PHP implementation)

Redsync.go (Go implementation).

Redisson (Java implementation).

Redis::DistLock (Perl implementation).

Redlock-cpp (C++ implementation).

Redlock-cs (C#/.NET 实现)。

RedLock.net (C#/.NET 实现)。包括异步和锁定扩展支持。

ScarletLock (C# .NET implementation with configurable datastore)

node-redlock (NodeJS implementation). Includes support for lock extension.

看看这是否有帮助。

关于asp.net-mvc - Microsoft.Web.RedisSessionStateProvider 不保存值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55577365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com