上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享"。这篇文章将会介绍如何使用Redis,下一篇在此基础上实现Session。
这里特别说明一下,其实没有必要使用Redis来解决Session共享。Asp.net提供了StateServer模式来共享Session,这里重复造轮子的目的1:熟悉Redis的基本知识和使用 2.学习和巩固Session的实现原理。
3.学习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 。更多下载地址:
下载完成之后解压运行redis-server.exe就启动了redis了,启动后会在进程里面看到reids。
1.读写分离配置
redis的读写分离需要修改配置文件,把解压的文件复制了一份。两份文件是一样的,分别命名为MasterRedis-2.8.19(主redis服务),SlaveRedis-2.8.19(从redis服务)。redis默认绑定的是6379端口,
我们保持主服务配置不变,修改从服务配置。
- 修改从服务绑定端口(修改时可以直接搜索port关键字)
- 修改从服务对应的主服务地址(修改时可以直接搜索slaveof关键字)
- 配置文件修改完成以后,分别启动主服务和从服务
从服务启动以后,主服务会发送一条同步的sync命令,同步从服务器的缓存数据。
五种数据类型使用
服务搭建好以后可以使用.net版本redis操作类库ServiceStack.Redis来操作redis,本文会用到以下三个dll。
初始化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
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));
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
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 + ","));
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操作的帮助类,用到了PooledRedisClientManager连接池来获取RedisClient,同时用到了读写分离的概念,可以直接拿来使用
使用很简单,几行代码
//会往主服务里面写入
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,
});
}
配置文件
总结
1.其实php,java等多种语言都能使用redis,在我接触的项目中见到使用redis做为消息队列和缓存组件,当然它的功能远不止于此。后面的文章将详细介绍redis的几个使用案例。
2.可以使用redis desktop manager管理工具查看服务器缓存中的数据
本篇文章用到的资源打包下载地址:redis_demo
相关推荐
"tomcat-redis-session-manager"是一个解决方案,它将用户的Session信息存储在Redis缓存服务器中,从而实现跨服务器的Session共享。本篇文章将深入探讨这个话题,包括它的原理、配置以及实际应用。 **一、Session...
`tomcat-redis-session-manager`就是这样一款解决方案,它将Tomcat的session管理与Redis相结合,实现了跨服务器的session共享。 首先,让我们理解`tomcat-redis-session-manager`的核心概念。这是一个开源项目,它...
总结来说,这个压缩包提供了一套完整的解决方案,包括了连接Redis的Jedis客户端、对象池管理、Tomcat的Session管理器以及配置文件,使得开发者可以轻松地在Tomcat集群中实现Session共享,提升系统的可扩展性和容错性...
在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高并发、分布式环境中可能会面临效率低下和数据一致性的问题。为了解决这些问题...
它的高速读写能力使其成为存储session的理想选择,尤其是在分布式环境中,可以轻松实现session共享。 **知识点三:tomcat-redis-session-manager** tomcat-redis-session-manager是专门为Tomcat设计的一个插件,它...
Tomcat Cluster Redis Session Manager是一个插件,它允许Tomcat集群中的各个节点共享和同步Session信息,确保用户在集群中的任何服务器上都能保持登录状态。 集成Tomcat集群和Redis Session Manager的过程大致如下...
`tomcat-redis-session-manager-2.0.0`就是为了解决这个问题而诞生的一个开源项目,它将Tomcat容器中的Session数据存储到Redis缓存系统中,实现了跨服务器的Session共享。 Redis是一种高性能的键值数据库,特别适合...
【标题】"tomcat-redis-session-manager jar包"是一个用于集成Redis进行Session管理的Java库,特别设计用于Apache Tomcat服务器。这个库使得在多台Tomcat服务器之间共享和协调用户的Session数据成为可能,从而提高了...
标题中的"tomcat-redis-session-manager-1.2-tomcat-7-java-7"表明这是一个针对Tomcat服务器,用于管理session的组件,版本为1.2,适配Tomcat 7和Java 7环境。这个组件的主要作用是将Tomcat的会话管理功能与Redis...
首先,让我们来看看如何在Tomcat 8中实现基于Redis的Session共享。`context.xml`文件是Tomcat配置的一部分,它定义了每个Web应用的上下文环境。在这个场景下,我们需要在`context.xml`中配置一个名为`Manager`的元素...
tomcat-redis-session-manager-2.0.0.jar包,不用自己打包了,tomcat共享session到redis中,解决分布式应用的状态问题。
这个组件使得Web应用程序可以利用Redis分布式缓存系统来存储和管理用户的会话数据,从而实现高可用性和可扩展性。 描述中提到的 "commons-pool-1.6.jar" 是Apache Commons Pool库的1.6版本,这是一个对象池服务,...
总之,“redis-session-manager-tomcat6共享包”为Tomcat 6提供了一种高效、可靠的session共享方案,通过修复null值session问题,提高了系统的稳定性和兼容性,是现代Web应用分布式架构中的重要组件。
通过这种方式,Tomcat 8和Redis结合,能够实现高效的Session共享,确保用户在分布式环境中的会话一致性。注意,使用Redis存储Session时,需要注意数据的持久化策略以及Redis的内存管理,避免内存溢出。同时,考虑到...
1. **分布式支持**:通过 Redis 实现跨服务器的 session 共享,适合分布式应用环境。 2. **高并发**:Redis 的高性能特性使得大量并发请求下的 session 管理变得高效。 3. **数据持久化**:Redis 提供的数据持久化...
总结来说,使用`tomcat-redis-session-manager`可以在Tomcat 8及以上版本中实现Redis为基础的Session共享,通过引入必要的jar包,并正确配置Tomcat,可以确保在分布式环境中的用户会话一致性。这种方案在应对高并发...
总的来说,"redis-session-manager-redis-session-manager-2.0.3.zip"提供的工具是Web开发者在Windows环境中实现高效、可靠的会话管理的一个强大选择。正确配置和使用Redis Session Manager,能够优化应用性能,提高...
Redis Session Manager是一款基于Redis数据库实现的会话管理工具,主要用于在分布式系统中高效、安全地存储和管理Web应用的用户会话数据。标题中的"redis-session-manager-redis-session-manager-2.0.2.zip"表明这是...
标题中的“-redis-session-manager-master.zip”表明...总的来说,这个工具包是提高分布式系统session管理效率和一致性的有效手段,通过结合Tomcat和Redis的优势,解决了集群环境下session共享的难题,提升了用户体验。
Redis Session Manager是一款基于Redis数据库实现的会话管理工具,它主要负责存储和管理Web应用程序中的用户会话数据。Redis是一个高性能、开源、内存中的键值数据存储系统,常被用作数据库、缓存和消息代理。这个...