diff --git a/README.md b/README.md
index 26b6c1e..43fc402 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# RedisStudy
-Redis 缓存学习
\ No newline at end of file
+Redis 缓存学习, 使用StackExchange.Redis。
+命令参考网址 http://www.redis.net.cn
\ No newline at end of file
diff --git a/RedisStudyTest/RedisHashStudyTest.cs b/RedisStudyTest/RedisHashStudyTest.cs
index d76759f..9c5071b 100644
--- a/RedisStudyTest/RedisHashStudyTest.cs
+++ b/RedisStudyTest/RedisHashStudyTest.cs
@@ -3,24 +3,30 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using StackExchange.Redis;
using Xunit;
+using Xunit.Extensions;
+using Xunit.Serialization;
+using Xunit.Abstractions;
+using Xunit.Sdk;
using RedisStudyModel;
-
-using StackExchange;
-using StackExchange.Redis;
-
using RedisStuy;
namespace RedisStudyTest
{
+ ///
+ /// Redis Hash 类型测试
+ ///
public class RedisHashStudyTest : IDisposable
{
+ #region 初始化
private IDatabase redisDatabase = null;
private RedisHashStudy hashStudy = null;
private List students;
private Student student = null;
private string preHashKey = "RedisStudy:Student:";
+ private int keyExpireSeconds = 20;
///
/// 构造
@@ -69,9 +75,15 @@ namespace RedisStudyTest
},
};
- //hashStudy.AddStudents(students);
+ DeleteExitsStudents();
}
+ #endregion
+ #region 添加或更新学生
+
+ ///
+ /// 参数异常 测试
+ ///
[Fact]
public void AddStudentExceptionTest()
{
@@ -84,13 +96,14 @@ namespace RedisStudyTest
}
///
- /// When参数测试
+ /// 参数 When 测试
///
[Fact]
public void AddStudentWhenTest()
{
string redisKey = preHashKey + student.Id;
- //When.NotExists 当前上下文无效
+
+ //当前上下文不能使用: When.Exists
var id_When_NotExists_No = hashStudy.HashSet(redisKey, "Id", student.Id + 1, When.NotExists);
Assert.True(id_When_NotExists_No);
@@ -98,21 +111,16 @@ namespace RedisStudyTest
var id_When_NotExists_Yes = hashStudy.HashSet(redisKey, "Id", student.Id + 1, When.NotExists);
Assert.False(id_When_NotExists_Yes);
- //字段存在,执行成功返回false
- var id_When_Always_Exists = hashStudy.HashSet(redisKey, "Id", student.Id + 5, When.Always);
+ var id_When_Always_Exists = hashStudy.HashSet(redisKey, "Id", student.Id + 1, When.Always);
Assert.False(id_When_Always_Exists);
- //字段不存在,执行成功返回true
var id_When_Always_NotExists = hashStudy.HashSet(redisKey, "Id4", student.Id + 1, When.Always);
Assert.True(id_When_Always_NotExists);
}
- [Fact]
- public void AddStudentCommandFlagTest()
- {
- string redisKey = preHashKey + student.Id;
- }
-
+ ///
+ /// 添加一个默认学生 测试
+ ///
[Fact]
public void AddStudentTest()
{
@@ -129,96 +137,219 @@ namespace RedisStudyTest
Assert.True(addHash);
//设置过期
- redisDatabase.KeyExpire(redisKey, TimeSpan.FromSeconds(5));
+ redisDatabase.KeyExpire(redisKey, TimeSpan.FromSeconds(keyExpireSeconds));
}
///
- /// 更新学生异常测试
+ /// 添加一组初始化设置的学生 测试
///
[Fact]
- public void UpdateStudentExceptionTest()
+ public void AddStudentsTest()
{
- string redisKey = preHashKey + student.Id;
- //不存在Key
- Assert.Throws(()=> hashStudy.HashSet(string.Empty, "Id", -1));
+ foreach (var temp in students)
+ {
+ string redisKey = preHashKey + temp.Id;
+ var studentEntries = new HashEntry[]
+ {
+ new HashEntry("Id", temp.Id),
+ new HashEntry("Name", temp.Name),
+ new HashEntry("Age", temp.Age),
+ };
+
+ //插入Sudent
+ var addStudent = hashStudy.HashSet(redisKey, studentEntries);
+ Assert.True(addStudent);
+
+ //设置过期
+ redisDatabase.KeyExpire(redisKey, TimeSpan.FromSeconds(keyExpireSeconds));
+ }
}
+
///
- /// 更新学生
+ /// 添加或更新字段 测试
///
- [Theory]
- [InlineData("Id", 1)]
- [InlineData("Name",1)]
- [InlineData("Age",1)]
- public void UpdateStudentTest(RedisValue fieldName, RedisValue value)
+ [Fact]
+ public void SetStudentTest()
{
- string redisKey = preHashKey + student.Id;
- var addOrUpdateOne = hashStudy.HashSet(redisKey, fieldName, value+1);
- Assert.True(addOrUpdateOne);
- addOrUpdateOne = hashStudy.HashSet(redisKey, "Name", student.Name + 1);
- Assert.True(addOrUpdateOne);
- addOrUpdateOne = hashStudy.HashSet(redisKey, "Age", student.Age + 1);
- Assert.True(addOrUpdateOne);
+ Assert.True(hashStudy.HashSet(preHashKey + student.Id, "Id", student.Id));
+ Assert.False(hashStudy.HashSet(preHashKey + student.Id, "Id", student.Id));
+
+ Assert.True(hashStudy.HashSet(preHashKey + student.Id, "Name", student.Name));
+ Assert.False(hashStudy.HashSet(preHashKey + student.Id, "Name", student.Name));
+
+ Assert.True(hashStudy.HashSet(preHashKey + student.Id, "Age", student.Age));
+ Assert.False(hashStudy.HashSet(preHashKey + student.Id, "Age", student.Age));
}
- [Theory]
- [InlineData(-1)]
- [InlineData(-2)]
- [InlineData(-3)]
- public void DelStudentTest(int studentId)
+ ///
+ /// 添加或更新字段 测试
+ ///
+ [Fact]
+ public void SetStudentTest2()
{
- Assert.False(redisDatabase.KeyDelete(preHashKey + studentId));
+ Assert.True(hashStudy.HashSet(preHashKey + student.Id, "Id", student.Id));
+ Assert.False(hashStudy.HashSet(preHashKey + student.Id, "Id", student.Id + 1));
+
+ var entrys=new HashEntry[]
+ {
+ new HashEntry("Name", student.Name),
+ new HashEntry("Age", student.Age),
+ };
+
+ var entrys2 = new HashEntry[]
+ {
+ new HashEntry("Name", student.Name+"2"),
+ new HashEntry("Age", student.Age+1),
+ };
+
+ Assert.True(hashStudy.HashSet(preHashKey + student.Id, entrys));
+ Assert.True(hashStudy.HashSet(preHashKey + student.Id, entrys2));
+ }
+
+ ///
+ /// 特例:Hash表键名为""(空字符串)
+ /// 结果:添加或更新操作能成功,但是字段值插入不进去。
+ ///
+ [Fact]
+ public void SetStudentEmptyKeyTest()
+ {
+ Assert.True(hashStudy.HashSet(string.Empty, "Name", "wanggaofeng"));
+ redisDatabase.KeyDelete(string.Empty);
}
- [Theory]
- [InlineData(-100)]
- public void DelStudentTest2(int studentId)
+ ///
+ /// 特例:Hash表,字段名为""(空字符串)
+ /// 结果:添加或更新操作正常,只是字段键名为""
+ ///
+ [Fact]
+ public void SetStudentEmptyFieldTest()
{
- Assert.False(redisDatabase.KeyDelete(preHashKey + studentId));
+ Assert.True(hashStudy.HashSet(preHashKey + student.Id, "", student.Id));
+ Assert.False(hashStudy.HashSet(preHashKey + student.Id, "", student.Id+1));
+
+ redisDatabase.KeyDelete(preHashKey + student.Id);
}
+ #endregion
+
+ #region 获取
+
+ ///
+ /// 获取一个学生
+ ///
[Fact]
- public void QueryOneStudentTest()
+ public void GetOneSutdentTest()
{
- //hashStudy.AddStudent(this.student);
+ string redisKey = preHashKey + student.Id;
+ var studentEntries = new HashEntry[]
+ {
+ new HashEntry("Id",1),
+ new HashEntry("Name",student.Name),
+ new HashEntry("Age",student.Age),
+ };
+
+ //插入Sudent
+ var addHash = hashStudy.HashSet(redisKey, studentEntries);
+ Assert.True(addHash);
+
+ var entries = hashStudy.HashGetAll(redisKey);
- //var queryStudent = hashStudy.QueryOneStudent(this.student.Id);
+ Assert.NotNull(entries);
- //Assert.NotNull(queryStudent);
- //Assert.True(this.student.Id==queryStudent.Id);
- //Assert.True(this.student.Name == queryStudent.Name);
- //Assert.True(this.student.Age == queryStudent.Age);
+ Student myStudent = new Student()
+ {
+ Id = (int)entries.FirstOrDefault(e=>e.Name=="Id").Value,
+ Name = entries.FirstOrDefault(e => e.Name == "Name").Value,
+ Age = (int)entries.FirstOrDefault(e => e.Name == "Age").Value,
+ };
+
+ Assert.True(myStudent.Id==student.Id && myStudent.Name==student.Name && myStudent.Age==student.Age);
+
+ }
+
+ [Fact]
+ public void GetId()
+ {
+ string redisKey = preHashKey + student.Id;
+
+ Assert.NotEqual(student.Id, hashStudy.HashGet(redisKey,"Id"));
+
+ AddDefaultStudent();
+ Assert.Equal(1, hashStudy.HashGet(redisKey, "Id"));
+ }
+
+ [Fact]
+ public void GetName()
+ {
+ string redisKey = preHashKey + student.Id;
+
+ Assert.NotEqual(student.Name, hashStudy.HashGet(redisKey, "Name").ToString());
+
+ AddDefaultStudent();
+ Assert.Equal(student.Name, hashStudy.HashGet(redisKey, "Name"));
}
[Fact]
- public void ExistStudentTest()
+ public void GetAge()
{
- //Assert.True(hashStudy.ExistStudent(students[0].Id));
- //Assert.True(hashStudy.ExistStudent(students[1].Id));
- //Assert.True(hashStudy.ExistStudent(students[2].Id));
- //Assert.True(hashStudy.ExistStudent(students[3].Id));
- //Assert.True(hashStudy.ExistStudent(students[4].Id));
-
- //Assert.False(hashStudy.ExistStudent(-1000));
- //Assert.False(hashStudy.ExistStudent(-2000));
+ string redisKey = preHashKey + student.Id;
+
+ Assert.NotEqual(student.Age, hashStudy.HashGet(redisKey, "Age"));
+
+ AddDefaultStudent();
+ Assert.Equal(student.Age, hashStudy.HashGet(redisKey, "Age"));
}
///
- /// 查询所有学生
+ /// 指定字段是否存在
///
[Fact]
- public void QueryAllStudent()
+ public void ExistStudent()
{
- //List students = hashStudy.QueryAllStudents();
+ string redisKey = preHashKey + student.Id;
+ var studentEntries = new HashEntry[]
+ {
+ new HashEntry("Id",1),
+ new HashEntry("Name",student.Name),
+ };
+
+ //插入Sudent
+ var addHash = hashStudy.HashSet(redisKey, studentEntries);
+ Assert.True(addHash);
+
+ Assert.True(hashStudy.HashExists(redisKey, "Id"));
+ Assert.True(hashStudy.HashExists(redisKey, "Name"));
+ Assert.False(hashStudy.HashExists(redisKey, "Age"));
+ }
+
+ #endregion
- //Assert.NotNull(students);
- //Assert.Equal(students.Count(), students.Count);
+ #region 删除学生
+
+ ///
+ /// 删除学生
+ ///
+ [Fact]
+ public void DeleteStudent()
+ {
+ Assert.False(redisDatabase.KeyDelete(preHashKey + "-2000"));
}
+ #endregion
+
///
/// 清理
///
public void Dispose()
+ {
+ DeleteExitsStudents();
+ }
+
+ ///
+ /// 删除Redis中的测试学生
+ ///
+ private void DeleteExitsStudents()
{
if (student != null)
{
@@ -231,56 +362,18 @@ namespace RedisStudyTest
}
}
- #region 辅助方法
- public HashEntry[] StudentsToHashEntrys(Student student)
+ private void AddDefaultStudent()
{
- if (student == null)
- {
- return null;
- }
-
- var entrys = new List()
+ string redisKey = preHashKey + student.Id;
+ var studentEntries = new HashEntry[]
{
- new HashEntry("Id",student.Id),
+ new HashEntry("Id",1),
new HashEntry("Name",student.Name),
new HashEntry("Age",student.Age),
};
- return entrys.ToArray();
- }
-
- public Student HashEntrysToStudent(HashEntry[] hashEntrys)
- {
- if (hashEntrys == null)
- {
- return null;
- }
-
- if (hashEntrys.Length <= 0)
- {
- return null;
- }
-
- var student = new Student();
- foreach (var entry in hashEntrys)
- {
- switch (entry.Name)
- {
- case "Id":
- student.Id = entry.Value.IsInteger ? (int)entry.Value : default(int); ;
- break;
- case "Name":
- student.Name = entry.Value.ToString();
- break;
- case "Age":
- student.Age = entry.Value.IsInteger ? (int)entry.Value : default(int);
- break;
- default:
- break;
- }
- }
- return student;
+ //插入Sudent
+ var addHash = hashStudy.HashSet(redisKey, studentEntries);
}
- #endregion
}
}
diff --git a/RedisStudyTest/RedisHashStudyTest22.cs b/RedisStudyTest/RedisHashStudyTest22.cs
new file mode 100644
index 0000000..64af6d9
--- /dev/null
+++ b/RedisStudyTest/RedisHashStudyTest22.cs
@@ -0,0 +1,196 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+using RedisStudyModel;
+
+using StackExchange;
+using StackExchange.Redis;
+
+using RedisStuy;
+
+namespace RedisStudyTest
+{
+ public class RedisHashStudyTest : IDisposable
+ {
+ private IDatabase redisDatabase = null;
+ private RedisHashStudy hashStudy = null;
+ private List students;
+ private Student student = null;
+ private string preHashKey = "RedisStudy:Student:";
+
+ ///
+ /// 构造
+ ///
+ public RedisHashStudyTest()
+ {
+ redisDatabase = RedisHelper.GetRedisDatabase();
+ hashStudy = new RedisHashStudy();
+ student = new Student()
+ {
+ Id = 1,
+ Name = "王高峰",
+ Age = 2 * 9
+ };
+ students = new List()
+ {
+ new Student()
+ {
+ Id = 1001,
+ Name = "王高峰",
+ Age = 11
+ },
+ new Student()
+ {
+ Id = 1002,
+ Name = "王高峰2",
+ Age = 22
+ },
+ new Student()
+ {
+ Id = 1003,
+ Name = "王高峰3",
+ Age = 33
+ },
+ new Student()
+ {
+ Id = 1004,
+ Name = "王高峰4",
+ Age = 44
+ },
+ new Student()
+ {
+ Id = 1005,
+ Name = "王高峰5",
+ Age = 55
+ },
+ };
+
+ //hashStudy.AddStudents(students);
+ }
+
+ [Fact]
+ public void AddStudentExceptionTest()
+ {
+ string redisKey = preHashKey + student.Id;
+ //参数异常测试
+ Assert.Throws(() => hashStudy.HashSet(string.Empty, null));
+ Assert.Throws(() => hashStudy.HashSet("", null));
+ Assert.Throws(() => hashStudy.HashSet(preHashKey + "-1", null));
+ Assert.Throws(() => hashStudy.HashSet(preHashKey + "-1", new HashEntry[] { }));
+ }
+
+ [Fact]
+ public void AddStudentWhenTest()
+ {
+ string redisKey = preHashKey + student.Id;
+
+ var id_When_NotExists_No = hashStudy.HashSet(redisKey, "Id", student.Id + 1, When.NotExists);
+ Assert.True(id_When_NotExists_No);
+
+ var id_When_NotExists_Yes = hashStudy.HashSet(redisKey, "Id2", student.Id + 1, When.NotExists);
+ Assert.False(id_When_NotExists_Yes);
+
+ var id_When_Exists_Yes = hashStudy.HashSet(redisKey, "Id", student.Id + 1, When.Exists);
+ Assert.True(id_When_Exists_Yes);
+
+ var id_When_Exists_No = hashStudy.HashSet(redisKey, "Id3", student.Id + 1, When.Exists);
+ Assert.False(id_When_Exists_No);
+
+ var id_When_Always_Exists = hashStudy.HashSet(redisKey, "Id", student.Id + 1, When.Always);
+ Assert.True(id_When_Always_Exists);
+
+ var id_When_Always_NotExists = hashStudy.HashSet(redisKey, "Id4", student.Id + 1, When.Always);
+ Assert.True(id_When_Always_NotExists);
+ }
+
+ [Fact]
+ public void AddStudentCommandFlagTest()
+ {
+ string redisKey = preHashKey + student.Id;
+ }
+
+ [Fact]
+ public void AddStudentTest()
+ {
+ string redisKey = preHashKey + student.Id;
+ var studentEntries = new HashEntry[]
+ {
+ new HashEntry("Id",1),
+ new HashEntry("Name",student.Name),
+ new HashEntry("Age",student.Age),
+ };
+
+ //插入Sudent
+ var addHash = hashStudy.HashSet(redisKey, studentEntries, CommandFlags.None);
+ Assert.True(addHash);
+
+ //设置过期
+ redisDatabase.KeyExpire(redisKey, TimeSpan.FromSeconds(5));
+ }
+
+ ///
+ /// 更新学生异常测试
+ ///
+ [Fact]
+ public void UpdateStudentExceptionTest()
+ {
+ string redisKey = preHashKey + student.Id;
+ //不存在Key
+ Assert.Throws(()=> hashStudy.HashSet(string.Empty, "Id", -1));
+ }
+
+ ///
+ /// 更新学生:导致测试不能运行
+ ///
+ [Theory]
+ [InlineData("Id", 1)]
+ [InlineData("Name",1)]
+ [InlineData("Age",1)]
+ public void UpdateStudentTest(RedisValue fieldName, RedisValue value)
+ {
+ string redisKey = preHashKey + student.Id;
+ var addOrUpdateOne = hashStudy.HashSet(redisKey, fieldName, value+1);
+ Assert.True(addOrUpdateOne);
+ addOrUpdateOne = hashStudy.HashSet(redisKey, "Name", student.Name + 1);
+ Assert.True(addOrUpdateOne);
+ addOrUpdateOne = hashStudy.HashSet(redisKey, "Age", student.Age + 1);
+ Assert.True(addOrUpdateOne);
+ }
+
+ [Theory]
+ [InlineData(-1)]
+ [InlineData(-2)]
+ [InlineData(-3)]
+ public void DelStudentTest(int studentId)
+ {
+ Assert.False(redisDatabase.KeyDelete(preHashKey + studentId));
+ }
+
+ [Theory]
+ [InlineData(-100)]
+ public void DelStudentTest2(int studentId)
+ {
+ Assert.False(redisDatabase.KeyDelete(preHashKey + studentId));
+ }
+
+ ///
+ /// 清理
+ ///
+ public void Dispose()
+ {
+ if (student != null)
+ {
+ redisDatabase.KeyDelete(preHashKey + student.Id);
+ }
+
+ foreach (var temp in students)
+ {
+ redisDatabase.KeyDelete(preHashKey + temp.Id);
+ }
+ }
+ }
+}
diff --git a/RedisStudyTest/RedisStudyTest.cs b/RedisStudyTest/RedisStudyTest.cs
index 093130e..0be3440 100644
--- a/RedisStudyTest/RedisStudyTest.cs
+++ b/RedisStudyTest/RedisStudyTest.cs
@@ -14,22 +14,20 @@ namespace RedisStudyTest
{
public class RedisStudyTest
{
- private IServer redisServer;
- private RedisServerStudy redisServerStudy;
+ private RedisServerStudy _redisServerStudy;
public RedisStudyTest()
{
- redisServer = RedisHelper.GetDefaultRedisServer();
- redisServerStudy = new RedisServerStudy();
+ _redisServerStudy = new RedisServerStudy();
}
[Fact]
public void Test()
{
- var info= redisServerStudy.RedisInfo();
+ var info = _redisServerStudy.RedisInfo();
Assert.NotEmpty(info);
- Assert.True(info.Count()>0);
+ Assert.True(info.Any());
}
}
}
diff --git a/RedisStudyTest/RedisStudyTest.csproj b/RedisStudyTest/RedisStudyTest.csproj
index cbeda78..b1bb9f9 100644
--- a/RedisStudyTest/RedisStudyTest.csproj
+++ b/RedisStudyTest/RedisStudyTest.csproj
@@ -74,10 +74,10 @@
+
-
diff --git a/RedisStuy/RedisHashStudy.cs b/RedisStuy/RedisHashStudy.cs
index 4723599..9d60594 100644
--- a/RedisStuy/RedisHashStudy.cs
+++ b/RedisStuy/RedisHashStudy.cs
@@ -141,7 +141,8 @@ namespace RedisStuy
///
public bool HashSet(RedisKey key, RedisValue hashField, RedisValue value, When when = When.Always, CommandFlags flags = CommandFlags.None)
{
- return redisDatabase.HashSet(key, hashField, value, when, flags);
+ var result = redisDatabase.HashSet(key, hashField, value, when, flags);
+ return result;
}
///
@@ -166,11 +167,11 @@ namespace RedisStuy
throw new ArgumentNullException("hashFields", "参数hashFields.Length ");
}
- redisDatabase.HashSet(key, hashFields, flags);
+
bool result = false;
try
{
-
+ redisDatabase.HashSet(key, hashFields, flags);
result = true;
}
catch (ArgumentNullException argumentNullException)