写日志思路

1.由于日志文件只有一个,可能多个客户端同时写入,所以不能直接写文件,需要缓存
2.思路:客户端写文件时往一个队里对象中写入,另外在程序启动时,开启一个线程池,不断
       的在这个队列中出队日志内容,让后往日志文件中写入
3.这样即解决了冲突问题,也可以让客户端实时响应


Redis:
高级队列堆栈的功能

需要的DLL
using ServiceStack.Common.Extensions;using ServiceStack.Redis;using ServiceStack.Redis.Generic;using ServiceStack.Text;using ServiceStack.Redis.Support;


声明一个客户端对象:
protected RedisClient Redis = new RedisClient("127.0.0.1", 6379);//redis服务IP和端口


一 .基本KEY/VALUE键值对操作:
1. 添加/获取: 
List<string> storeMembers =new List<string>();storeMembers.ForEach(x => Redis.AddItemToList("additemtolist", x));注:也可直接使用AddRangeToList方法将一组数据装入如:Redis.AddRangeToList("addarrangetolist", storeMembers);


2. 获取数据:
var members = Redis.GetAllItemsFromList("additemtolist");members.ForEach(s => Response.Write("<br/>additemtolist :"+ s));


3. 获取指定索引位置数据:
var item = Redis.GetItemFromList("addarrangetolist", 2);
4. 移除:
var list = Redis.Lists["addarrangetolist"];list.Clear();//清空list.Remove("two");//移除指定键值list.RemoveAt(2);//移除指定索引位置数据


二.存储对象:
publicclass UserInfo{publiclong Id { set; get; }publicstring UserName { get; set; }publicint Age { get; set; }}


1.通常方式(底层使用json序列化):
[url=][/url]
Redis.Set<UserInfo>("userinfo", new UserInfo() { UserName ="李四", Age =45 });UserInfo userinfo = Redis.Get<UserInfo>("userinfo");//注:当然上面方式也适合于基本类型,如:Redis.Set<int>("my_age", 12);//或Redis.Set("my_age", 12);int age = Redis.Get<int>("my_age");[url=][/url]




2.object序列化方式存储:
var ser =new ObjectSerializer(); //位于namespace ServiceStack.Redis.Support;bool result = Redis.Set<byte[]>("userinfo", ser.Serialize(new UserInfo() { UserName ="张三", Age =12 }));UserInfo userinfo = ser.Deserialize(Redis.Get<byte[]>("userinfo")) as UserInfo;//也支持列表Redis.Set<byte[]>("userinfolist_serialize", ser.Serialize(userinfoList));List<UserInfo> userList = ser.Deserialize(Redis.Get<byte[]>("userinfolist_serialize")) as List<UserInfo>;


三.存储表格对象,比如:
[url=][/url]
using (var redisUsers = Redis.GetTypedClient<UserInfo>()){redisUsers.Store(new UserInfo { Id = redisUsers.GetNextSequence(), UserName ="daizhj", Age =12 });redisUsers.Store(new UserInfo { Id = redisUsers.GetNextSequence(), UserName ="daizhenjun", Age =13 });var allUsers = redisUsers.GetAll();//就像操作ado对象一样,可以进行CRUD等操作allUsers.ForEach(s => Response.Write("<br/>user :"+ s.UserName +" age:"+ s.Age));}[url=][/url]




四.使用客户端链接池模式提升链接速度:
[url=][/url]
publicstatic PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts){//支持读写分离,均衡负载returnnew PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig{MaxWritePoolSize =5,//“写”链接池链接数MaxReadPoolSize =5,//“写”链接池链接数AutoStart =true,}); }[url=][/url]




声明链接池对象(这里只使用一个redis服务端):
PooledRedisClientManager prcm = CreateManager(newstring[] { "127.0.0.1:6379" }, newstring[] { "127.0.0.1:6379" });List<UserInfo> userinfoList =new List<UserInfo>();userinfoList.Add(new UserInfo() { UserName ="pool_daizhj", Age =1 });userinfoList.Add(new UserInfo() { UserName ="pool_daizhj1", Age =2 });


从池中获取一个链接:
using (IRedisClient Redis = prcm.GetClient()){ Redis.Set("userinfolist", userinfoList);List<UserInfo> userList = Redis.Get<List<UserInfo>>("userinfolist");}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值