首页 > 数据库 >Redis--分布式中实现Session共享(一)

Redis--分布式中实现Session共享(一)

时间:2023-05-05 22:31:48浏览次数:47  
标签:set Console -- redis Redis client Session WriteLine


上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享"。这篇文章将会介绍如何使用Redis,下一篇在此基础上实现Session。

  这里特别说明一下,其实没有必要使用Redis来解决Session共享。Asp.net提供了StateServer模式来共享Session,这里重复造轮子的目的1:熟悉Redis的基本知识和使用 2.学习和巩固Session的实现原理。

  3.学习Redis应用场景

阅读目录

  • Redis安装配置
  • 五种数据类型使用
  • 封装拓展
  • 总结

回到顶部



Redis安装配置

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  最新版本的redis版本为3.0.3,支持集群功能。我这下载的是window版本的,实际场景都是安装在linux系统下的。下载地址:redis-2.8.19.rar 。更多下载地址: 



    官网 : http://redis.io/download  MSOpenTech: https://github.com/MSOpenTech/redis  dmajkic: https://github.com/dmajkic/redis/downloads



    下载完成之后解压运行redis-server.exe就启动了redis了,启动后会在进程里面看到reids。

Redis--分布式中实现Session共享(一)_memcached

   1.读写分离配置

   redis的读写分离需要修改配置文件,把解压的文件复制了一份。两份文件是一样的,分别命名为MasterRedis-2.8.19(主redis服务),SlaveRedis-2.8.19(从redis服务)。redis默认绑定的是6379端口,

 我们保持主服务配置不变,修改从服务配置。

 

Redis--分布式中实现Session共享(一)_Redis_02

  • 修改从服务绑定端口(修改时可以直接搜索port关键字)

Redis--分布式中实现Session共享(一)_memcached_03

  • 修改从服务对应的主服务地址(修改时可以直接搜索slaveof关键字)

 

Redis--分布式中实现Session共享(一)_数据库_04

  • 配置文件修改完成以后,分别启动主服务和从服务

  

Redis--分布式中实现Session共享(一)_Redis_05

Redis--分布式中实现Session共享(一)_redis_06

     从服务启动以后,主服务会发送一条同步的sync命令,同步从服务器的缓存数据。


回到顶部


五种数据类型使用

   服务搭建好以后可以使用.net版本redis操作类库ServiceStack.Redis来操作redis,本文会用到以下三个dll。

Redis--分布式中实现Session共享(一)_Redis_07

  初始化RedisClient对象


var client = new RedisClient("120.26.197.185", 6379);


 

1.String

    String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY命令让这些变得很容易,通过原子递增保持计数。  



#region "字符串类型"
client.Set<string>("name", "laowang");
string userName = client.Get<string>("name");
Console.WriteLine(userName);

//访问次数
client.Set<int>("IpAccessCount", 0);
//次数递增
client.Incr("IpAccessCount");
Console.WriteLine(client.Get<int>("IpAccessCount"));
#endregion



Redis--分布式中实现Session共享(一)_memcached_08

2.Hash

一个hashid可以存储多项信息,每一项信息也有自己的key


client.SetEntryInHash("userInfoId", "name", "zhangsan");
client.SetEntryInHash("userInfoId", "name1", "zhangsan1");
client.SetEntryInHash("userInfoId", "name2", "zhangsan2");
client.SetEntryInHash("userInfoId", "name3", "zhangsan3");
client.GetHashKeys("userInfoId").ForEach(e => Console.WriteLine(e));
client.GetHashValues("userInfoId").ForEach(e => Console.WriteLine(e));


Redis--分布式中实现Session共享(一)_php_09

3.List

  应用场景:  

  •  Redis list的应用场景非常多,也是Redis最重要的数据结构之一。  
  •  我们可以轻松地实现最新消息排行等功能。  
  •  Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。  


#region "List类型"

client.AddItemToList("userInfoId1", "123");
client.AddItemToList("userInfoId1", "1234");

Console.WriteLine("List数据项条数:" + client.GetListCount("userInfoId1"));
Console.WriteLine("List数据项第一条数据:" + client.GetItemFromList("userInfoId1", 0));
Console.WriteLine("List所有数据");
client.GetAllItemsFromList("userInfoId1").ForEach(e => Console.WriteLine(e));
#endregion

#region "List类型做为队列和栈使用"
Console.WriteLine(client.GetListCount("userInfoId1"));
//队列先进先出
//Console.WriteLine(client.DequeueItemFromList("userInfoId1"));
//Console.WriteLine(client.DequeueItemFromList("userInfoId1"));

//栈后进先出
Console.WriteLine("出栈"+client.PopItemFromList("userInfoId1"));
Console.WriteLine("出栈"+client.PopItemFromList("userInfoId1"));
#endregion



Redis--分布式中实现Session共享(一)_Redis_10

4.Set

  应用场景:  

  • Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。  
  • 比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。  
  • Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实  


client.AddItemToSet("A", "B");
client.AddItemToSet("A", "C");
client.AddItemToSet("A", "D");
client.AddItemToSet("A", "E");
client.AddItemToSet("A", "F");

client.AddItemToSet("B", "C");
client.AddItemToSet("B", "F");

//求差集
Console.WriteLine("A,B集合差集");
client.GetDifferencesFromSet("A", "B").ToList<string>().ForEach(e => Console.Write(e + ","));

//求集合交集
Console.WriteLine("\nA,B集合交集");
client.GetIntersectFromSets(new string[] { "A", "B" }).ToList<string>().ForEach(e => Console.Write(e + ","));

//求集合并集
Console.WriteLine("\nA,B集合并集");
client.GetUnionFromSets(new string[] { "A", "B" }).ToList<string>().ForEach(e => Console.Write(e + ","));



Redis--分布式中实现Session共享(一)_数据库_11

5.Sort Set(排序)

  应用场景:

  • 以某个条件为权重,比如按顶的次数排序.  
  • ZREVRANGE命令可以用来按照得分来获取前100名的用户,ZRANK可以用来获取用户排名,非常直接而且操作容易。  
  • Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。  
  • 比如:twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。  
  • 比如:全班同学成绩的SortedSets,value可以是同学的学号,而score就可以是其考试得分,这样数据插入集合的,就已经进行了天然的排序。  
  • 另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。  


#region "有序Set操作"
client.AddItemToSortedSet("SA", "B", 2);
client.AddItemToSortedSet("SA", "C", 1);
client.AddItemToSortedSet("SA", "D", 5);
client.AddItemToSortedSet("SA", "E", 3);
client.AddItemToSortedSet("SA", "F", 4);

//有序集合降序排列
Console.WriteLine("\n有序集合降序排列");
client.GetAllItemsFromSortedSetDesc("SA").ForEach(e => Console.Write(e + ","));
Console.WriteLine("\n有序集合升序序排列");
client.GetAllItemsFromSortedSet("SA").ForEach(e => Console.Write(e + ","));

client.AddItemToSortedSet("SB", "C", 2);
client.AddItemToSortedSet("SB", "F", 1);
client.AddItemToSortedSet("SB", "D", 3);

Console.WriteLine("\n获得某个值在有序集合中的排名,按分数的升序排列");
Console.WriteLine(client.GetItemIndexInSortedSet("SB", "D"));

Console.WriteLine("\n获得有序集合中某个值得分数");
Console.WriteLine(client.GetItemScoreInSortedSet("SB", "D"));

Console.WriteLine("\n获得有序集合中,某个排名范围的所有值");
client.GetRangeFromSortedSet("SA", 0, 3).ForEach(e => Console.Write(e + ","));

#endregion



Redis--分布式中实现Session共享(一)_php_12


回到顶部


封装拓展

PooledRedisClientManager连接池来获取RedisClient,同时用到了读写分离的概念,可以直接拿来使用


Redis--分布式中实现Session共享(一)_数据库_13

  View Code

 使用很简单,几行代码


//会往主服务里面写入
RedisBase.Hash_Set<string>("PooledRedisClientManager", "one", "123"); //从服务里面读取信息 RedisBase.Hash_Get<string>("PooledRedisClientManager", "one");


   连接池的初始化



private static string[] ReadWriteHosts = System.Configuration.ConfigurationSettings.AppSettings["readWriteHosts"].Split(new char[] { ';' }); private static string[] ReadOnlyHosts = System.Configuration.ConfigurationSettings.AppSettings["readOnlyHosts"].Split(new char[] { ';' }); #region -- 连接信息 -- public static PooledRedisClientManager prcm = CreateManager(ReadWriteHosts, ReadOnlyHosts); private static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts) { // 支持读写分离,均衡负载 return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig { MaxWritePoolSize = 5, // “写”链接池链接数 MaxReadPoolSize = 5, // “读”链接池链接数 AutoStart = true, }); }



  配置文件

Redis--分布式中实现Session共享(一)_memcached_14


回到顶部


总结

  1.其实php,java等多种语言都能使用redis,在我接触的项目中见到使用redis做为消息队列和缓存组件,当然它的功能远不止于此。后面的文章将详细介绍redis的几个使用案例。

      2.可以使用redis desktop manager管理工具查看服务器缓存中的数据

Redis--分布式中实现Session共享(一)_memcached_15

      本篇文章用到的资源打包下载地址:redis_demo

  svn下载地址:http://code.taobao.org/svn/ResidSessionDemo/

标签:set,Console,--,redis,Redis,client,Session,WriteLine
From: https://blog.51cto.com/iwtxokhtd/6247975

相关文章

  • 电脑技巧:微软官方推出的几款实用工具,值得推荐
    今天给大家微软官方推出的几款实用工具,可以大大提升你的办公效率,赶快来下载吧!1、系统增强工具PowerToysPowerToys是一款来自微软官方的针对Windows系统增强工具,它就像是一个神奇的系统工具,该软件包括:“屏幕取色器”、“桌面窗口分布”、“快速预览插件”、“批量图片缩放器”、“......
  • 每周打卡 第二(?)周 5
       #include<cstring>#include<cstdio>#include<iostream>#include<algorithm>usingnamespacestd;constintN=30;intm,n;intst[N];boola[N];voidf(intu,intt){if(u>m){for(inti=1;i<=m;i++)......
  • 实现WPF主题配色切换
    直接上代码publicvoidChangeColorStyle(){ResourceDictionaryresource=newResourceDictionary();for(inti=0;i<Appliation.Current.Resources.MegedDictionaries.Count;i++){if(Appliation.Current.Resources.MegedDictionaries[i].Source!=null)......
  • 5.5 2.4
    一、问题描述一个口袋中有12个球,已知其中三个是红的,3个是白的,6个是黑的,现从中任取8个,问共有多少颜色搭配。二、分析8个红球中,m个红球,n个白球,黑球为8-n-m个。m[0,3]  n[0,3]   8-n-m<=6 三、代码#include<iostream>usingnamespacestd;intmain(){intm=0;//......
  • Day15
      3.代码示例#include<iostream>usingnamespacestd;intmain(){ inti,j,s=11; for(i=4;i>0;i--){ s=(s+1)*(i+1)/i-1; } cout<<"鱼缸中共有"<<s<<"条鱼"; return0;}4.结果输出 ......
  • 金仓数据库KingbaseES 两表关联Update的两种写法与性能
    原文链接:https://blog.csdn.net/arthemis_14/article/details/127886142熟悉oracle的人都知道,对于两表的关联更新,其执行计划主要有Filter和OuterJoin两种方式。对于大批量数据的update,Join方式明显是更优的选择。KingbaseES也支持两种方式的关联update,语法上采用两种不同......
  • mongodb使用and配合or查询
    使用mongodb时,有时需要使用and配合(嵌套)or查询。实现类似以下sql的语句:select*fromMongoDbTestwherestatus=1and(userId="abc"orprice>=2)对应的mongodb语句如下:db.getCollection("mongoDbTest").find({"status":1,"$and":[{"$or&q......
  • 自定义mybatis插件之全局数据过滤
    目录一、介绍二、实现三、效果四、源码一、介绍通过开发mybatis的插件来实现对全局的sql查询语句进行拦截,并新增全局的过滤条件做到无感知的数据过滤,比如全局过滤某个租户的数据。二、实现实现思路1、通过mybatis的拦截器拦截所有查询的sql2、使用Druid里面的工具类解析sq......
  • Error:All flavors must now belong to a named flavor dimension. Learn more at
    {https://blog.csdn.net/qq_15807167/article/details/79528063}  这是plugin3.0.0之后有一种自动匹配消耗库的机制,便于debugvariant自动消耗一个库,然后就是必须要所有的flavor都属于同一个维   defaultConfig{ targetSdkVersion:*** minSdkVersion:*** versi......
  • Unity 2019中对象池的用法
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassExamplePool:MonoBehaviour{privateObjectPool<GameObject>objectPool;publicGameObjectobjectType;publicintpoolSize=10;voidStart()......