Redis – First Class

Redis是一个开源、支持网络、基于内存、键值对存储数据库,其灵感来源于Amazon Dynamo,使用ANSI C编写。其开发由VMware主持,并遵循BSD许可证。几个重要特点: 主从复制 内存+磁盘持久化 丰富的数据类型,尤其擅长数组、链表、集合、有序集合和散列表等数据的高速处理。所以说,redis不是简单的key-value服务器,而是一个数据结构服务器。

1. 安装redis

直接通过yum repo安装:yum install redis?另一种方法是通过编译安装:

# wget http://download.redis.io/releases/redis-2.8.9.tar.gz# tar xvzf redis-2.8.9.tar.gz# cd redis-2.8.9# make编译完成后,二进制文件将在src目录下生成。/usr/local/bin下也会产生相应的符号链接文件。# ll redis*-rwxr-xr-x 1 root root 4169856 May 13 14:31 redis-benchmark-rwxr-xr-x 1 root root   22177 May 13 14:31 redis-check-aof-rwxr-xr-x 1 root root   45411 May 13 14:31 redis-check-dump-rwxr-xr-x 1 root root 4263055 May 13 14:31 redis-cli-rwxr-xr-x 1 root root 5726447 May 13 14:31 redis-server

1.redis的配置文件——redis.conf

其中关键的选项如下:# 服务器进程是否作为守护进程,在后台运行(default – no)# 当 Redis 以守护进程的方式运行的时候,Redis 默认会把 pid 文件放在/var/run/redis.pid,你可以配置到其他地址。# 当 在同一主机运行多个 redis 服务时,需要指定不同的 pid 文件和端口daemonsize yespidfile /var/run/redis.pid# set bind option if you want to bind a single interface (127.0.0.1 for local acess only)# if the bind option is not specified, all the interfaces will listen for incoming connectionsbind 127.0.0.1 port 6379# close the connection after a client is idle for N seconds ( 0 to disable, default for 300)timeout 0# save # 在sec秒内至少有change次变更时候写入硬盘# 默认值:save 900 1save 300 10save 60 10000

#设置数据库的个数,可以使用 SELECT 命令来切换数据库。默认使用的数据库是 0databases 16

# dir数据快照写入的目录# dbfilename 数据快照的文件名dir ./dbfilename dump.rdb#在保存数据快照时,是否进行压缩(默认yes)rdbcompression yes

#使用复制的时候,master redis的主机名和端口号# slaveof 127.0.0.1 6378#指定与主数据库连接时需要的密码验证# masterauth

# 配置 log 文件地址,默认打印在命令行终端的窗口上logfile stdoutloglevel verbose

# 限制同时连接的客户数量。当连接数超过这个值时,redis 将不再接收其他连接请求,客户端尝试连接时将收到 error 信息maxclients 128

#设置redis能够使用的最大内存。当内存满了的时候,如果还接收到set命令,redis将先尝试剔除设置过expire信息的key,而不管该key的过期时间还没有到达。#在删除时,将按照过期时间进行删除,最早将要被过期的key将最先被删除。如果带有expire信息的key都删光了,那么将返回错误。#这样,redis将不再接收写请求,只接收get请求。maxmemory的设置比较适合于把redis当作于类似memcached 的缓存来使用maxmemory

# 默认情况下,redis 会在后台异步的把数据快照到磁盘,但是该备份是非常耗时的,而且写快照文件的操作不能很频繁,# 如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。# 所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式——开 启append only 模式之后,# redis 会把所接收到的每一次写操作请求都追加到appendonly.aof 文件中(类似于mysql binlog/Oracle online redo log),当redis重新启动时,会从该文件恢复出之前的状态。# 但是这样会造成 appendonly.aof 文件过大,所以redis还支持了BGREWRITEAOF 指令,对appendonly.aof进行重新整理appendonly no#设置对 appendonly.aof 文件进行同步的频率。always 表示每次有写操作都进行同步,everysec 表示对写操作进行累积,每秒同步一次。# appendfsync alwaysappendfsync everysec# appendfsync no

#是否开启虚拟内存支持。因为 redis 是一个内存数据库,而且当内存满的时候,无法接收新的写请求,所以在redis2.0中,提供了虚拟内存的支持。#但是需要注意的是,redis中,所有的key都会放在内存中,在内存不够时,只会把value 值放入交换区。#这样保证了虽然使用虚拟内存,但性能基本不受影响,同时,你需要注意的是你要把vm-max-memory设置到足够来放下你的所有的keyvm-enabled no# vm-enabled yes#设置虚拟内存的交换文件路径vm-swap-file /tmp/redis.swap#这里设置开启虚拟内存之后,redis将使用的最大物理内存的大小。默认为0,redis将把他所有的能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。#在生产环境下,需要根据实际情况设置该值,最好不要使用默认的 0vm-max-memory 0#设置虚拟内存的页大小,如果你的 value 值比较大,比如说你要在 value 中放置博客、新闻之类的所有文章内容,就设大一点,如果要放置的都是很小的内容,那就设小一点vm-page-size 32#设置交换文件的总的 page 数量,需要注意的是,page table信息会放在物理内存中,每8个page 就会占据RAM中的 1 个 byte。#总的虚拟内存大小 = vm-page-size * vm-pagesvm-pages 134217728#设置 VM IO 同时使用的线程数量。vm-max-threads 4

#hash 数据类型中包含超过指定元素个数并且最大的元素当没有超过临界时,hash 将以zipmap(又称为 small hash大大减少内存使用)来存储,这里可以设置这两个临界值hash-max-zipmap-entries 512hash-max-zipmap-value 64#hash整理,redis 将在每 100 毫秒时使用 1 毫秒的 CPU 时间来对 redis 的 hash 表进行重新 hash,可以降低内存的使用。#当你的使用场景中,有非常严格的实时性需要,不能够接受 Redis 时不时的对请求有 2 毫秒的延迟的话,把这项配置为 no。#如果没有这么严格的实时性要求,可以设置为 yes,以便能够尽可能快的释放内存activerehashing yes

2. 使用redis

(1). 启动服务器配置文件主要修改了daemonize yesdir /redismaxmemory 4294967296启动redis-server

redis-server /etc/redis.conf

查看一下TCP监听:

# netstat -tlnp | grep 6379tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      27121/redis-server  tcp        0      0 :::6379                     :::*                        LISTEN      27121/redis-server

(2). 简单的set和get下面使用telnet直接登录6379端口。

# telnet localhost 6379select 1                                     --选择数据库1set name debugo                    --key为name,value为debugo+OKget name$6debugoset address 'Chaoyang District'+OKget address$17Chaoyang Districtsetex hello 5 world                --设置expire为5 seconds+OKget hello$5worldget hello                                --5秒后超时,返回-1--INCR 命令将value字符串值解析成整型,增一,最后将结果保存为新的字符串值,类似的命令有INCRBY, DECR and DECRBY。set data1 10+OKdecrby data1 5:5get data1$15incr data1:6get data1$16

关于redis数据类型的介绍,推荐 十五分钟介绍 Redis 数据结构,下面的描述转自这篇文章。关于Redis的Key值:Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。关于key的几条规则:太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。最好坚持一种模式。例如:”object-type:id:field”就是个不错的主意,像这样”user:1000:password”。我喜欢对多单词的字段名中加上一个点,就像这样:”comment:1234:reply.to”。

(3). 测试链表(list)链表是一个简单的数据结构类型,常见的应用场景是聊天系统的信息队列。简单的插入三个元素bar, foo, bingo,形成这样一个链表结构:–LPUSH 表头 –末尾 RPUSH——->| bar |——->| foo |——->| bingo |<——-

lpush data foo                    --从表头插入foo:1lpush data bar                    --从表头插入bar:2rpush data bingo                --在末尾插入bingo:3lrange data 0 -1            --从链表头到链表结尾(左->右)*3$3bar$3foo$5bingodel data                            --删除链表:1

(4). 有向集合有序集合和集合类似,只是加入了“索引键”(score)这一信息。这里的例子是以这些hacker们的生日为score来输出排序。

zadd hackers 1940 "Alan Kay"                    :1zadd hackers 1953 "Richard Stallman" :1zadd hackers 1965 "Yukihiro Matsumoto":1zadd hackers 1916 "Claude Shannon" :1zadd hackers 1969 "Linus Torvalds":1zadd hackers 1912 "Alan Turing" :1zrange hackers 0 -1                            --正向排序输出*6Alan TuringClaude ShannonAlan KayRichard StallmanYukihiro MatsumotoLinus Torvaldszrevrange hackers 0 -1                        --反向排序输出*6Linus TorvaldsYukihiro MatsumotoRichard StallmanAlan KayClaude ShannonAlan Turingzrangebyscore hackers -inf 1950        --找到1950年之前的hackers(负无穷到1950年之间)*3Alan TuringClaude ShannonAlan Kayzrangebyscore hackers 1950 inf         --同理,1950到正无穷之间出生的hackers。*3Richard StallmanYukihiro MatsumotoLinus Torvaldsszremrangebyscore hackers 1940 1960    --删除1940-1960这个区间的hacker:2zrange hackers 0 -1*4Alan TuringClaude ShannonYukihiro MatsumotoLinus Torvalds

3. 主从复制

Redis内置主从复制功能,只需要设置slaveof localhost 6379。这里我们在一台服务器上启用多个daemon来测试主从复制:cp /etc/redis.conf /etc/redis_slave.conf更改配置文件,作下面修改(避免使用的文件和master daemon冲突):

vim /etc/redis_slave.conflogfile /var/redis/redis-slave.logport 6380slaveof 127.0.0.1 6379pidfile /var/run/redis-slave.piddir /redis-slave启动redis slave daemon并检查监听redis-server /etc/redis_slave.conf# netstat -tnlp | grep 6380tcp        0      0 0.0.0.0:6380                0.0.0.0:*                   LISTEN      29510/redis-server  tcp        0      0 :::6380                     :::*                        LISTEN      29510/redis-server

通过redis提供的客户端工具redis-cli连接到master/slave daemon上获取数据

[root@debugo ~]# redis-cli -p 6379 set data redisOK[root@debugo ~]# redis-cli -p 6380 get data"redis"

^^

Redis – First Class

相关文章:

你感兴趣的文章:

标签云: