• Redis服务器


    一  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();
                    }
                }
            }
  • 相关阅读:
    解决使用OCI连接oracle LNK2019: 无法解析的外部符号的问题
    VS2010下配置OCI编程
    OpenLayers简单介绍以及简单实例
    浏览器的标准模式与怪异模式的设置与区分方法
    解决ie7不支持after、before的方法
    ie7兼容after、before的方法
    【移动端适配】适配1个像素的border
    js实现对table的增加行和删除行的操作
    css3线性渐变:linear-gradient
    使用iScroll实现上、下滑动刷新和加载更多数据
  • 原文地址:https://www.cnblogs.com/adolphyang/p/4935230.html
Copyright © 2020-2023  润新知