Redis存储用户中心会话数据的问题
设计一个用户中心系统,考虑到会话票据经常读取,想用Redis来存储,目前有两种想法:
Jedis jedis = new Jedis("localhost"); //方案一 HashMap<String,String> userInfo = new HashMap<String,String>(); userInfo.put("uid", "123456"); userInfo.put("user", "MyUserName"); userInfo.put("nick", "MyNickName"); jedis.hmset("TICKET-ABCDEFG", userInfo); //方案二 jedis.set("TICKET-ABCDEFG:uid", "123456"); jedis.set("TICKET-ABCDEFG:user", "MyUserName"); jedis.set("TICKET-ABCDEFG:nick", "MyNickName");请各位大大拍砖指点。想找一个效率高点的优秀点的方法。。谢谢啦。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
方案一最好,方案一也是可以读取指定属性,更新制定属性和删除指定属性的。
Redis的键控件就是一个字典(dict),其实现就是哈希表,在字典中添加、查找一个给定元素,时间复杂度均为O(1)。hmset是操作redis中哈希表(这里叫map吧,以便区别上面的哈希表)的命令,redis中的map采用压缩列表(ziplist)和dict两种编码方式存储(默认是ziplist)。ziplist上的操作理论上比dict时间复杂度要高,但是其节约内存空间。方案二的数据库键空间比方案一大若干倍,更容易引起rehash。方案二在数据量较小的时候理论上执行效率更高。方案一在数据量较大时更节省内存空间,若数据量很大,需要用分布式缓存时,方案一更有优势。
http://www.oschina.net/p/jedis
回复
明白了..谢谢.个人觉得方案一更好点
各有优缺点,方案二可以只按get("TICKET-ABCDEFG:xxx") 读取一条,如果只需要修改其中的一条属性也可以set("TICKET-ABCDEFG:xxx") 操作简单,读取数据量小,但是要TICKET-ABCDEFG下的所有属性值,就需要操作多次,如果属性比较多的时候,操作的次数相应增加,并发性能对应下降,这就是这种方式的缺点; 方案一hmget("TICKET-ABCDEFG")就可以把TICKET-ABCDEFG的所有属性取到一个HashMap中,读取整个属性信息相对方案二较快,但是如修改其中一个值,从新hmset回去的时候要把整个HashMap重新set回去,这就是第一种方式的缺点;
综合考虑,做测试找出最优方案