Redis

1:redis安装

$ wget http://redis.googlecode.com/files/redis-2.4.11.tar.gz
$ tar xzf redis-2.4.11.tar.gz
$ cd redis-2.4.11
$ make
开启服务
[root@linux52 ~]# '/soft/redis-2.4.11/src/redis-server'

2:驱动

  http://redis.io/clients

3:配置

View Code
daemonize:是否以后台daemon方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
启动方式:redis-server 配置文件

4:文件功能

View Code
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况 

5:支持的数据类型

View Code
Strings
Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字。使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还提供了下面一些操作:

获取字符串长度
往字符串append内容
设置和获取字符串的某一段内容
设置及获取字符串的某一位(bit)
批量设置一系列字符串的内容
Hashs
在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。

Lists
Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

Sets
Sets 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

Sorted Sets
和Sets相比,Sorted Sets增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的Sorted Sets,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

Pub/Sub
Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

Transactions
谁说NoSQL都不支持事务,虽然Redis的Transactions提供的并不是严格的ACID的事务(比如一串用EXEC提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个Transactions还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。Redis还提供了一个Watch功能,你可以对一个key进行Watch,然后再执行Transactions,在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执行。

6:相关文章

Redis内存存储结构分析

Redis内存使用优化与存储

Redis资料汇总专题

7:调用

添加获取,redis可以在添加的时候指定该key-value的过期时间。过期时间为绝对时间

View Code
                RedisClient Redis = new RedisClient("10.53.132.52");
                Redis.SetEntry("key", "aa", new TimeSpan(0, 0, 5));
                Redis.AppendToValue("key", "World!");
                Redis.GetSubstring("key", fromIndex, toIndex);
                var valueBytes = Redis.Get("key");
                Encoding.UTF8.GetString(valueBytes);

Dictionary

View Code
                var keysMap = new Dictionary<string, string>();
                20.Times(i => keysMap.Add("k" + i, "v" + i));
                Redis.SetAll(keysMap);
                var map = Redis.GetAll<string>(keysMap.Keys);
                var mapKeys = Redis.GetValues(keysMap.Keys.ToList<string>());

Ilist

View Code
                IList<string> strList = Redis.Lists["list"];
                var intValues = new List<int> { 2, 4, 6, 8 };
                intValues.ForEach(x => strList.Add(x.ToString()));
                List<string> strListValues = strList.ToList();
                List<int> toIntValues = strListValues.ConvertAll(x => int.Parse(x));
                strList.Clear();

redis队列模型

View Code
                int numMessages = 6;
                IList<string> messages0 = new List<string>();
                IList<string> messages1 = new List<string>();
                string[] patients = new[] {"patient0", "patient1"};
                for (int i = 0; i < numMessages; ++i)
                {
                    messages0.Add(String.Format("{0}_message{1}", patients[0], i));
                    messages1.Add(String.Format("{0}_message{1}", patients[1], i));
                }
                using (var queue = new RedisSequentialWorkQueue<string>(10, 10, "10.53.132.52", 6379, 1))
                {

                    for (int i = 0; i < numMessages; ++i)
                    {
                        queue.Enqueue(patients[0], messages0[i]);
                        queue.Enqueue(patients[1], messages1[i]);
                    }

                    for (int i = 0; i < numMessages / 2; ++i)
                    {
                        queue.Update(patients[0], i, messages0[i] + "UPDATE");
                    }
                    queue.PrepareNextWorkItem();
                    var batch = queue.Dequeue(numMessages / 2);
                    // check that half of patient[0] messages are returned
                    for (int i = 0; i < numMessages / 2; ++i)
                    {
                        //Assert.AreEqual(batch.DequeueItems[i], messages0[i] + "UPDATE");
                        Console.WriteLine(batch.DequeueItems[i]);
                    }
                    
                }

redis发布订阅模型

View Code 
posted @ 2012-04-25 17:19  李占卫  阅读(1848)  评论(1编辑  收藏  举报