|
在上一篇文章中,我主要向大家介绍了利用servicestack连接redis以及一些redis的基本数据类型,传送门
本文中,我将通过一个具体应用场景为大家介绍redis中的并发和原子操作
其中用到的redis命令,请大家去redis官网查询http://www.redis.io/commands
一 一个投票统计的应用场景
假设我要做一个实时统计投票数的应用,这个投票总共有A、B、C、D四个选项,因为是一个高并发的场景,所以我准备用redis来存储投票数
我们首先利用redis-cli模拟这个过程,打开命令终端,新建一个hash类型的key,叫做TicketCount, 编号为1,然后我们将选项作为其field值,
redis命令如下:
然后我们利用servicestack模拟投票场景,代码如下:
1 static void Main(string[] args)
2 {
3
4 RedisClient[] redisCli = new RedisClient[8]{
5 new RedisClient("192.168.101.165", 6379),
6 new RedisClient("192.168.101.165", 6379),
7 new RedisClient("192.168.101.165", 6379),
8 new RedisClient("192.168.101.165", 6379),
9 new RedisClient("192.168.101.165", 6379),
10 new RedisClient("192.168.101.165", 6379),
11 new RedisClient("192.168.101.165", 6379),
12 new RedisClient("192.168.101.165", 6379)
13 };
14 ThreadPool.QueueUserWorkItem(o =>
15 {
16 testTicketCount(redisCli[0], "A");
17 });
18 ThreadPool.QueueUserWorkItem(o =>
19 {
20 testTicketCount(redisCli[1], "A");
21 });
22 ThreadPool.QueueUserWorkItem(o =>
23 {
24 testTicketCount(redisCli[2], "B");
25 });
26 ThreadPool.QueueUserWorkItem(o =>
27 {
28 testTicketCount(redisCli[3], "B");
29 });
30 ThreadPool.QueueUserWorkItem(o =>
31 {
32 testTicketCount(redisCli[4], "C");
33 });
34 ThreadPool.QueueUserWorkItem(o =>
35 {
36 testTicketCount(redisCli[5], "C");
37 });
38 ThreadPool.QueueUserWorkItem(o =>
39 {
40 testTicketCount(redisCli[6], "D");
41 });
42 ThreadPool.QueueUserWorkItem(o =>
43 {
44 testTicketCount(redisCli[7], "D");
45 });
46
47 Console.Read();
48 }
49 ///
50 /// 对某个选项进行投票,投票数加1
51 ///
52 ///
53 ///
54 internal static void testTicketCount(IRedisClient rediscli, string field)
55 {
56 int k = 0;
57 for (int i = 0; i |
|
|