[求助]Redis能用来存储List数组吗?

OVERSET2 2017-03-27 11:45:54
Redis能存储像public List<User> listUser这样的变量吗?
能否举个例子? 谢谢
...全文
2217 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-04-06
  • 打赏
  • 举报
回复
给你粘贴一段代码参考一下

        /// <summary>
        /// 将ListModel添加到缓存层
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="lt">list</param>
        /// <returns></returns>
        public bool SetListModel<T>(string key, List<T> lt) where T : class
        {
            try
            {
                string value = JsonConvert.SerializeObject(lt);
                if (rc2.Client.Set(key, value) == "OK")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }
  • 打赏
  • 举报
回复
比如说所谓的 SocketAsyncEventArgs,就算是你“保存了”,将来恢复一遍(假设不报错的话),你只能看到几个简单的 string、int 属性之类的被恢复了,那么内部机制是绝对不可能重新像演电影似地把当初创建对象的过程再给演一遍的,就算能演一遍(一个小小的对象中记录了几百G的操作日志,可以重演)也是另一个重建的对象了,而不是保存了什么原来的对象。
  • 打赏
  • 举报
回复
引用 14 楼 OVERSET2 的回复:
额,就是乱想的 连接对象集合一般是怎么保存?
所谓“保存”,就是保存和恢复数据,只能针对简单的数值操作。一个有着复杂的内部机制的对象,序列了也不可能将来恢复内部机制只能恢复简单的值。
  • 打赏
  • 举报
回复
引用 13 楼 OVERSET2 的回复:
[quote=引用 11 楼 shingoscar 的回复:] 那要么是你没保存,要么就是你删除了 还是说你要固执的认为“肯定是系统给偷偷扔掉的”
额 还有个比较纠结的,问下大神哈,就是socket对象比较多,用Dictionary还是list?哪个效率高、性能好?[/quote] 超过3000个你就使用字典吧。如果所谓的“比较多”只有不过千百个而已,你自己测试一下,实际上在内存里的foreach查找跟字典查找,效率差别可以忽略。
by_封爱 版主 2017-03-28
  • 打赏
  • 举报
回复

 public static Dictionary<string, Socket> device = new Dictionary<string, Socket>();
其中key是socket的ip+port. 反正我现在是这样保存...
正怒月神 2017-03-27
  • 打赏
  • 举报
回复
引用 4 楼 OVERSET2 的回复:
版主能不能存储 Socket对象,这样 public SocketAsyncEventArgs socketAsync { get; set; }
你试试吧。这个我也没尝试过
  • 打赏
  • 举报
回复
SocketAsyncEventArgs 应该不能序列化。你可以设计一个类似上面 UserInfo 那样的基本的“失血模型”实体,来自定义表示。
OVERSET2 2017-03-27
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
测试代码
public static RedisClient client = new RedisClient();
        static void Main(string[] args)
        {
            List<UserInfo> u = new List<UserInfo>() { 
                new UserInfo(){Name="1",Age=1},
                new UserInfo(){Name="2",Age=11},
                new UserInfo(){Name="3",Age=12},
            };
            
            //存储
            client.Set<List<UserInfo>>("test", u);
            //获取
            var q = client.Get<List<UserInfo>>("test");

            foreach (var item in q)
            {
                Console.WriteLine(item.Name);
            }


            Console.ReadLine();
        }

        public class UserInfo
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
版主能不能存储 Socket对象,这样 public SocketAsyncEventArgs socketAsync { get; set; }
正怒月神 2017-03-27
  • 打赏
  • 举报
回复
测试代码
public static RedisClient client = new RedisClient();
        static void Main(string[] args)
        {
            List<UserInfo> u = new List<UserInfo>() { 
                new UserInfo(){Name="1",Age=1},
                new UserInfo(){Name="2",Age=11},
                new UserInfo(){Name="3",Age=12},
            };
            
            //存储
            client.Set<List<UserInfo>>("test", u);
            //获取
            var q = client.Get<List<UserInfo>>("test");

            foreach (var item in q)
            {
                Console.WriteLine(item.Name);
            }


            Console.ReadLine();
        }

        public class UserInfo
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
OVERSET2 2017-03-27
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
可以,前提是你这个User不能是一个复杂的主外键关联对象
USER存储着SocketAsyncEventArgs,可以吗?
正怒月神 2017-03-27
  • 打赏
  • 举报
回复
可以,前提是你这个User不能是一个复杂的主外键关联对象
Poopaye 2017-03-27
  • 打赏
  • 举报
回复
引用 13 楼 OVERSET2 的回复:
[quote=引用 11 楼 shingoscar 的回复:] 那要么是你没保存,要么就是你删除了 还是说你要固执的认为“肯定是系统给偷偷扔掉的”
额 还有个比较纠结的,问下大神哈,就是socket对象比较多,用Dictionary还是list?哪个效率高、性能好?[/quote] Dictionary
OVERSET2 2017-03-27
  • 打赏
  • 举报
回复
引用 12 楼 diaodiaop 的回复:
socket保存起来没用的.. 难道下次你从数据库取然后send吗? 开玩笑...
额,就是乱想的 连接对象集合一般是怎么保存?
OVERSET2 2017-03-27
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
那要么是你没保存,要么就是你删除了 还是说你要固执的认为“肯定是系统给偷偷扔掉的”
额 还有个比较纠结的,问下大神哈,就是socket对象比较多,用Dictionary还是list?哪个效率高、性能好?
by_封爱 版主 2017-03-27
  • 打赏
  • 举报
回复
socket保存起来没用的.. 难道下次你从数据库取然后send吗? 开玩笑...
Poopaye 2017-03-27
  • 打赏
  • 举报
回复
那要么是你没保存,要么就是你删除了 还是说你要固执的认为“肯定是系统给偷偷扔掉的”
OVERSET2 2017-03-27
  • 打赏
  • 举报
回复
引用 9 楼 shingoscar 的回复:
socket连接的对象[/color]是什么鬼? 如果是指socket对象 这东西出了程序的范围,肯定被系统给回收了。不同程序需要单独创建、连接 如果你是在程序内部保存但是丢失了,那就检查代码哪里删掉的。
不好意思啊 我指的就是socket对象,保存IP和端口没有用吧?我这个是和移动设备连接的,IP和端口拿到了也没用··· 内部检查过了,没有删除过,还是有一些socket对象丢失···
Poopaye 2017-03-27
  • 打赏
  • 举报
回复
引用 8 楼 OVERSET2 的回复:
[quote=引用 7 楼 shingoscar 的回复:] 搞清楚究竟你想存什么 socket出了程序范围完全没有意义,你存下来又有什么用?
我想用来保存socket连接的对象的, 直接定义一个全局变量public List<User> listUser;来存放socket连接的对象,但是总是丢失,我就想是不是可以放在Redis里来保存。。。[/quote] 你可以保存IP和端口,socket连接的对象是什么鬼? 如果是指socket对象 这东西出了程序的范围,肯定被系统给回收了。不同程序需要单独创建、连接 如果你是在程序内部保存但是丢失了,那就检查代码哪里删掉的。
OVERSET2 2017-03-27
  • 打赏
  • 举报
回复
引用 7 楼 shingoscar 的回复:
搞清楚究竟你想存什么 socket出了程序范围完全没有意义,你存下来又有什么用?
我想用来保存socket连接的对象的, 直接定义一个全局变量public List<User> listUser;来存放socket连接的对象,但是总是丢失,我就想是不是可以放在Redis里来保存。。。
Poopaye 2017-03-27
  • 打赏
  • 举报
回复
搞清楚究竟你想存什么 socket出了程序范围完全没有意义,你存下来又有什么用?

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧