我想使用Redis实例来识别重复记录。
任何记录都可以通过两个功能来识别,第一个功能是字符串的哈希。第二个特征是哈希数组。因此,如果新的记录与其字符串哈希匹配,或者哈希数组中的任何元素存在于另一个元素的另一个数组中,则认为该记录是重复的。
示例:
记录1:
Id: 1, feature 1: ABC, feature 2: [aa,bb,cc]
记录2:
Id 2, feature 1: ABC, feature 2: []
--->
与记录1重复
记录3:
Id 3, feature 1: DDA, feature 2: [ff,bd,aa]
-->
与记录1重复(在aa
上匹配)
我想知道如何以最有效的方式使用Redis来执行此类操作。
由于
答案 0 :(得分:1)
您可以为每个功能构建从功能到记录ID的索引映射。
第一个指数
记录ID的哈希字符串。该索引的所有键都有一个键前缀: fea1:
set fea1:ABC 1
第二个指数
要记录ID的哈希数组的元素。此索引的所有键都有一个键前缀: fea2:
set fea2:aa 1
set fea2:bb 1
set fea2:cc 1
重复识别
使用第一个功能(即哈希字符串)构建密钥,然后搜索第一个索引:
exists fea1:ABC
exists fea1:DDA
如果它不存在于第一个索引中,则使用第二个功能构建密钥,并搜索第二个索引:
exists fea2:ff
exists fea2:bd
exists fea2:aa
修改强>
从Redis 3.0.3开始,exists
命令可以检查是否存在多个密钥。因此,您只需使用1次redis命令调用即可搜索第二个索引:
exists fea2:ff fea2:bd fea2:aa
答案 1 :(得分:0)
您也可以使用集 - 请参阅http://redis.io/commands/sadd
对于SADD feature2 aa bb cc
开始的第一个特征,SADD将返回添加到集合中的元素数量,不包括已经存在于集合中的所有元素
因此,如果该值小于您尝试添加的值的数量,那么您将重复。
对第二个功能执行相同操作
[HttpPost]
public ActionResult Login(UserAccount user)
{
using (OurDbContext db = new OurDbContext())
{
var usr = db.userAccount.Single(u => u.Username == user.Username && u.Password == user.Password);
if(usr != null)
{
Session["UserID"] = usr.UserID.ToString();
Session["Username"] = usr.Username.ToString();
return RedirectToAction("LoggedIn");
}else
{
ModelState.AddModelError("", "Username or Password is wrong");
}
}
return View();
}