一 redis服务器作用:
1 可以把数据持久化到redis集群磁盘中,Memcached则是存到内存(分布式缓存,不适合保存很重要的东西)
2 可以存储零时、可自动过期的数据
3 注意:Redis的key需要加前缀,防止别人不小心覆盖
二 以windows服务方式安装redis服务:
1 解压redisbin_x32.zip和RedisWatcher1.zip
2 修改RedisWatcher1.zip下的watcher.conf配置文件,exepath和workingdir的路径指向redisbin_x32.zip解压文件夹
3 启动RedisWatcher服务(自动)
三 redis测试:
0 引用redis驱动器
1 初始化一个RedisManager,配置最大最小值和读写服务器
2 获得一个连接client,写入:client.Set<写入数据的类型>(key,value,ExpiresDate);
3 获得一个连接client,读取:数据的类型 value=client.get<数据的类型>(key);
RedisManger.cs
public class RedisManager { public static PooledRedisClientManager ClientManager { get; private set; } //内部可写,外部只能读 static RedisManager() { RedisClientManagerConfig redisConfig = new RedisClientManagerConfig(); redisConfig.MaxWritePoolSize = 128; redisConfig.MaxReadPoolSize = 128; ClientManager = new PooledRedisClientManager(new string[] { "127.0.0.1" }, new string[] { "127.0.0.1" }, redisConfig); //在哪几个ip上进行集群的读写分离操作 } }
Program.cs
class Program { static void Main(string[] args) { /* //写入redis using (IRedisClient client = RedisManager.ClientManager.GetClient()) //从RedisManager的ClientManager获得连接 { client.Set<int>("age", 18, DateTime.Now.AddSeconds(30)); //如果没有设置过期时间,会持久化到集群的磁盘中 client.Set<string>("gender", "男", DateTime.Now.AddSeconds(60)); Dictionary<string, string> dict = new Dictionary<string, string>(); dict["name"] = "东方朔"; client.Set<Dictionary<string, string>>("dict", dict, DateTime.Now.AddMinutes(30)); } */ //读取redis using (IRedisClient client = RedisManager.ClientManager.GetClient()) { int age = client.Get<int>("age"); string gender = client.Get<string>("gender"); Dictionary<string, string> dict = client.Get<Dictionary<string, string>>("dict"); string name = dict["name"]; Console.WriteLine("age={0}/n gender={1}/n dict={2}", age, gender, name); } Console.ReadKey(); } }
四 redis应用:
1 Redis服务器代替数据库存储用户激活码
2 一个用户名只能登陆一次(同一时间一个用户只能在一个session中登录)
//Redis服务器代替数据库存储用户激活码:
public class RedisHelper { /// <summary> /// 把字符串 写入redis服务器 /// </summary> /// <param name="key">redis中的key</param> /// <param name="value">待写入的字符串形式值</param> public static void RedisWriterStr(string key, string value,DateTime expiresdate) { using (IRedisClient client = RedisManager.ClientManager.GetClient()) { client.Set<string>(key, value, expiresdate); } } /// <summary> /// 从redis中 读取指定键的value /// </summary> /// <param name="key">指定键</param> /// <returns>返回指定键的value</returns> public static string RedisReadStr(string key) { using (IRedisClient client = RedisManager.ClientManager.GetClient()) { string value = client.Get<string>(key); return value; } } } public class RedisManager { public static PooledRedisClientManager ClientManager { get; private set; } //内部可写,外部只能读 static RedisManager() { RedisClientManagerConfig redisConfig = new RedisClientManagerConfig(); redisConfig.MaxWritePoolSize = 128; redisConfig.MaxReadPoolSize = 128; ClientManager = new PooledRedisClientManager(new string[] { "127.0.0.1" }, new string[] { "127.0.0.1" }, redisConfig); //在哪几个ip上进行集群的读写分离操作 } }
//同一时间一个用户只能在一个session中登录:
1 每次登陆都会把当前用户作为key,sessionid作为value,存入redis(这样每个用户登陆,都会在redis中记下重新生成的sessionid)
2 在初始化Global时,一旦访问IRequiresSessionState会话,就触发AcquireRequestState事件
3 如果在事件中,当前用户的sessionid与redis中此用户的sessionid不同,则说明该用户已在其他地方登陆,需要自杀。
//1
#region 当前用户的sessionid存入redis //每次登陆,需要把当前用户的sessionid存入redis,(通过每次登陆的sessionid不同,判断该用户是否被顶替) using (IRedisClient client = RedisManager.ClientManager.GetClient()) { client.Set<string>(ConstStringHelper.REDIS_FRONT_USERNAME_SESSIONID_ + username, context.Session.SessionID); } #endregion
//2、3
//在初始化Global时,一旦访问IRequiresSessionState会话,就触发AcquireRequestState事件(获取请求状态) public override void Init() { base.Init(); this.AcquireRequestState += Global_AcquireRequestState; } //同一时间一个用户只能在一个session中登录 void Global_AcquireRequestState(object sender, EventArgs e) { //如果在事件中,当前用户的sessionid与redis中此用户的sessionid不同,则说明该用户已在其他地方登陆,需要自杀。 if(HttpContext.Current.Session==null) { return; //如果没有session,不用进行自杀检测,后面过不了“CheckUserNameIsLogin()” } string username=LoginHelper.GetSessionUserName(HttpContext.Current); if(username==null) { return; //后面过不了“CheckUserNameIsLogin()” } using(IRedisClient client=RedisManager.ClientManager.GetClient()) { string redissessionid = client.Get<string>(ConstStringHelper.REDIS_FRONT_USERNAME_SESSIONID_ + username); if(redissessionid!=null && redissessionid!=HttpContext.Current.Session.SessionID) //说明同时在其他地方登陆了,需要自杀 { HttpContext.Current.Session.Clear(); HttpContext.Current.Session.Abandon(); } } }