非关系型数据库,存储效率高,高并发、分布式。
MongoDB和Redis都是NoSQL,采用结构型数据存储。
2.5Redis的数据结构:
前言:Redis中存储的数据都为字符串格式的。下面来分别介绍Redis中常用的数据结构。
- string数据结构
太简单了,略过。
- list数据结构
概述: 什么是list ,list是一种数据结构,可以当做队列和栈来使用。
当你从左边添加数据,再从左边取数据,就模拟出栈;当你从右边添加数据,再从左边取数据,就模拟出队列。因此Redis真的很强大,看到栈和队列这样的数据结构,你难道就不激动吗?这样的数据结构太TM好了,能帮我们处理很多棘手的问题。这里我先卖个关子,下面会介绍我在项目中是如何使用Redis解决棘手的问题。
- set集合
和list结构差不多,这里不再啰嗦。
下面就是操作set的一些命令。
- hash数据结构
图中的"user:100"就相当于key,而它所指向的类似于表结构的数据就是value,这样的数据结构有利于存储对象数据。也是非常常用的方法。
强烈推荐: Redis常用命令文档:http://redisdoc.com/ 文档上有详细的操作案例和高级用法。
注意:
redis指令不区分大小写,但是出于规范考虑,应该使用大写
redis中存放的键是区分大小写的.
第三部分:Redis如何使用
3.1C#中如何使用Redis来解决邮箱激活的实效性。
首先思考个问题:为什么要进行邮件激活?激活码该存到哪里?(大家先思考,我不直接说,这样通过下面的例子你会体会的更深。)
原因:用户在注册的时候,虽然正则表达式能检查邮箱的格式是否正确,但是正则检查不了邮箱是否可用,于是让用户进行激活,就能避免用户填写一个不可用的邮箱。
传统方法的代码实现:
1)数据库表的设计:
在用户注册的表中添加一个字段:IsActive用来判断激活的状态。
该表用来存放激活码。
代码实现:
BLL层代码:
View Code
View Code
DAL层代码:
View Code
View Code
UI层代码:
View Code
一般处理程序:
View Code
邮件发送代码:
View Code
好好思考一下这样写的缺陷在哪?不仅有缺陷而且还有安全问题,有哪些安全问题?如果用户量大的话这样设计是否合理?会对什么有压力?如果不合理该如何优化?
首先我们来分析一下:
上面的方法是在用户表的基础上再增加一个字段,用来存激活码。这样合理吗?
由于激活码只用一次,所以在用户表的基础上再增加一个字段会麻烦一下,之前的功能会有影响。那到底该怎么解决比较好?
这时候Redis的好处就非常明显了,key-value数据库,并且还能设置数据的有效时间,很好的解决了上面遇到的问题,只需要改动上面很少的一部分代码就可以实现想要的功能。
代码如下:
View Code
如果到这里真的就OK了吗?大家可以想想为什么我要添加下面的这段代码:
1
2
3
4
5
6
7
8 1
21 //把注册用户信息,放入消息队列。便于另外一个程序来获取消息队列数据,发送邮件
32 using (var client = RedisManager.ClientManager.GetClient())
43 {
54 string info = username + "|" + email;
65 client.EnqueueItemOnList("NewRegUsers", info);
76 }
8