AdolphYang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

一  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上进行集群的读写分离操作

        }
    }
RedisHelper.cs

 

  //同一时间一个用户只能在一个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();
                }
            }
        }

 

posted on 2015-11-04 10:31  AdolphYang  阅读(768)  评论(0编辑  收藏  举报